Beispiel #1
0
 public virtual Index CreateIndex(Type keyType, bool unique)
 {
     lock (this)
     {
         if (!opened)
             throw new StorageError(StorageError.STORAGE_NOT_OPENED);
         Index index;
         if (alternativeBtree)
             index = new AltBtree(keyType, unique);
         else
             index = new Btree(keyType, unique);
         index.AssignOid(this, 0, false);
         return index;
     }
 }
Beispiel #2
0
 private void InitBlock(AltBtree enclosingInstance)
 {
     this.enclosingInstance = enclosingInstance;
 }
Beispiel #3
0
 public BtreeEntryIterator(AltBtree enclosingInstance)
     : base(enclosingInstance)
 {
     InitBlock(enclosingInstance);
 }
Beispiel #4
0
            internal BtreeSelectionIterator(AltBtree enclosingInstance, Key from, Key till, IndexSortOrder order)
            {
                InitBlock(enclosingInstance);
                int i, l, r;

                sp = 0;
                counter = Enclosing_Instance.updateCounter;
                if (Enclosing_Instance.height == 0)
                {
                    return;
                }

                BtreePage page = Enclosing_Instance.root;
                int h = Enclosing_Instance.height;
                this.from = from;
                this.till = till;
                this.order = order;

                pageStack = new BtreePage[h];
                posStack = new int[h];

                if (order == TenderBase.IndexSortOrder.Ascent)
                {
                    if (from == null)
                    {
                        while (--h > 0)
                        {
                            posStack[sp] = 0;
                            pageStack[sp] = page;
                            page = (BtreePage) page.items.Get(0);
                            sp += 1;
                        }

                        posStack[sp] = 0;
                        pageStack[sp] = page;
                        end = page.nItems;
                        sp += 1;
                    }
                    else
                    {
                        while (--h > 0)
                        {
                            pageStack[sp] = page;
                            l = 0;
                            r = page.nItems;
                            while (l < r)
                            {
                                i = (l + r) >> 1;
                                if (page.Compare(from, i) >= from.inclusion)
                                {
                                    l = i + 1;
                                }
                                else
                                {
                                    r = i;
                                }
                            }
                            Assert.That(r == l);
                            posStack[sp] = r;
                            page = (BtreePage) page.items.Get(r);
                            sp += 1;
                        }
                        pageStack[sp] = page;
                        l = 0;
                        r = end = page.nItems;
                        while (l < r)
                        {
                            i = (l + r) >> 1;
                            if (page.Compare(from, i) >= from.inclusion)
                            {
                                l = i + 1;
                            }
                            else
                            {
                                r = i;
                            }
                        }
                        Assert.That(r == l);
                        if (r == end)
                        {
                            sp += 1;
                            GotoNextItem(page, r - 1);
                        }
                        else
                        {
                            posStack[sp++] = r;
                        }
                    }
                    if (sp != 0 && till != null)
                    {
                        page = pageStack[sp - 1];
                        if (-page.Compare(till, posStack[sp - 1]) >= till.inclusion)
                        {
                            sp = 0;
                        }
                    }
                }
                else
                {
                    // descent order
                    if (till == null)
                    {
                        while (--h > 0)
                        {
                            pageStack[sp] = page;
                            posStack[sp] = page.nItems;
                            page = (BtreePage) page.items.Get(page.nItems);
                            sp += 1;
                        }
                        pageStack[sp] = page;
                        posStack[sp++] = page.nItems - 1;
                    }
                    else
                    {
                        while (--h > 0)
                        {
                            pageStack[sp] = page;
                            l = 0;
                            r = page.nItems;
                            while (l < r)
                            {
                                i = (l + r) >> 1;
                                if (page.Compare(till, i) >= 1 - till.inclusion)
                                {
                                    l = i + 1;
                                }
                                else
                                {
                                    r = i;
                                }
                            }
                            Assert.That(r == l);
                            posStack[sp] = r;
                            page = (BtreePage) page.items.Get(r);
                            sp += 1;
                        }
                        pageStack[sp] = page;
                        l = 0;
                        r = page.nItems;
                        while (l < r)
                        {
                            i = (l + r) >> 1;
                            if (page.Compare(till, i) >= 1 - till.inclusion)
                            {
                                l = i + 1;
                            }
                            else
                            {
                                r = i;
                            }
                        }
                        Assert.That(r == l);
                        if (r == 0)
                        {
                            sp += 1;
                            GotoNextItem(page, r);
                        }
                        else
                        {
                            posStack[sp++] = r - 1;
                        }
                    }
                    if (sp != 0 && from != null)
                    {
                        page = pageStack[sp - 1];
                        if (page.Compare(from, posStack[sp - 1]) >= from.inclusion)
                        {
                            sp = 0;
                        }
                    }
                }
            }
Beispiel #5
0
 internal BtreeSelectionEntryIterator(AltBtree enclosingInstance, Key from, Key till, IndexSortOrder order)
     : base(enclosingInstance, from, till, order)
 {
     InitBlock(enclosingInstance);
 }
Beispiel #6
0
 internal BtreeIterator(AltBtree enclosingInstance)
 {
     InitBlock(enclosingInstance);
     BtreePage page = Enclosing_Instance.root;
     int h = Enclosing_Instance.height;
     counter = Enclosing_Instance.updateCounter;
     pageStack = new BtreePage[h];
     posStack = new int[h];
     sp = 0;
     if (h > 0)
     {
         while (--h > 0)
         {
             posStack[sp] = 0;
             pageStack[sp] = page;
             page = (BtreePage) page.items.Get(0);
             sp += 1;
         }
         posStack[sp] = 0;
         pageStack[sp] = page;
         end = page.nItems;
         sp += 1;
     }
 }