public DbIndexTree(DbColumn index) { if ((Index = index) == null) { throw new ArgumentException($"Column indexer cannot be null or error"); } //load structure try { var pathTree = io.Path.Combine(Index.Table.Database.BinaryPath, $"{Index.Indexer}"); reader = new io.BinaryReader(io.File.OpenRead(pathTree)); var headerBuffer = new byte[PageIndexTreeHeader.Size]; // var read = reader.Read(headerBuffer, 0, headerBuffer.Length); Header = PageIndexTreeHeader.FromArray(headerBuffer); IsUnique = (Header.Flags & Consts.IndexHeaderIsUnique) != 0; IsKey = (Header.Flags & Consts.IndexHeaderIsKey) != 0; IsLeaf = (Header.Flags & Consts.IndexHeaderIsLeaf) != 0; byte keyTypeValue = (byte)Header.Flags; KeyType = (DbColumnType)keyTypeValue; //amount of tree node pages Index.NodePages = 0; if (!IsLeaf) { Root = ReadTreePageStructure(0); } } catch { throw new ArgumentException($"Error processing column indexer {Index.Table.Name}.{Index.Name}"); } }
void SaveBinaryIndex <T>(BTreePageBase <T> rootPage, DbColumn index) where T : IComparable <T> { if (rootPage == null) { return; } var pageCount = rootPage.ChildrenCount; Console.WriteLine($" saving ({pageCount}) page(s)"); //update column tree page count index.NodePages = pageCount; index.Table.Database.Modified = true; string indexfilepath = io.Path.Combine(Database.BinaryPath, $"{index.Indexer}"); //page with items .bin //this where the main info is var indexBinFilePath = indexfilepath + ".bin"; using (var writer = new io.BinaryWriter(io.File.Create(indexBinFilePath))) { var collectionPage = GetNodeItemPages <T>(rootPage).ToList(); //update column item page count index.ItemPages = collectionPage.Count; //MAIN HEADER Int32 pageCollectionCount = collectionPage.Count; //write amount of pages writer.Write(pageCollectionCount); //write index key type Int32 keyType = (int)index.TypeEnum; writer.Write(keyType); //pages //sizeof: pageCollectionCount, keyType var offset = DbGenerator.ItemsPageStart; // 8; foreach (var page in collectionPage) { page.Offset = offset; //save page var buffer = page.ToBuffer(); // offset += buffer.Length; // writer.Write(buffer, 0, buffer.Length); } } //tree page indexer .index //this is a light in-memory tree structure for fast search using (var writer = new io.BinaryWriter(io.File.Create(indexfilepath))) { Int32 valueInt32 = 0; //write Index main Header PageIndexTreeHeader header = new PageIndexTreeHeader(); // header.Value0 = 0; //page count header.PageCount = pageCount; //index.Index header.ColumnIndex = index.Index; //index.Unique //index.Key valueInt32 = (index.Unique ? Consts.IndexHeaderIsUnique : 0) | (index.Key ? Consts.IndexHeaderIsKey : 0) | (rootPage.IsLeaf ? Consts.IndexHeaderIsLeaf : 0); //index.Type //valueInt32 = valueInt32 << 8; valueInt32 |= (byte)index.TypeEnum; header.Flags = valueInt32; //write Header byte[] buffer = header.ToByteArray(); writer.Write(buffer, 0, buffer.Length); //test var bin = Convert.ToString(header.Flags, 2); //write page tree if (!rootPage.IsLeaf) { StoreTreePage <T>(rootPage, writer); } } }