public DatastoreResults <T> Query(DatastoreQuery <T> q) { var results = new BlockingCollection <DatastoreResult <T> >(); Task.Factory.StartNew(() => { foreach (var item in new DirectoryInfo(_path).EnumerateFiles("*" + ObjectKeySuffix, SearchOption.AllDirectories) .Select(f => { var path = f.FullName; if (path.StartsWith(_path)) { path = path.Substring(_path.Length); } if (Path.IsPathRooted(path)) { path = path.TrimStart(Path.DirectorySeparatorChar); } var key = new DatastoreKey(path.Substring(0, path.IndexOf(ObjectKeySuffix))); var entry = new DatastoreEntry <T>(key, default(T)); return(new DatastoreResult <T>(entry)); })) { if (!results.TryAdd(item, Timeout.Infinite)) { break; } } }) .ContinueWith(_ => results.CompleteAdding()); return(DatastoreResults <T> .WithCollection(q, results).NaiveQueryApply()); }
public DatastoreResults <byte[]> Query(DatastoreQuery <byte[]> q) { if ((!string.IsNullOrEmpty(q.Prefix) && q.Prefix != "/") || q.QueryFilters.Length > 0 || q.QueryOrders.Length > 0 || q.Limit > 0 || q.Offset > 0 || !q.KeysOnly) { throw new Exception("flatfs only supports listing all keys in random order"); } var reschan = new BlockingCollection <DatastoreResult <byte[]> >(DatastoreQuery <byte[]> .KeysOnlyBufferSize); Task.Run(() => WalkTopLevel(_path, reschan)) .ContinueWith(_ => reschan.CompleteAdding()); return(DatastoreResults <byte[]> .WithCollection(q, reschan)); }