private static bool TryFindSmallValueMergingTwoSections(Transaction tx, TreeIterator it, int num, StreamBitArray current, long currentSectionId, out long?result) { result = -1; var currentRange = current.GetEndRangeCount(); if (currentRange == 0) { return(false); } var nextSectionId = currentSectionId + 1; var nextId = new Slice(EndianBitConverter.Big.GetBytes(nextSectionId)); var read = tx.State.FreeSpaceRoot.Read(nextId); if (read == null) { return(false); } var next = new StreamBitArray(read.Reader); var nextRange = num - currentRange; if (next.HasStartRangeCount(nextRange) == false) { return(false); } if (next.SetCount == nextRange) { tx.State.FreeSpaceRoot.Delete(nextId); } else { for (int i = 0; i < nextRange; i++) { next.Set(i, false); } tx.State.FreeSpaceRoot.Add(nextId, next.ToStream()); } if (current.SetCount == currentRange) { tx.State.FreeSpaceRoot.Delete(it.CurrentKey); } else { for (int i = 0; i < currentRange; i++) { current.Set(NumberOfPagesInSection - 1 - i, false); } tx.State.FreeSpaceRoot.Add(nextId, next.ToStream()); } result = currentSectionId * NumberOfPagesInSection + currentRange; return(true); }
private static bool TryFindSmallValueMergingTwoSections(LowLevelTransaction tx, FixedSizeTree freeSpacetree, long currentSectionId, int num, StreamBitArray current, out long?result) { result = -1; var currentEndRange = current.GetEndRangeCount(); if (currentEndRange == 0) { return(false); } var nextSectionId = currentSectionId + 1; var read = freeSpacetree.Read(nextSectionId); if (!read.HasValue) { return(false); } var next = new StreamBitArray(read.CreateReader()); var nextRange = num - currentEndRange; if (next.HasStartRangeCount(nextRange) == false) { return(false); } if (next.SetCount == nextRange) { freeSpacetree.Delete(nextSectionId); } else { for (int i = 0; i < nextRange; i++) { next.Set(i, false); } freeSpacetree.Add(nextSectionId, next.ToSlice(tx.Allocator)); } if (current.SetCount == currentEndRange) { freeSpacetree.Delete(currentSectionId); } else { for (int i = 0; i < currentEndRange; i++) { current.Set(NumberOfPagesInSection - 1 - i, false); } freeSpacetree.Add(currentSectionId, current.ToSlice(tx.Allocator)); } result = currentSectionId * NumberOfPagesInSection + (NumberOfPagesInSection - currentEndRange); return(true); }
private static bool TryFindSmallValueMergingTwoSections(Transaction tx, Slice currentSectionIdSlice, int num, StreamBitArray current, long currentSectionId, out long? result) { result = -1; var currentEndRange = current.GetEndRangeCount(); if (currentEndRange == 0) return false; var nextSectionId = currentSectionId + 1; var nextId = new Slice(EndianBitConverter.Big.GetBytes(nextSectionId)); var read = tx.State.FreeSpaceRoot.Read(nextId); if (read == null) return false; var next = new StreamBitArray(read.Reader); var nextRange = num - currentEndRange; if (next.HasStartRangeCount(nextRange) == false) return false; if (next.SetCount == nextRange) { tx.State.FreeSpaceRoot.Delete(nextId); } else { for (int i = 0; i < nextRange; i++) { next.Set(i, false); } tx.State.FreeSpaceRoot.Add(nextId, next.ToStream()); } if (current.SetCount == currentEndRange) { tx.State.FreeSpaceRoot.Delete(currentSectionIdSlice); } else { for (int i = 0; i < currentEndRange; i++) { current.Set(NumberOfPagesInSection - 1 - i, false); } tx.State.FreeSpaceRoot.Add(currentSectionIdSlice, current.ToStream()); } result = currentSectionId * NumberOfPagesInSection + (NumberOfPagesInSection - currentEndRange); return true; }