| 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 |