public unsafe List<Slice> Keys(Tree t, Transaction tx) { var results = new List<Slice>(); using (var it = t.Iterate()) { if (it.Seek(Slice.BeforeAllKeys) == false) return results; do { results.Add(it.CurrentKey); } while (it.MoveNext()); } return results; }
private MultiValuesReport CreateMultiValuesReport(Tree tree) { var multiValues = new MultiValuesReport(); using (var multiTreeIterator = tree.Iterate()) { if (multiTreeIterator.Seek(Slice.BeforeAllKeys)) { do { var currentNode = multiTreeIterator.Current; switch (currentNode->Flags) { case NodeFlags.MultiValuePageRef: { var multiValueTreeHeader = (TreeRootHeader*) ((byte*) currentNode + currentNode->KeySize + Constants.NodeHeaderSize); Debug.Assert(multiValueTreeHeader->Flags == TreeFlags.MultiValue); multiValues.EntriesCount += multiValueTreeHeader->EntriesCount; multiValues.BranchPages += multiValueTreeHeader->BranchPages; multiValues.LeafPages += multiValueTreeHeader->LeafPages; multiValues.PageCount += multiValueTreeHeader->PageCount; break; } case NodeFlags.Data: { var nestedPage = GetNestedMultiValuePage(NodeHeader.DirectAccess(_tx, currentNode), currentNode); multiValues.EntriesCount += nestedPage.NumberOfEntries; break; } case NodeFlags.PageRef: { var overFlowPage = _tx.GetReadOnlyPage(currentNode->PageNumber); var nestedPage = GetNestedMultiValuePage(overFlowPage.Base + Constants.PageHeaderSize, currentNode); multiValues.EntriesCount += nestedPage.NumberOfEntries; break; } default: throw new InvalidEnumArgumentException("currentNode->Flags", (int) currentNode->Flags, typeof (NodeFlags)); } } while (multiTreeIterator.MoveNext()); } } return multiValues; }