示例#1
0
RC RM_FileScan::GetNextRec(RM_Record &rec) {
    if (!bInScan)
        return RM_ERR_NOTINSCAN;
    RC rc;
    RID rid;
    RM_Record tmpRec;
    while (1) {
        //std::cout <<"start next : "<< nowPage <<" "<<nowSlot<<"\n";
        if (bNextPage) {
            //std::cout << "before next page:" << nowPage<<"\n";
            if (PF_ERR_EOF == fileHandle.pfh.GetNextPage(nowPage, nowPH)) {
                bInScan = false;
                return RM_ERR_EOF;
            }
            if (rc = nowPH.GetPageNum(nowPage)) 
                return rc;
            //std::cout << "after next page:" << nowPage<<"\n";
            bNextPage = false;
            nowSlot = -1;
            continue;
        }  

        char *pData;
        if (rc = nowPH.GetData(pData))
            return rc;
        BitMap bitmap;
        if (rc = fileHandle.GetBitMapFromData(pData, bitmap))
            return rc;
        //bitmap.print();
        int nextBit;
        if (RM_ENDOFPAGE == bitmap.GetNextBit(nowSlot, nextBit)) {
            if (rc = fileHandle.pfh.UnpinPage(nowPage))
                return rc;
            bNextPage = true;
            continue;
        }  
        //std::cout << "nextbit: " << nextBit <<"\n";


        nowSlot = nextBit;
        RID rid;
        rid.SetPageNum(nowPage);
        rid.SetSlotNum(nowSlot);

//        std::cout << "find slot: pageNum:"<<nowPage<<"    slotNum:"<<nowSlot<<"\n";

        //std::cout << "recordSize:" << fileHandle.header.recordSize<<"\n";
        //std::cout << "firstFree :" << fileHandle.header.firstFree <<"\n";
        //std::cout << "bitmapOffset :" << fileHandle.header.bitmapOffset <<"\n";
        //std::cout << "bitmapSize : " << fileHandle.header.bitmapSize <<"\n";
        //std::cout << "numRecordsPerPage : " << fileHandle.header.numRecordsPerPage <<"\n";
        //std::cout << "numPages : " << fileHandle.header.numPages <<"\n";
        //std::cout << rid.pageNum <<" "<<rid.slotNum<<"\n";


        if (rc = fileHandle.GetRecordFromData(pData, rid, tmpRec))
            return rc;

        //for (int i = 0; i < fileHandle.header.recordSize; i++) 
        //    std::cout << (int)tmpRec.pData[i] <<" ";
        //std::cout <<"\n";
        
        //std::cout << "recdata: " << (int)tmpRec.pData[3]<<"\n";
        //std::cout << "offset:"<<attrOffset<<" "<<"    len:"<<attrLength<<"  type:"<<attrType<<"\n";
        //std::cout << "compop:"<<this->compOp<<"\n";
        
        char *tmpRecData;
        if (rc = tmpRec.GetData(tmpRecData))
            return rc;
        

        if (this->compOp != NO_OP) {
            bool flag;
            if (this->compOp != IS_OP && this->compOp != IS_NOT_OP && tmpRec.IsNull(attrNumber)) 
                flag = false;
            else
                flag = (* cmp)(tmpRecData + attrOffset, this->value, attrType, attrLength);

            if (flag) { 
                rec = tmpRec;
                break;
            }
        }  else {
            rec = tmpRec; 
            break;
        }
    }
    return 0;
}
示例#2
0
RC QL_Manager::GenColumn(vector<int> *pvGroup, vector<RM_Record> *pvRecord, vector<Column> &columns) {
    RC rc;
    bool flagAllAttr = false;
    if (rmp.nSelAttrs == 1 && (strcmp(rmp.selAttrs[0].attrName, "*") == 0)) {
        flagAllAttr = true;
    }
    if (flagAllAttr) {
        for (int i = 0; i < rmp.nSelRels; i++) {
            vector<SM_ActiveAttr> *vAttr;
            if (rc = db.AllAttributes(rmp.selRels[i], vAttr))
                return rc;
            for (int j = 0; j < vAttr->size(); j++) {
                Column column;
                column.attrLength = (*vAttr)[j].record.attrLength;
                column.attrType   = (*vAttr)[j].record.attrType;
                column.relName = string((*vAttr)[j].record.tableName);
                column.attrName = string((*vAttr)[j].record.attrName);
                int number = (*vAttr)[j].record.number;
                int offset = (*vAttr)[j].record.attrOffset;
                int length = (*vAttr)[j].record.attrLength;
                for (int k = 0; k < pvGroup[i].size(); k++) {
                    int pos = pvGroup[i][k];
                    RM_Record rec = pvRecord[i][pos];
                    if (rec.IsNull(number)) {
                        char *c = new char[4];
                        strcpy(c, "NULL");
                        column.vData.push_back(c);
                    }  
                    else
                    if (column.attrType == INT) {
                        int *p = new int;
                        *p = *(int *)(rec.pData + offset);
                        column.vData.push_back(p);
                    }  
                    else 
                    if (column.attrType == STRING) {
                        char *c = new char[length];
                        memcpy(c, rec.pData + offset, length);
                        column.vData.push_back(c);
                    }
                }
                columns.push_back(column);
            }

        }
    }  else {
        for (int i = 0; i < rmp.nSelAttrs; i++) {
            char *relName = rmp.selAttrs[i].relName;
            char *attrName = rmp.selAttrs[i].attrName;
            if (relName == NULL)
                relName = rmp.selRels[0];
            SM_Attribute *smAttr;
            if (rc = db.FindAttribute(relName, attrName, smAttr))
                return rc;
            Column column;
            column.attrLength = smAttr->attrLength;
            column.attrType = smAttr->attrType;
            column.relName = string(relName);
            column.attrName = string(attrName);
            int offset = smAttr->attrOffset;
            int length = smAttr->attrLength;
            for (int j = 0; j < rmp.nSelRels; j++)
                if (strcmp(relName, rmp.selRels[j]) == 0) {
                    for (int k = 0; k < pvGroup[j].size(); k++) {
                        int pos = pvGroup[j][k];
                        RM_Record rec = pvRecord[j][pos];
                        
                        if (column.attrType == INT) {
                            int *p = new int;
                            *p = *(int *)(rec.pData + offset);
                            column.vData.push_back(p);
                        }  
                        else 
                        if (column.attrType == STRING) {
                            char *c = new char[length];
                            memcpy(c, rec.pData + offset, length);
                            column.vData.push_back(c);
                        }
                    }
                    break;
                }
            columns.push_back(column);
        }
    }
    return 0;
}