public override void VisitRange(BTreeVisitor <TKey> visitor) { int nextResult = visitor(_records[0].Key, null); int idx = 0; while (idx < _records.Length) { int thisResult = nextResult; if (idx + 1 < _records.Length) { nextResult = visitor(_records[idx + 1].Key, null); } else { nextResult = 1; } if (thisResult > 0) { // This record's key is too big, so no chance further records // will match. return; } if (nextResult >= 0) { // Next record's key isn't too small, so worth looking at children BTreeKeyedNode <TKey> child = ((BTree <TKey>)Tree).GetKeyedNode(_records[idx].ChildId); child.VisitRange(visitor); } idx++; } }
internal BTreeKeyedNode <TKey> GetKeyedNode(uint nodeId) { byte[] nodeData = StreamUtilities.ReadExact(_data, (int)nodeId * _header.NodeSize, _header.NodeSize); BTreeKeyedNode <TKey> node = BTreeNode.ReadNode <TKey>(this, nodeData, 0) as BTreeKeyedNode <TKey>; node.ReadFrom(nodeData, 0); return(node); }
public BTree(IBuffer data) { _data = data; byte[] headerInfo = StreamUtilities.ReadExact(_data, 0, 106); _header = new BTreeHeaderRecord(); _header.ReadFrom(headerInfo, 14); byte[] node0data = StreamUtilities.ReadExact(_data, 0, _header.NodeSize); BTreeHeaderNode node0 = BTreeNode.ReadNode(this, node0data, 0) as BTreeHeaderNode; node0.ReadFrom(node0data, 0); if (node0.HeaderRecord.RootNode != 0) { _rootNode = GetKeyedNode(node0.HeaderRecord.RootNode); } }
public override byte[] FindKey(TKey key) { int nextResult = _records[0].Key.CompareTo(key); int idx = 0; while (idx < _records.Length) { int thisResult = nextResult; if (idx + 1 < _records.Length) { nextResult = _records[idx + 1].Key.CompareTo(key); } else { nextResult = 1; } if (thisResult > 0) { // This record's key is too big, so no chance further records // will match. return(null); } if (nextResult > 0) { // Next record's key is too big, so worth looking at children BTreeKeyedNode <TKey> child = ((BTree <TKey>)Tree).GetKeyedNode(_records[idx].ChildId); return(child.FindKey(key)); } idx++; } return(null); }