File tree 2 files changed +34
-2
lines changed
2 files changed +34
-2
lines changed Original file line number Diff line number Diff line change @@ -258,6 +258,23 @@ func ResultsWithEntries(q Query, res []Entry) Results {
258
258
})
259
259
}
260
260
261
+ // ResultsWithResults returns a Results object from a list of Results and a
262
+ // close error.
263
+ func ResultsWithResults (q Query , res []Result , closeErr error ) Results {
264
+ i := 0
265
+ return ResultsFromIterator (q , Iterator {
266
+ Next : func () (Result , bool ) {
267
+ if i >= len (res ) {
268
+ return Result {}, false
269
+ }
270
+ next := res [i ]
271
+ i ++
272
+ return next , true
273
+ },
274
+ Close : func () error {
275
+ return closeErr
276
+ },
277
+ })
261
278
}
262
279
263
280
func ResultsReplaceQuery (r Results , q Query ) Results {
Original file line number Diff line number Diff line change @@ -61,11 +61,26 @@ func (d *MutexDatastore) Delete(key ds.Key) (err error) {
61
61
return d .child .Delete (key )
62
62
}
63
63
64
- // KeyList implements Datastore.KeyList
64
+ // Query implements Datastore.Query
65
65
func (d * MutexDatastore ) Query (q dsq.Query ) (dsq.Results , error ) {
66
66
d .RLock ()
67
67
defer d .RUnlock ()
68
- return d .child .Query (q )
68
+ results , err := d .child .Query (q )
69
+ if err != nil {
70
+ return nil , err
71
+ }
72
+
73
+ // Apply the entire query while locked. Non-sync datastores may not
74
+ // allow concurrent queries.
75
+ var res []dsq.Result
76
+ for {
77
+ next , ok := results .NextSync ()
78
+ if ! ok {
79
+ break
80
+ }
81
+ res = append (res , next )
82
+ }
83
+ return dsq .ResultsWithResults (q , res , results .Close ()), nil
69
84
}
70
85
71
86
func (d * MutexDatastore ) Batch () (ds.Batch , error ) {
You can’t perform that action at this time.
0 commit comments