internal void RemoveFromCache(BTreeAlgorithm container) { if (IsFolded) { foreach (var info in foldedDataAddresses) { var addresses = Convert(info); int i = 0; while (i < addresses.Length) { container.Blocks.Remove(addresses[i++]); } } return; } var db = this; while (db != null) { long ID = container.GetId(db); if (ID < 0) break; container.Blocks.Remove(ID); db = db.Next; } }
/// <summary> /// Constructor to use if you want to provide number of slots per node and your comparer object /// </summary> /// <param name="slotLen">Number of slots per node</param> /// <param name="comparer">compare object defining how records will be sorted</param> /// <param name="sortOrder"> </param> public ConcurrentSortedDictionary(byte slotLen = BTreeAlgorithm <TKey, TValue> .DefaultSlotLength, IComparer <TKey> comparer = null, SortOrderType sortOrder = SortOrderType.Ascending) { _btree = new BTreeAlgorithm <TKey, TValue>(slotLen, comparer); _currentItem = new BTreeAlgorithm <TKey, TValue> .TreeNode.ItemAddress(); _sortOrder = sortOrder; }
/// <summary> /// Unfold will recreate this block chain. /// </summary> /// <param name="container"></param> internal void Unfold(BTreeAlgorithm container) { if (foldedDataAddresses == null) return; var db = container.Blocks[NextItemAddress]; if (db != null) { db.ClearData(); var prev2 = this; foreach (var info in foldedDataAddresses) { var addresses = Convert(info); int i2 = 0; if (DataAddress == addresses[0]) i2++; while (i2 < addresses.Length) { var _na = addresses[i2]; db = container.Blocks[_na]; if (db == null) { db = new DataBlock((DataBlockSize)Length); db.DataAddress = _na; } else db.ClearData(); prev2.Next = db; prev2.NextItemAddress = db.DataAddress; prev2 = db; i2++; } } foldedDataAddresses = null; return; } // recreate the buffers if not found in Blocks cache... var prev = this; foreach (var info in foldedDataAddresses) { var addresses = Convert(info); int i = 0; if (DataAddress == addresses[0]) i++; while (i < addresses.Length) { var _na = addresses[i]; db = new DataBlock((DataBlockSize)Length); db.DataAddress = _na; prev.Next = db; prev.NextItemAddress = db.DataAddress; prev = db; i++; } } foldedDataAddresses = null; }