OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package memory | 5 package memory |
6 | 6 |
7 import ( | 7 import ( |
8 "bytes" | 8 "bytes" |
9 "sync" | 9 "sync" |
10 | 10 |
| 11 "github.com/luci/gae/service/datastore/serialize" |
11 "github.com/luci/gkvlite" | 12 "github.com/luci/gkvlite" |
12 ) | 13 ) |
13 | 14 |
14 type iterDefinition struct { | 15 type iterDefinition struct { |
15 // The collection to iterate over | 16 // The collection to iterate over |
16 c *memCollection | 17 c *memCollection |
17 | 18 |
18 // The prefix to always assert for every row. A nil prefix matches every
row. | 19 // The prefix to always assert for every row. A nil prefix matches every
row. |
19 prefix []byte | 20 prefix []byte |
20 | 21 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 for { | 58 for { |
58 stop := false | 59 stop := false |
59 restart := false | 60 restart := false |
60 | 61 |
61 for idx, it := range ts { | 62 for idx, it := range ts { |
62 if skip >= 0 && skip == idx { | 63 if skip >= 0 && skip == idx { |
63 continue | 64 continue |
64 } | 65 } |
65 def := defs[idx] | 66 def := defs[idx] |
66 | 67 |
67 » » » it.next(bjoin(def.prefix, suffix), func(itm *gkvlite.Ite
m) { | 68 » » » it.next(serialize.Join(def.prefix, suffix), func(itm *gk
vlite.Item) { |
68 if itm == nil { | 69 if itm == nil { |
69 // we hit the end of an iterator, we're
now done with the whole | 70 // we hit the end of an iterator, we're
now done with the whole |
70 // query. | 71 // query. |
71 stop = true | 72 stop = true |
72 return | 73 return |
73 } | 74 } |
74 | 75 |
75 sfxRO := itm.Key[prefixLens[idx]:] | 76 sfxRO := itm.Key[prefixLens[idx]:] |
76 | 77 |
77 if bytes.Compare(sfxRO, suffix) > 0 { | 78 if bytes.Compare(sfxRO, suffix) > 0 { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 cmdChan := make(chan *cmd) | 121 cmdChan := make(chan *cmd) |
121 ret := &iterator{ | 122 ret := &iterator{ |
122 ch: cmdChan, | 123 ch: cmdChan, |
123 } | 124 } |
124 | 125 |
125 prefix := def.prefix | 126 prefix := def.prefix |
126 collection := def.c | 127 collection := def.c |
127 | 128 |
128 // convert the suffixes from the iterDefinition into full rows for the | 129 // convert the suffixes from the iterDefinition into full rows for the |
129 // underlying storage. | 130 // underlying storage. |
130 » start := bjoin(prefix, def.start) | 131 » start := serialize.Join(prefix, def.start) |
131 | 132 |
132 end := []byte(nil) | 133 end := []byte(nil) |
133 if def.end != nil { | 134 if def.end != nil { |
134 » » end = bjoin(prefix, def.end) | 135 » » end = serialize.Join(prefix, def.end) |
135 } | 136 } |
136 | 137 |
137 go func() { | 138 go func() { |
138 c := (*cmd)(nil) | 139 c := (*cmd)(nil) |
139 ensureCmd := func() bool { | 140 ensureCmd := func() bool { |
140 if c == nil { | 141 if c == nil { |
141 c = <-cmdChan | 142 c = <-cmdChan |
142 if c == nil { // stop() | 143 if c == nil { // stop() |
143 return false | 144 return false |
144 } | 145 } |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 t.ch <- &cmd{targ, func(i *gkvlite.Item) { | 206 t.ch <- &cmd{targ, func(i *gkvlite.Item) { |
206 defer close(waiter) | 207 defer close(waiter) |
207 | 208 |
208 if i == nil { | 209 if i == nil { |
209 t.stop() | 210 t.stop() |
210 } | 211 } |
211 cb(i) | 212 cb(i) |
212 }} | 213 }} |
213 <-waiter | 214 <-waiter |
214 } | 215 } |
OLD | NEW |