public bool TryRemove(T record, int index, out T removedRecord) { _workingBlock = new Block <T>(MaxRecords); _workingBlock.FromByteArray(_file.ReadData(index)); removedRecord = default(T); if (_workingBlock.TryRemoveRecord(record, out removedRecord)) { if (_workingBlock.ValidCount == 0) { _partiallyFullBlocks.Remove(index); _freeBlocks.Add(index); _file.AdjustFileSize(_freeBlocks); } else { if (!_partiallyFullBlocks.Contains(index)) { _partiallyFullBlocks.Add(index); } _file.WriteData(index, _workingBlock.ToByteArray()); } return(true); } return(false); }
private void AdjustFile() { _blockFile.AdjustFileSize(_freeBlocks); }
private bool TryRemoveOverflow(ExternalTrieNode node, T record, out T removedRecord, out bool canDoJoin) { //najskor pozriet do seba ci nemam node //ak nie //nacitat vsetky ostatne (ak mam) //najst a vymazat //skusit utriast removedRecord = default(T); canDoJoin = false; _workingBlock1 = new Block <T>(MaxRecords); _workingBlock1.FromByteArray(_blockFile.ReadData(node.IndexOfBlock)); var listOverflowBlocks = new List <Block <T> >(); var index = _workingBlock1.NextOverflowBlockIndex; if (index == -1) { throw new Exception($"This should not happened, index of block: {node.IndexOfBlock} and should NOT be -1"); } while (index != -1) //nacitam vsetky preplnene { listOverflowBlocks.Add(new Block <T>(MaxRecordsInOverflow)); listOverflowBlocks[listOverflowBlocks.Count - 1].FromByteArray(_overflowFile.ReadData(index)); index = listOverflowBlocks[listOverflowBlocks.Count - 1].NextOverflowBlockIndex; } var currentCount = node.RecordCount; if (_workingBlock1.TryRemoveRecord(record, out removedRecord)) { node.RecordCount--; } else { foreach (var block in listOverflowBlocks) { if (block.TryRemoveRecord(record, out removedRecord)) { node.RecordCount--; break; } } } if (currentCount == node.RecordCount) { return(false); //nepodarilo sa vymazat } if ((MaxRecords + listOverflowBlocks.Count * MaxRecordsInOverflow) - node.RecordCount == MaxRecordsInOverflow) { //ideme utriasat var lastBlock = listOverflowBlocks[listOverflowBlocks.Count - 1]; listOverflowBlocks.RemoveAt(listOverflowBlocks.Count - 1); if (listOverflowBlocks.Count > 0) { _freeBlocksOverflow.Add(listOverflowBlocks[listOverflowBlocks.Count - 1].NextOverflowBlockIndex); listOverflowBlocks[listOverflowBlocks.Count - 1].NextOverflowBlockIndex = -1; } else { _freeBlocksOverflow.Add(_workingBlock1.NextOverflowBlockIndex); _workingBlock1.NextOverflowBlockIndex = -1; } _overflowFile.AdjustFileSize(_freeBlocksOverflow); var helpCounter = 0; foreach (var rec in lastBlock.GetAllRecords()) { if (_workingBlock1.AddRecord(rec)) { helpCounter++; continue; } foreach (var blockInList in listOverflowBlocks) { if (blockInList.AddRecord(rec)) { helpCounter++; break; } } } if (helpCounter != lastBlock.ValidCount) { throw new Exception($"This should not happened, not all blocks were added"); } //mame utrasene mozme zapisat } for (int i = listOverflowBlocks.Count - 1; i > 0; i--) { _overflowFile.WriteData(listOverflowBlocks[i - 1].NextOverflowBlockIndex, listOverflowBlocks[i].ToByteArray()); //kazdeho zapisem podla indexu predchadzajuceho (az na prveho) } if (listOverflowBlocks.Count > 0) { _overflowFile.WriteData(_workingBlock1.NextOverflowBlockIndex, listOverflowBlocks[0].ToByteArray()); } canDoJoin = CanJoinNodes(node, node.RecordCount); if (!canDoJoin) //zapisem povodny blok len ak uz sa nejde s nim hybat { _blockFile.WriteData(node.IndexOfBlock, _workingBlock1.ToByteArray()); } if (node.RecordCount < MaxRecords) { throw new Exception($"This should not happened, record count < _maxrecords during overflow deleting"); } return(true); }