Beispiel #1
0
 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();
 }
Beispiel #2
0
        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());
        }
Beispiel #3
0
 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;
     }
 }
Beispiel #4
0
        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;
        }
Beispiel #5
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;
}