void SequentialFile::erase( offset_t offset ) { ASSERT_TRUE(isWritable()); Record* target = offset2record( offset ); ASSERT_TRUE(target->isValid()); offset_t end_offset = offset + target->GetRecordSize(); char* target_end = (char*)target->getEndOfRecord(); for (char* wiper = (char*)target; wiper < target_end; wiper++) { *wiper = 0; } // fix next_write_offset if it is the last record if (end_offset == next_write_offset) { iterator i = at(end_offset); i.GetPrevious(); if (!i.IsValid()) { next_write_offset = 8; } else { next_write_offset = record2offset((Record*)i.GetRecord()->getEndOfRecord()); } } }
void SequentialFile::moveRecord( offset_t at, offset_t to ) { Record* source = offset2record( at ); unsigned int size = source->GetRecordSize(); void* dest = offset2record( to ); memmove( dest, source, size ); if( to > at ) // move right, overlap or no overlap memset( source, 0, (size_t)(to - at) ); else if( to + size < at ) // move left, no overlap memset( source, 0, size ); else // move left, overlap memset( offset2record( to + size ), 0, (size_t)(at - to) ); }