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

Side by Side Diff: service/datastore/datastore.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 unified diff | Download patch
« no previous file with comments | « no previous file | service/datastore/datastore_test.go » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "reflect" 9 "reflect"
10 10
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 return errors.SingleError(d.DeleteMulti([]*Key{key})) 192 return errors.SingleError(d.DeleteMulti([]*Key{key}))
193 } 193 }
194 194
195 func (d *datastoreImpl) GetMulti(dst interface{}) error { 195 func (d *datastoreImpl) GetMulti(dst interface{}) error {
196 slice := reflect.ValueOf(dst) 196 slice := reflect.ValueOf(dst)
197 mat := parseMultiArg(slice.Type()) 197 mat := parseMultiArg(slice.Type())
198 if !mat.valid { 198 if !mat.valid {
199 return fmt.Errorf("invalid GetMulti input type: %T", dst) 199 return fmt.Errorf("invalid GetMulti input type: %T", dst)
200 } 200 }
201 201
202 » keys, pms, err := mat.GetKeysPMs(d.aid, d.ns, slice) 202 » keys, pms, err := mat.GetKeysPMs(d.aid, d.ns, slice, true)
203 if err != nil { 203 if err != nil {
204 return err 204 return err
205 } 205 }
206 206
207 lme := errors.NewLazyMultiError(len(keys)) 207 lme := errors.NewLazyMultiError(len(keys))
208 i := 0 208 i := 0
209 meta := NewMultiMetaGetter(pms) 209 meta := NewMultiMetaGetter(pms)
210 err = d.RawInterface.GetMulti(keys, meta, func(pm PropertyMap, err error ) { 210 err = d.RawInterface.GetMulti(keys, meta, func(pm PropertyMap, err error ) {
211 if !lme.Assign(i, err) { 211 if !lme.Assign(i, err) {
212 lme.Assign(i, mat.setPM(slice.Index(i), pm)) 212 lme.Assign(i, mat.setPM(slice.Index(i), pm))
213 } 213 }
214 i++ 214 i++
215 }) 215 })
216 216
217 if err == nil { 217 if err == nil {
218 err = lme.Get() 218 err = lme.Get()
219 } 219 }
220 return err 220 return err
221 } 221 }
222 222
223 func (d *datastoreImpl) PutMulti(src interface{}) error { 223 func (d *datastoreImpl) PutMulti(src interface{}) error {
224 slice := reflect.ValueOf(src) 224 slice := reflect.ValueOf(src)
225 mat := parseMultiArg(slice.Type()) 225 mat := parseMultiArg(slice.Type())
226 if !mat.valid { 226 if !mat.valid {
227 return fmt.Errorf("invalid PutMulti input type: %T", src) 227 return fmt.Errorf("invalid PutMulti input type: %T", src)
228 } 228 }
229 229
230 » keys, vals, err := mat.GetKeysPMs(d.aid, d.ns, slice) 230 » keys, vals, err := mat.GetKeysPMs(d.aid, d.ns, slice, false)
231 if err != nil { 231 if err != nil {
232 return err 232 return err
233 } 233 }
234 234
235 lme := errors.NewLazyMultiError(len(keys)) 235 lme := errors.NewLazyMultiError(len(keys))
236 i := 0 236 i := 0
237 err = d.RawInterface.PutMulti(keys, vals, func(key *Key, err error) { 237 err = d.RawInterface.PutMulti(keys, vals, func(key *Key, err error) {
238 if key != keys[i] { 238 if key != keys[i] {
239 mat.setKey(slice.Index(i), key) 239 mat.setKey(slice.Index(i), key)
240 } 240 }
(...skipping 17 matching lines...) Expand all
258 err = lme.Get() 258 err = lme.Get()
259 if err == nil { 259 if err == nil {
260 err = extErr 260 err = extErr
261 } 261 }
262 return 262 return
263 } 263 }
264 264
265 func (d *datastoreImpl) Raw() RawInterface { 265 func (d *datastoreImpl) Raw() RawInterface {
266 return d.RawInterface 266 return d.RawInterface
267 } 267 }
OLDNEW
« no previous file with comments | « no previous file | service/datastore/datastore_test.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698