Пример #1
0
        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);
        }
Пример #2
0
 private void AdjustFile()
 {
     _blockFile.AdjustFileSize(_freeBlocks);
 }
Пример #3
0
        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);
        }