Ejemplo n.º 1
0
        public override void InsertKey(IFixedLengthKey key, int offset)
        {
            _count++;

            RBNodeBase rbNode;
            BTreeNode  foundNode = SearchBTreeNode(key, offset, out rbNode);

            if (foundNode == null)
            {
                if (_rbTree.Count == 0)
                {
                    BTreeNode newNode = new BTreeNode(key.FactoryMethod(), offset, GetOffsetForNewPage());
                    _rbTree.RB_Insert(newNode);
                    BTreePage page = NewPage(newNode);
                    page.InsertKey(key, offset);
                    page.Write();
                    _cache.CacheObject(newNode.PageOffset, page);
                    return;
                }
                else
                {
                    RBNodeBase rbMinNode = _rbTree.GetMinimumNode();
                    foundNode = (BTreeNode)rbMinNode.Key;
                }
            }
            else
            {
                BTreePage page = PreparePage(foundNode);
                if (page.Full())
                {
                    float     splitFactor  = (_rbTree.GetNext(rbNode) == null) ? 0.875f : 0.5f;
                    BTreePage splittedPage = page.Split(key, offset, GetOffsetForNewPage(), splitFactor);
                    _rbTree.RB_Insert(splittedPage.BTreeNode);
                    splittedPage.Write();
                    _cache.CacheObject(splittedPage.BTreeNode.PageOffset, splittedPage);
                }
                else
                {
                    page.InsertKey(key, offset);
                }
            }
        }
Ejemplo n.º 2
0
        public override bool Open()
        {
            _stream = new FileStream(_fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None, 64);
            _rbTree = new RedBlackTree();
            _reader = new BinaryReader(_stream);
            _writer = new BinaryWriter(_stream);
            _count  = 0;
            _cache  = new ObjectCache(CACHE_SIZE);
            _cache.ObjectRemoved += new ObjectCacheEventHandler(_cache_ObjectRemoved);

            freePages.Clear();
            int numPages = (int)(_stream.Length / PAGE_SIZE);

            //Tracer._Trace( "####################### " + _fileName );
            for (int i = 0; i < numPages; i++)
            {
                long pageOffset = i * PAGE_SIZE;
                _stream.Position = pageOffset;
                int count = _reader.ReadInt32();
                //Tracer._Trace( "####################### count = " + count.ToString() );

                _stream.Position = pageOffset + HEADER_SIZE;
                IFixedLengthKey key    = _factoryKey.FactoryMethod(_reader);
                int             offset = _reader.ReadInt32();
                if (count != 0)
                {
                    _rbTree.RB_Insert(new BTreeNode(key, offset, pageOffset, count));
                }
                else
                {
                    freePages.Push(pageOffset);
                }
                _count += count;
            }
            return(true);
        }