コード例 #1
0
        public static IEnumerable <KeyValuePair <Key, Value> > EnumerateMergedTablesPreCached(RazorCache cache, string baseFileName, IEnumerable <PageRef> tableSpecs, ExceptionHandling exceptionHandling, Action <string> logger)
        {
            var tables = tableSpecs.Select(pageRef => new SortedBlockTable(cache, baseFileName, pageRef.Level, pageRef.Version)).ToList();

            try {
                foreach (var pair in MergeEnumerator.Merge(tables.Select(t => t.Enumerate().ToList().AsEnumerable()), t => t.Key))
                {
                    yield return(pair);
                }
            } finally {
                tables.ForEach(t => t.Close());
            }
        }
コード例 #2
0
        IEnumerable <KeyValuePair <Key, Value> > InternalEnumerateFromKey(byte[] startingKey)
        {
            if (startingKey == null)
            {
                yield break;
            }

            var enumerators = new List <IEnumerable <KeyValuePair <Key, Value> > > ();
            Key key         = new Key(startingKey, 0);

            var rotatedMemTable = _rotatedJournaledMemTable;                          // Captures a copy of the rotated table if one exists.

            enumerators.Add(_currentJournaledMemTable.EnumerateSnapshotFromKey(key)); // Selects the main MemTable.

            if (rotatedMemTable != null)
            {
                enumerators.Add(rotatedMemTable.EnumerateSnapshotFromKey(key));
            }

            // Checks the files on disk.
            using (var manifestSnapshot = _manifest.GetLatestManifest()) {
                List <SortedBlockTable> tables = new List <SortedBlockTable> ();
                try {
                    for (int i = 0; i < manifestSnapshot.NumLevels; i++)
                    {
                        tables.AddRange(manifestSnapshot.GetPagesAtLevel(i).OrderByDescending(page => page.Version).Select(page => new SortedBlockTable(_cache, _manifest.BaseFileName, page.Level, page.Version)));
                    }
                    enumerators.AddRange(tables.Select(t => t.EnumerateFromKey(_cache, key)));
                    foreach (var pair in MergeEnumerator.Merge(enumerators, t => t.Key))
                    {
                        yield return(pair);
                    }
                } finally {
                    tables.ForEach(table => table.Close());                       // Closes all tables.
                }
            }
        }