void DBHandle::dropTable(const char *relName) { /* FileHandle &handle, AttrType attrType, int attrLength, int attrOffset, int nullBitOffset, int nullBitMask, CompOp compOp, void *value) */ std::vector< RID > rids; char name[MAX_NAME_LENGTH]; strcpy(name, relName); rm::FileScan attrScan(attrCatalog_, STRING, MAX_NAME_LENGTH, 0, 0, 0, EQ_OP, name); while (true) { Record &r = attrScan.next(); if (r.rid.pageNum <= 0) break; rids.push_back(r.rid); } for (int i = 0; i < rids.size(); i++) { attrCatalog_.deleteRec(rids[i]); } rids.clear(); rm::FileScan relScan(relCatalog_, STRING, MAX_NAME_LENGTH, 0, 0, 0, EQ_OP, name); while (true) { Record &r = relScan.next(); if (r.rid.pageNum <= 0) break; rids.push_back(r.rid); } for (int i = 0; i < rids.size(); i++) { relCatalog_.deleteRec(rids[i]); } rids.clear(); }
RelInfo DBHandle::getRelInfo(const char *relName) { char name[MAX_NAME_LENGTH]; strcpy(name, relName); rm::FileScan relScan(relCatalog_, STRING, MAX_NAME_LENGTH, 0, 0, 0, EQ_OP, name); Record &r = relScan.next(); return *(RelInfo*)(r.getData()); }
void DBHandle::showTables() { char name[MAX_NAME_LENGTH]; rm::FileScan relScan(relCatalog_, STRING, MAX_NAME_LENGTH, 0, 0, 0, NO_OP, name); while (true) { Record &r = relScan.next(); if (r.rid.pageNum <= 0) break; loadCol(r.getData(), 0, MAX_NAME_LENGTH, STRING, name); printer << name << endl; } }
int DBHandle::findTable(const char *relName) { char name[MAX_NAME_LENGTH]; strcpy(name, relName); rm::FileScan relScan(relCatalog_, STRING, MAX_NAME_LENGTH, 0, 0, 0, EQ_OP, name); while (true) { Record &r = relScan.next(); if (r.rid.pageNum <= 0) break; return 1; } return 0; }
/** * This function scans the relation for tuples * that match the filter predicate and copy these * tuples into a relation named result. * * @param result * @param projCnt * @param projNames[] * @param attrDesc * @param op * @param filter * @param reclen * @return: OK on success * an error code otherwise **/ 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; //used to keep track of how many total tuples are selected int resultTupCnt = 0; // open the result table InsertFileScan resultRel(result, status); if (status != OK) { return status; } //initialize pointer a location of size reclen char outputData[reclen]; //the record to be copied to later Record outputRec; outputRec.data = (void *) outputData; outputRec.length = reclen; // start scan on outer table HeapFileScan relScan(attrDesc->relName, status); if (status != OK) { return status; } status = relScan.startScan(attrDesc->attrOffset, attrDesc->attrLen, (Datatype) attrDesc->attrType, filter, op); if (status != OK) { return status; } // scan outer table RID relRID; Record relRec; while (relScan.scanNext(relRID) == OK) { status = relScan.getRecord(relRec); ASSERT(status == OK); // we have a match, copy data into the output record int outputOffset = 0; for (int i = 0; i < projCnt; i++) { memcpy(outputData + outputOffset, (char *)relRec.data + projNames[i].attrOffset, projNames[i].attrLen); outputOffset += projNames[i].attrLen; } // end copy attrs // add the new record to the output relation RID outRID; status = resultRel.insertRecord(outputRec, outRID); ASSERT(status == OK); resultTupCnt++; } //before returning print out the total number of tuples in this relation printf("selected %d result tuples \n", resultTupCnt); return OK; }