예제 #1
0
        private IEnumerator <KeyValuePair <Key, Value> > GetEnumerator()
        {
            if (NextPageIndex < 0)
            {
                StopEnumerating = true;
                yield break;
            }

            PageRecord page = ActiveManifest.FindPageForIndex(Level, NextPageIndex++);

            if (page == null)
            {
                StopEnumerating = true;
                yield break;
            }

            var sbt = new SortedBlockTable(Cache, BaseFileName, page.Level, page.Version);

            try {
                foreach (var pair in sbt.EnumerateFromKey(Cache, StartKey))
                {
                    yield return(pair);
                }
            } finally {
                sbt.Close();
            }
        }
예제 #2
0
파일: Manifest.cs 프로젝트: lanicon/razordb
        public void NotifyPageReleased(PageRecord pageRec)
        {
            string path = null;

            path = Config.SortedBlockTableFile(BaseFileName, pageRec.Level, pageRec.Version);
            Helper.DeleteFile(path);
        }
예제 #3
0
파일: Manifest.cs 프로젝트: lanicon/razordb
        // Atomically add page specifications to the manifest
        public ManifestImmutable AddPage(int level, int version, Key firstKey, Key lastKey)
        {
            if (level >= MaxLevels)
            {
                throw new IndexOutOfRangeException();
            }
            var page = new PageRecord(level, version, firstKey, lastKey);

            page.AddRef();
            var m = Clone();

            m._pages[level].Add(page);
            m._pages[level].Sort((x, y) => x.FirstKey.CompareTo(y.FirstKey));
            return(m);
        }
예제 #4
0
파일: Manifest.cs 프로젝트: lanicon/razordb
        internal void ReadManifestContents(BinaryReader reader)
        {
            // read num versions or the razor format at the beginning of the block
            int num_versions = reader.Read7BitEncodedInt();

            if (num_versions == RAZORFORMATSECRET)
            {
                RazorFormatVersion = reader.Read7BitEncodedInt();
                num_versions       = reader.Read7BitEncodedInt();
            }
            else
            {
                RazorFormatVersion = -1; // all unnumbered formats
            }

            for (int i = 0; i < num_versions; i++)
            {
                _versions[i] = reader.Read7BitEncodedInt();
            }
            int num_pages = reader.Read7BitEncodedInt();

            for (int j = 0; j < num_pages; j++)
            {
                int num_page_entries = reader.Read7BitEncodedInt();
                for (int k = 0; k < num_page_entries; k++)
                {
                    int level         = reader.Read7BitEncodedInt();
                    int version       = reader.Read7BitEncodedInt();
                    int num_key_bytes = reader.Read7BitEncodedInt();
                    Key startkey      = Key.FromBytes(reader.ReadBytes(num_key_bytes));
                    num_key_bytes = reader.Read7BitEncodedInt();
                    Key endkey = Key.FromBytes(reader.ReadBytes(num_key_bytes));
                    var page   = new PageRecord(level, version, startkey, endkey);
                    page.AddRef();
                    _pages[j].Add(page);
                }
            }
            for (int k = 0; k < num_pages; k++)
            {
                int num_key_bytes = reader.Read7BitEncodedInt();
                _mergeKeys[k] = Key.FromBytes(reader.ReadBytes(num_key_bytes));
            }
        }
예제 #5
0
파일: Manifest.cs 프로젝트: lanicon/razordb
        public ManifestImmutable NextMergePage(int level, out PageRecord page)
        {
            if (level >= MaxLevels)
            {
                throw new IndexOutOfRangeException();
            }
            var m          = Clone();
            var currentKey = _mergeKeys[level];
            var levelKeys  = _pages[level].Select(key => key.FirstKey).ToList();
            int pageNum    = levelKeys.BinarySearch(currentKey);

            if (pageNum < 0)
            {
                pageNum = ~pageNum - 1;
            }
            pageNum = Math.Max(0, pageNum);

            int nextPage = pageNum >= levelKeys.Count - 1 ? 0 : pageNum + 1;

            m._mergeKeys[level] = _pages[level][nextPage].FirstKey;

            page = _pages[level][pageNum];
            return(m);
        }