int main(){ RC rc; PF_Manager pfm; IX_Manager ixm(pfm); IX_IndexHandle ixih; IX_IndexScan ixis; if(rc=ixm.CreateIndex("indextest",0,FLOAT,4)) return rc; if(rc=ixm.OpenIndex("indextest",0,ixih)) return rc; for(int i=0;i<10;i++){ Value value((float)i); if(rc=ixih.InsertEntry(value,RID(i/10,i%10))) return rc; } if ((rc = ixm.CloseIndex(ixih))) { return rc; } if ((rc=ixm.OpenIndex("indextest",0,ixih))) { return rc; } // for(int i=0;i<1;i++){ // Value value; // value.type=INT; // value.iData=i; // // if(rc=ixih.DeleteEntry(value,RID(i/10,i%10))) // return rc; // } ixis.OpenScan(ixih,GE,Value((float)5.0)); RID id; while(ixis.GetNextEntry(id)!=IX_EOF){ PageNum pageNum; SlotNum slotNum; id.GetPageNum(pageNum); id.GetSlotNum(slotNum); cout<<pageNum<<"\t"<<slotNum<<endl; } if ((rc = ixis.CloseScan())) { return rc; } if ((rc = ixm.CloseIndex(ixih))) { return rc; } return 0; }
static RC PrintTable(SM_DbHandle &db, const char *tableName) { RC rc; RM_FileHandle *pTable; if ((rc = db.FindTableHandle(tableName, pTable))) return rc; int recordSize = pTable->header.recordSize; vector<SM_ActiveAttr> *attributes; if ((rc = db.AllAttributes(tableName, attributes))) return rc; RM_FileScan allScan; if ((rc = allScan.OpenScan(*pTable, INT, 0, 0, 0, NO_OP, NULL))) return rc; RM_Record record; int recordCount = 0; printf("Table: %s\n", tableName); while ((rc = allScan.GetNextRec(record)) == 0) { RID rid; if ((rc = record.GetRid(rid))) return rc; PageNum pageNum; int slotNum; if ((rc = rid.GetPageNum(pageNum))) return rc; if ((rc = rid.GetSlotNum(slotNum))) return rc; char *data; if ((rc = record.GetData(data))) return rc; printf("RID: (%d,%d)\n", pageNum, slotNum); vector<SM_ActiveAttr>::iterator pAttr; int *pNullBitmap = (int *)(data + recordSize - sizeof(int)); for (pAttr = attributes->begin(); pAttr != attributes->end(); ++pAttr) { SM_Attribute *attr = &pAttr->record; if (*pNullBitmap & (1 << attr->number)) printf(" %s: Null\n", attr->attrName); else if (attr->attrType == INT) printf(" %s: %d\n", attr->attrName, *(int *)(data + attr->attrOffset)); else if (attr->attrType == FLOAT) printf(" %s: %f\n", attr->attrName, *(float *)(data + attr->attrOffset)); else if (attr->attrType == STRING) printf(" %s: %s\n", attr->attrName, data + attr->attrOffset); } printf("\n"); recordCount++; } if (rc != RM_ERR_EOF) return rc; if ((rc = allScan.CloseScan())) return rc; printf("\nTotal %d records.\n", recordCount); return 0; }