Beispiel #1
0
        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}");
            }
        }
Beispiel #2
0
        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);
                }
            }
        }