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

Unified Diff: service/datastore/multiarg.go

Issue 1358743002: Make Get operations only serialize the bare minimum. (Closed) Base URL: https://github.com/luci/gae.git@fix_time
Patch Set: PropertyMap should always copy on save-out functions to avoid external mutation Created 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « service/datastore/datastore_test.go ('k') | service/datastore/pls_impl.go » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: service/datastore/multiarg.go
diff --git a/service/datastore/multiarg.go b/service/datastore/multiarg.go
index 2eec2ec103547445298aa4627cbdf2741342381c..61d18dc14814681789a95cc76b73131e445d6a88 100644
--- a/service/datastore/multiarg.go
+++ b/service/datastore/multiarg.go
@@ -14,22 +14,29 @@ import (
type multiArgType struct {
valid bool
- getKey func(aid, ns string, slot reflect.Value) (*Key, error)
- getPM func(slot reflect.Value) (PropertyMap, error)
- setPM func(slot reflect.Value, pm PropertyMap) error
- setKey func(slot reflect.Value, k *Key)
- newElem func() reflect.Value
+ getKey func(aid, ns string, slot reflect.Value) (*Key, error)
+ getPM func(slot reflect.Value) (PropertyMap, error)
+ getMetaPM func(slot reflect.Value) PropertyMap
+ setPM func(slot reflect.Value, pm PropertyMap) error
+ setKey func(slot reflect.Value, k *Key)
+ newElem func() reflect.Value
}
-func (mat *multiArgType) GetKeysPMs(aid, ns string, slice reflect.Value) ([]*Key, []PropertyMap, error) {
+func (mat *multiArgType) GetKeysPMs(aid, ns string, slice reflect.Value, meta bool) ([]*Key, []PropertyMap, error) {
retKey := make([]*Key, slice.Len())
retPM := make([]PropertyMap, slice.Len())
+ getter := mat.getPM
+ if meta {
+ getter = func(slot reflect.Value) (PropertyMap, error) {
+ return mat.getMetaPM(slot), nil
+ }
+ }
lme := errors.NewLazyMultiError(len(retKey))
for i := range retKey {
key, err := mat.getKey(aid, ns, slice.Index(i))
if !lme.Assign(i, err) {
retKey[i] = key
- pm, err := mat.getPM(slice.Index(i))
+ pm, err := getter(slice.Index(i))
if !lme.Assign(i, err) {
retPM[i] = pm
}
@@ -90,6 +97,9 @@ func multiArgTypePLS(et reflect.Type) multiArgType {
getPM: func(slot reflect.Value) (PropertyMap, error) {
return slot.Addr().Interface().(PropertyLoadSaver).Save(true)
},
+ getMetaPM: func(slot reflect.Value) PropertyMap {
+ return slot.Addr().Interface().(PropertyLoadSaver).GetAllMeta()
+ },
setPM: func(slot reflect.Value, pm PropertyMap) error {
return slot.Addr().Interface().(PropertyLoadSaver).Load(pm)
},
@@ -126,6 +136,9 @@ func multiArgTypePLSPtr(et reflect.Type) multiArgType {
getPM: func(slot reflect.Value) (PropertyMap, error) {
return slot.Interface().(PropertyLoadSaver).Save(true)
},
+ getMetaPM: func(slot reflect.Value) PropertyMap {
+ return slot.Interface().(PropertyLoadSaver).GetAllMeta()
+ },
setPM: func(slot reflect.Value, pm PropertyMap) error {
return slot.Interface().(PropertyLoadSaver).Load(pm)
},
@@ -163,6 +176,9 @@ func multiArgTypeStruct(et reflect.Type) multiArgType {
getPM: func(slot reflect.Value) (PropertyMap, error) {
return toPLS(slot).(PropertyLoadSaver).Save(true)
},
+ getMetaPM: func(slot reflect.Value) PropertyMap {
+ return toPLS(slot).(PropertyLoadSaver).GetAllMeta()
+ },
setPM: func(slot reflect.Value, pm PropertyMap) error {
return toPLS(slot).(PropertyLoadSaver).Load(pm)
},
@@ -193,6 +209,9 @@ func multiArgTypeStructPtr(et reflect.Type) multiArgType {
getPM: func(slot reflect.Value) (PropertyMap, error) {
return toPLS(slot).(PropertyLoadSaver).Save(true)
},
+ getMetaPM: func(slot reflect.Value) PropertyMap {
+ return toPLS(slot).(PropertyLoadSaver).GetAllMeta()
+ },
setPM: func(slot reflect.Value, pm PropertyMap) error {
return toPLS(slot).(PropertyLoadSaver).Load(pm)
},
@@ -217,6 +236,10 @@ func multiArgTypeInterface() multiArgType {
pls := mkPLS(slot.Elem().Interface())
return pls.Save(true)
},
+ getMetaPM: func(slot reflect.Value) PropertyMap {
+ pls := mkPLS(slot.Elem().Interface())
+ return pls.GetAllMeta()
+ },
setPM: func(slot reflect.Value, pm PropertyMap) error {
pls := mkPLS(slot.Elem().Interface())
return pls.Load(pm)
« no previous file with comments | « service/datastore/datastore_test.go ('k') | service/datastore/pls_impl.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698