Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: service/datastore/multiarg.go

Issue 2302743002: Interface update, per-method Contexts. (Closed)
Patch Set: WithoutTransaction, comments, fixes, cleanup. Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The LUCI Authors. All rights reserved. 1 // Copyright 2015 The LUCI Authors. All rights reserved.
2 // Use of this source code is governed under the Apache License, Version 2.0 2 // Use of this source code is governed under the Apache License, Version 2.0
3 // that can be found in the LICENSE file. 3 // that can be found in the LICENSE file.
4 4
5 package datastore 5 package datastore
6 6
7 import ( 7 import (
8 "fmt" 8 "fmt"
9 "reflect" 9 "reflect"
10 10
(...skipping 23 matching lines...) Expand all
34 func (c metaMultiArgConstraints) keyOperationsOnly() bool { 34 func (c metaMultiArgConstraints) keyOperationsOnly() bool {
35 return c >= mmaKeysOnly 35 return c >= mmaKeysOnly
36 } 36 }
37 37
38 type multiArgType struct { 38 type multiArgType struct {
39 getMGS func(slot reflect.Value) MetaGetterSetter 39 getMGS func(slot reflect.Value) MetaGetterSetter
40 getPLS func(slot reflect.Value) PropertyLoadSaver 40 getPLS func(slot reflect.Value) PropertyLoadSaver
41 newElem func() reflect.Value 41 newElem func() reflect.Value
42 } 42 }
43 43
44 func (mat *multiArgType) getKey(aid, ns string, slot reflect.Value) (*Key, error ) { 44 func (mat *multiArgType) getKey(kc KeyContext, slot reflect.Value) (*Key, error) {
45 » return newKeyObjErr(aid, ns, mat.getMGS(slot)) 45 » return newKeyObjErr(kc, mat.getMGS(slot))
46 } 46 }
47 47
48 func (mat *multiArgType) getPM(slot reflect.Value) (PropertyMap, error) { 48 func (mat *multiArgType) getPM(slot reflect.Value) (PropertyMap, error) {
49 return mat.getPLS(slot).Save(true) 49 return mat.getPLS(slot).Save(true)
50 } 50 }
51 51
52 func (mat *multiArgType) getMetaPM(slot reflect.Value) PropertyMap { 52 func (mat *multiArgType) getMetaPM(slot reflect.Value) PropertyMap {
53 return mat.getMGS(slot).GetAllMeta() 53 return mat.getMGS(slot).GetAllMeta()
54 } 54 }
55 55
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 return mustParseArg(et.Elem(), true) 230 return mustParseArg(et.Elem(), true)
231 } 231 }
232 232
233 func mustParseArg(et reflect.Type, sliceArg bool) *multiArgType { 233 func mustParseArg(et reflect.Type, sliceArg bool) *multiArgType {
234 if mat := parseArg(et, false); mat != nil { 234 if mat := parseArg(et, false); mat != nil {
235 return mat 235 return mat
236 } 236 }
237 panic(fmt.Errorf("invalid argument type: %s is not a PLS or pointer-to-s truct", et)) 237 panic(fmt.Errorf("invalid argument type: %s is not a PLS or pointer-to-s truct", et))
238 } 238 }
239 239
240 func newKeyObjErr(aid, ns string, mgs MetaGetterSetter) (*Key, error) { 240 func newKeyObjErr(kc KeyContext, mgs MetaGetterSetter) (*Key, error) {
241 if key, _ := GetMetaDefault(mgs, "key", nil).(*Key); key != nil { 241 if key, _ := GetMetaDefault(mgs, "key", nil).(*Key); key != nil {
242 return key, nil 242 return key, nil
243 } 243 }
244 244
245 // get kind 245 // get kind
246 kind := GetMetaDefault(mgs, "kind", "").(string) 246 kind := GetMetaDefault(mgs, "kind", "").(string)
247 if kind == "" { 247 if kind == "" {
248 return nil, errors.New("unable to extract $kind") 248 return nil, errors.New("unable to extract $kind")
249 } 249 }
250 250
251 // get id - allow both to be default for default keys 251 // get id - allow both to be default for default keys
252 sid := GetMetaDefault(mgs, "id", "").(string) 252 sid := GetMetaDefault(mgs, "id", "").(string)
253 iid := GetMetaDefault(mgs, "id", 0).(int64) 253 iid := GetMetaDefault(mgs, "id", 0).(int64)
254 254
255 // get parent 255 // get parent
256 par, _ := GetMetaDefault(mgs, "parent", nil).(*Key) 256 par, _ := GetMetaDefault(mgs, "parent", nil).(*Key)
257 257
258 » return NewKey(aid, ns, kind, sid, iid, par), nil 258 » return kc.NewKey(kind, sid, iid, par), nil
259 } 259 }
260 260
261 func isOKSingleType(t reflect.Type, allowKey bool) error { 261 func isOKSingleType(t reflect.Type, allowKey bool) error {
262 switch { 262 switch {
263 case t == nil: 263 case t == nil:
264 return errors.New("no type information") 264 return errors.New("no type information")
265 case t.Implements(typeOfPropertyLoadSaver): 265 case t.Implements(typeOfPropertyLoadSaver):
266 return nil 266 return nil
267 case !allowKey && t == typeOfKey: 267 case !allowKey && t == typeOfKey:
268 return errors.New("not user datatype") 268 return errors.New("not user datatype")
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 return &mma, nil 394 return &mma, nil
395 } 395 }
396 396
397 func (mma *metaMultiArg) iterator(cb metaMultiArgIteratorCallback) *metaMultiArg Iterator { 397 func (mma *metaMultiArg) iterator(cb metaMultiArgIteratorCallback) *metaMultiArg Iterator {
398 return &metaMultiArgIterator{ 398 return &metaMultiArgIterator{
399 metaMultiArg: mma, 399 metaMultiArg: mma,
400 cb: cb, 400 cb: cb,
401 } 401 }
402 } 402 }
403 403
404 // getKeysPMs returns the 404 // getKeysPMs returns the keys and PropertyMap for the supplied argument items.
405 func (mma *metaMultiArg) getKeysPMs(aid, ns string, meta bool) ([]*Key, []Proper tyMap, error) { 405 func (mma *metaMultiArg) getKeysPMs(kc KeyContext, meta bool) ([]*Key, []Propert yMap, error) {
406 var et errorTracker 406 var et errorTracker
407 it := mma.iterator(et.init(mma)) 407 it := mma.iterator(et.init(mma))
408 408
409 // Determine our flattened keys and property maps. 409 // Determine our flattened keys and property maps.
410 retKey := make([]*Key, mma.count) 410 retKey := make([]*Key, mma.count)
411 var retPM []PropertyMap 411 var retPM []PropertyMap
412 if !mma.keysOnly { 412 if !mma.keysOnly {
413 retPM = make([]PropertyMap, mma.count) 413 retPM = make([]PropertyMap, mma.count)
414 } 414 }
415 415
416 for i := 0; i < mma.count; i++ { 416 for i := 0; i < mma.count; i++ {
417 it.next(func(mat *multiArgType, slot reflect.Value) error { 417 it.next(func(mat *multiArgType, slot reflect.Value) error {
418 » » » key, err := mat.getKey(aid, ns, slot) 418 » » » key, err := mat.getKey(kc, slot)
419 if err != nil { 419 if err != nil {
420 return err 420 return err
421 } 421 }
422 retKey[i] = key 422 retKey[i] = key
423 423
424 if !mma.keysOnly { 424 if !mma.keysOnly {
425 var pm PropertyMap 425 var pm PropertyMap
426 if meta { 426 if meta {
427 pm = mat.getMetaPM(slot) 427 pm = mat.getMetaPM(slot)
428 } else { 428 } else {
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
565 default: 565 default:
566 // Pass through to track as MultiError. 566 // Pass through to track as MultiError.
567 bt.errorTracker.trackError(it, err) 567 bt.errorTracker.trackError(it, err)
568 } 568 }
569 } 569 }
570 570
571 func (bt *boolTracker) result() *ExistsResult { 571 func (bt *boolTracker) result() *ExistsResult {
572 bt.res.updateSlices() 572 bt.res.updateSlices()
573 return &bt.res 573 return &bt.res
574 } 574 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698