void remove(size_t idx) { if (idx >= count) throw hsOutOfBoundsException(__FILE__, __LINE__); for (size_t i=idx; i<(count-1); i++) data[i] = data[i+1]; decSize(); }
int RecordManager::deleteRecord(const vector<char>& key, string fileName, int recordSize, int n){ //cout << "deleterecord begin{" << endl; vector<char> nextBlock; vector<char> nextOffset; vector<char> delBlock; vector<char> delOffset; /*vector<char> delEndBlock; vector<char> delEndOffset;*/ vector<char> headRecord; vector<char> lastRecord; vector<char> delRecord; vector<char> delEndRecord; Address head; Address lastAddr; Address delAddr; int attrNum=0; int headSize; if (recordSize < 20) headSize = 20; else headSize = recordSize; head.setAddr(fileName, 0, 0); headRecord = bmanager.read(head, headSize); //找到待删记录的上一条记录 lastAddr = findLastRecord(fileName, key, recordSize,0); if (lastAddr.isNullAddr()){//找不到此记录 //cout << "isnull!" << endl; return 0; } int lastRecordSize = 0; if (lastAddr.isHead()){//如果lastRecord为head 那么recordSize有问题 //cout << "is head!" << endl; lastRecordSize = headSize; lastRecord = headRecord; } else{ lastRecordSize = recordSize; lastRecord = bmanager.read(lastAddr, lastRecordSize); } //printvc(lastRecord); //cout << "lastrecordsize: " << lastRecordSize << endl; //得到待删的记录 setNextAddr(lastRecord, nextBlock, nextOffset, lastRecordSize - 8); delBlock = nextBlock; delOffset = nextOffset; delAddr.setAddr(fileName, char4ToInt(delBlock), char4ToInt(delOffset)); delRecord = bmanager.read(delAddr, recordSize); //printvc(delRecord); if (delRecord.size()>50) attrNum = delRecord[50];//获得此表的attr数,只有在delete table时用到 delEndRecord = delRecord; Address delEndAddr = delAddr; for (int i = 0; i < n - 1; i++){//删除连续的n条 setNextAddr(delEndRecord, nextBlock, nextOffset, recordSize - 8); //delEndBlock = nextBlock; //delEndOffset = nextOffset; delEndAddr.setAddr(fileName, char4ToInt(nextBlock), char4ToInt(nextOffset)); delEndRecord = bmanager.read(delAddr, recordSize); } //将del上一条记录指向delEnd的下一条记录 setNextAddr(delEndRecord, nextBlock, nextOffset, recordSize - 8); if (lastAddr.isHead()){ updateRecordPoint(headRecord, nextBlock, nextOffset, headSize - 8); } else{ updateRecordPoint(lastRecord, nextBlock, nextOffset, lastRecordSize - 8); bmanager.write(lastAddr, lastRecord); } //修改delete链 setNextAddr(headRecord, nextBlock, nextOffset, headSize - 16);//第一条被删记录 updateRecordPoint(delEndRecord, nextBlock, nextOffset, recordSize - 8);//将delEndRecord指向第一条被删记录 bmanager.write(delEndAddr, delEndRecord);//update过的都要写回!! updateRecordPoint(headRecord, delBlock, delOffset, headSize - 16);//head指向delRecord decSize(headRecord, n); bmanager.write(head,headRecord); //cout << "}deleterecord end 1" << endl; return attrNum; }