예제 #1
0
        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());
        }
예제 #2
0
        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));
        }