const Status ScanSelect(const string & result, const int projCnt, const AttrDesc projNames[], const AttrDesc *attrDesc, const Operator op, const char *filter, const int reclen) { Status status; RID rid; Record outputRec; Record rec; cout << "Doing HeapFileScan Selection using ScanSelect()" << endl; InsertFileScan resultRel(result, status); if(status != OK) return status; char outputData[reclen]; outputRec.data = (void *)outputData; outputRec.length = reclen; // HeapFileScan hfs(attrDesc->relName,status); HeapFileScan hfs(projNames->relName,status); if(status != OK) return status; if(filter == NULL){ if((status = hfs.startScan(0, 0, (Datatype)0, filter, op)) != OK){ return status; } }else{ if((status = hfs.startScan(attrDesc->attrOffset, attrDesc->attrLen, (Datatype)attrDesc->attrType, filter, op)) != OK){ return status; } } while((status = hfs.scanNext(rid)) == OK){ if((status = hfs.getRecord(rec)) != OK) return status; int outputOffset = 0; for( int i = 0; i < projCnt; i++){ memcpy(outputData + outputOffset, (char *)rec.data + projNames[i].attrOffset, projNames[i].attrLen); outputOffset += projNames[i].attrLen; } RID outRID; if((status = resultRel.insertRecord(outputRec,outRID)) != OK){ return status; } } if(status == FILEEOF) return OK; return status; }
void Preprocessor::applyHelpFile() { std::string help_file = file_directory(file_name) + file_extension(file_name) + ".help"; std::ifstream hfs(help_file); if(!hfs.is_open()) return; hfs.close(); std::cout << "Using HELP file: " << help_file << '.' << std::endl; readFile(help_file); analyseSource(); lines.clear(); source.clear(); }
const Status QU_Delete(const string & relation, const string & attrName, const Operator op, const Datatype type, const char *attrValue) { RID rid; Status status; AttrDesc attrInfo; Record record; // Set up a HeapFileScan HeapFileScan hfs(relation, status); if (status != OK) return status; // Get attribute information status = attrCat->getInfo(relation, attrName, attrInfo); if (status != OK) return status; // Start the scan with the attribute info gained above. status = hfs.startScan(attrInfo, attrInfo.attLen, type, attrValue, op); if (status != OK) return status; // Find all tuples in relation while ((status = hfs.scanNext(rid)) == OK) { // get record status = hfs.getRecord(record); if (status != OK) return status; // delete record status = hfs.deleteRecord(); if (status != OK) return status; } return OK; }
const Status ScanSelect(const string & result, const int projCnt, const AttrDesc projNames[], const AttrDesc *attrDesc, const Operator op, const char *filter, const int reclen) { cout << "Doing HeapFileScan Selection using ScanSelect()" << endl; Status s; Record outRec; InsertFileScan ifs(result, s); if(s != OK) return s; char * outData = (char *)malloc(reclen); if(!outData){ return INSUFMEM; } outRec.data = outData; outRec.length = reclen; HeapFileScan hfs(projNames->relName,s); if(s != OK) return s; if(filter == NULL) { if((s = hfs.startScan(0, 0, STRING, NULL, op)) != OK) return s; } else { if((s = hfs.startScan(attrDesc->attrOffset, attrDesc->attrLen, (Datatype)attrDesc->attrType, filter, op)) != OK) return s; } Record rec; RID rid; while((s = hfs.scanNext(rid)) == OK) { s = hfs.getRecord(rec); if(s != OK) return s; int offset = 0; for( int i = 0; i < projCnt; i++) { memcpy(outData+offset, (char *)rec.data+projNames[i].attrOffset, projNames[i].attrLen); offset+=projNames[i].attrLen; } s = ifs.insertRecord(outRec,rid); if(s != OK) return s; } if(s == FILEEOF) s = OK; return s; }