Beispiel #1
0
    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;
}