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); } } }
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); }