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; }
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; }