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 datastore | 5 package datastore |
6 | 6 |
7 import ( | 7 import ( |
8 "fmt" | 8 "fmt" |
9 "io" | 9 "io" |
10 "io/ioutil" | 10 "io/ioutil" |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 } | 140 } |
141 | 141 |
142 case !hasErr && !hasCursorCB: | 142 case !hasErr && !hasCursorCB: |
143 cb = func(v reflect.Value, _ CursorCB) error { | 143 cb = func(v reflect.Value, _ CursorCB) error { |
144 cbVal.Call([]reflect.Value{v}) | 144 cbVal.Call([]reflect.Value{v}) |
145 return nil | 145 return nil |
146 } | 146 } |
147 } | 147 } |
148 | 148 |
149 if isKey { | 149 if isKey { |
150 » » return d.RawInterface.Run(fq, func(k *Key, _ PropertyMap, gc Cur
sorCB) error { | 150 » » err = d.RawInterface.Run(fq, func(k *Key, _ PropertyMap, gc Curs
orCB) error { |
151 return cb(reflect.ValueOf(k), gc) | 151 return cb(reflect.ValueOf(k), gc) |
152 }) | 152 }) |
| 153 } else { |
| 154 err = d.RawInterface.Run(fq, func(k *Key, pm PropertyMap, gc Cur
sorCB) error { |
| 155 itm := mat.newElem() |
| 156 if err := mat.setPM(itm, pm); err != nil { |
| 157 return err |
| 158 } |
| 159 mat.setKey(itm, k) |
| 160 return cb(itm, gc) |
| 161 }) |
153 } | 162 } |
154 | 163 » return filterStop(err) |
155 » return d.RawInterface.Run(fq, func(k *Key, pm PropertyMap, gc CursorCB)
error { | |
156 » » itm := mat.newElem() | |
157 » » if err := mat.setPM(itm, pm); err != nil { | |
158 » » » return err | |
159 » » } | |
160 » » mat.setKey(itm, k) | |
161 » » return cb(itm, gc) | |
162 » }) | |
163 } | 164 } |
164 | 165 |
165 func (d *datastoreImpl) Count(q *Query) (int64, error) { | 166 func (d *datastoreImpl) Count(q *Query) (int64, error) { |
166 fq, err := q.Finalize() | 167 fq, err := q.Finalize() |
167 if err != nil { | 168 if err != nil { |
168 return 0, err | 169 return 0, err |
169 } | 170 } |
170 return d.RawInterface.Count(fq) | 171 return d.RawInterface.Count(fq) |
171 } | 172 } |
172 | 173 |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
242 if t.Elem().Kind() != reflect.Struct { | 243 if t.Elem().Kind() != reflect.Struct { |
243 return errors.New("does not point to a struct") | 244 return errors.New("does not point to a struct") |
244 } | 245 } |
245 return nil | 246 return nil |
246 } | 247 } |
247 | 248 |
248 func (d *datastoreImpl) ExistsMulti(keys []*Key) (BoolList, error) { | 249 func (d *datastoreImpl) ExistsMulti(keys []*Key) (BoolList, error) { |
249 lme := errors.NewLazyMultiError(len(keys)) | 250 lme := errors.NewLazyMultiError(len(keys)) |
250 ret := make(BoolList, len(keys)) | 251 ret := make(BoolList, len(keys)) |
251 i := 0 | 252 i := 0 |
252 » err := d.RawInterface.GetMulti(keys, nil, func(_ PropertyMap, err error)
error { | 253 » err := filterStop(d.RawInterface.GetMulti(keys, nil, func(_ PropertyMap,
err error) error { |
253 if err == nil { | 254 if err == nil { |
254 ret[i] = true | 255 ret[i] = true |
255 } else if err != ErrNoSuchEntity { | 256 } else if err != ErrNoSuchEntity { |
256 lme.Assign(i, err) | 257 lme.Assign(i, err) |
257 } | 258 } |
258 i++ | 259 i++ |
259 return nil | 260 return nil |
260 » }) | 261 » })) |
261 if err != nil { | 262 if err != nil { |
262 return ret, err | 263 return ret, err |
263 } | 264 } |
264 return ret, lme.Get() | 265 return ret, lme.Get() |
265 } | 266 } |
266 | 267 |
267 func (d *datastoreImpl) Exists(k *Key) (bool, error) { | 268 func (d *datastoreImpl) Exists(k *Key) (bool, error) { |
268 ret, err := d.ExistsMulti([]*Key{k}) | 269 ret, err := d.ExistsMulti([]*Key{k}) |
269 return ret[0], errors.SingleError(err) | 270 return ret[0], errors.SingleError(err) |
270 } | 271 } |
(...skipping 21 matching lines...) Expand all Loading... |
292 mat := parseMultiArg(slice.Type()) | 293 mat := parseMultiArg(slice.Type()) |
293 | 294 |
294 keys, pms, err := mat.GetKeysPMs(d.aid, d.ns, slice, true) | 295 keys, pms, err := mat.GetKeysPMs(d.aid, d.ns, slice, true) |
295 if err != nil { | 296 if err != nil { |
296 return err | 297 return err |
297 } | 298 } |
298 | 299 |
299 lme := errors.NewLazyMultiError(len(keys)) | 300 lme := errors.NewLazyMultiError(len(keys)) |
300 i := 0 | 301 i := 0 |
301 meta := NewMultiMetaGetter(pms) | 302 meta := NewMultiMetaGetter(pms) |
302 » err = d.RawInterface.GetMulti(keys, meta, func(pm PropertyMap, err error
) error { | 303 » err = filterStop(d.RawInterface.GetMulti(keys, meta, func(pm PropertyMap
, err error) error { |
303 if !lme.Assign(i, err) { | 304 if !lme.Assign(i, err) { |
304 lme.Assign(i, mat.setPM(slice.Index(i), pm)) | 305 lme.Assign(i, mat.setPM(slice.Index(i), pm)) |
305 } | 306 } |
306 i++ | 307 i++ |
307 return nil | 308 return nil |
308 » }) | 309 » })) |
309 | 310 |
310 if err == nil { | 311 if err == nil { |
311 err = lme.Get() | 312 err = lme.Get() |
312 } | 313 } |
313 return err | 314 return err |
314 } | 315 } |
315 | 316 |
316 func (d *datastoreImpl) PutMulti(src interface{}) error { | 317 func (d *datastoreImpl) PutMulti(src interface{}) error { |
317 slice := reflect.ValueOf(src) | 318 slice := reflect.ValueOf(src) |
318 mat := parseMultiArg(slice.Type()) | 319 mat := parseMultiArg(slice.Type()) |
319 | 320 |
320 keys, vals, err := mat.GetKeysPMs(d.aid, d.ns, slice, false) | 321 keys, vals, err := mat.GetKeysPMs(d.aid, d.ns, slice, false) |
321 if err != nil { | 322 if err != nil { |
322 return err | 323 return err |
323 } | 324 } |
324 | 325 |
325 lme := errors.NewLazyMultiError(len(keys)) | 326 lme := errors.NewLazyMultiError(len(keys)) |
326 i := 0 | 327 i := 0 |
327 » err = d.RawInterface.PutMulti(keys, vals, func(key *Key, err error) erro
r { | 328 » err = filterStop(d.RawInterface.PutMulti(keys, vals, func(key *Key, err
error) error { |
328 if !lme.Assign(i, err) && key != keys[i] { | 329 if !lme.Assign(i, err) && key != keys[i] { |
329 mat.setKey(slice.Index(i), key) | 330 mat.setKey(slice.Index(i), key) |
330 } | 331 } |
331 i++ | 332 i++ |
332 return nil | 333 return nil |
333 » }) | 334 » })) |
334 | 335 |
335 if err == nil { | 336 if err == nil { |
336 err = lme.Get() | 337 err = lme.Get() |
337 } | 338 } |
338 return err | 339 return err |
339 } | 340 } |
340 | 341 |
341 func (d *datastoreImpl) DeleteMulti(keys []*Key) (err error) { | 342 func (d *datastoreImpl) DeleteMulti(keys []*Key) (err error) { |
342 lme := errors.NewLazyMultiError(len(keys)) | 343 lme := errors.NewLazyMultiError(len(keys)) |
343 i := 0 | 344 i := 0 |
344 » extErr := d.RawInterface.DeleteMulti(keys, func(internalErr error) error
{ | 345 » extErr := filterStop(d.RawInterface.DeleteMulti(keys, func(internalErr e
rror) error { |
345 lme.Assign(i, internalErr) | 346 lme.Assign(i, internalErr) |
346 i++ | 347 i++ |
347 return nil | 348 return nil |
348 » }) | 349 » })) |
349 err = lme.Get() | 350 err = lme.Get() |
350 if err == nil { | 351 if err == nil { |
351 err = extErr | 352 err = extErr |
352 } | 353 } |
353 return | 354 return |
354 } | 355 } |
355 | 356 |
356 func (d *datastoreImpl) Raw() RawInterface { | 357 func (d *datastoreImpl) Raw() RawInterface { |
357 return d.RawInterface | 358 return d.RawInterface |
358 } | 359 } |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
432 } | 433 } |
433 } | 434 } |
434 | 435 |
435 if isRoot(currentDir) { | 436 if isRoot(currentDir) { |
436 return nil, fmt.Errorf("datastore: failed to find index
YAML file") | 437 return nil, fmt.Errorf("datastore: failed to find index
YAML file") |
437 } | 438 } |
438 | 439 |
439 currentDir = filepath.Dir(currentDir) | 440 currentDir = filepath.Dir(currentDir) |
440 } | 441 } |
441 } | 442 } |
| 443 |
| 444 func filterStop(err error) error { |
| 445 if err == Stop { |
| 446 err = nil |
| 447 } |
| 448 return err |
| 449 } |
OLD | NEW |