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

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

Issue 1291813003: Make LazyMultiError constructed via function (Closed) Base URL: https://github.com/luci/gae.git@master
Patch Set: interface not pointer Created 5 years, 4 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 | « service/datastore/checkfilter.go ('k') | service/datastore/multiarg.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 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 return true 93 return true
94 }) 94 })
95 } 95 }
96 96
97 slice := v.Elem() 97 slice := v.Elem()
98 mat := parseMultiArg(slice.Type()) 98 mat := parseMultiArg(slice.Type())
99 if !mat.valid || mat.newElem == nil { 99 if !mat.valid || mat.newElem == nil {
100 return fmt.Errorf("invalid GetAll input type: %T", dst) 100 return fmt.Errorf("invalid GetAll input type: %T", dst)
101 } 101 }
102 102
103 » lme := errors.LazyMultiError{Size: slice.Len()} 103 » lme := errors.NewLazyMultiError(slice.Len())
104 i := 0 104 i := 0
105 err := d.RawInterface.Run(q, func(k Key, pm PropertyMap, _ CursorCB) boo l { 105 err := d.RawInterface.Run(q, func(k Key, pm PropertyMap, _ CursorCB) boo l {
106 slice.Set(reflect.Append(slice, mat.newElem())) 106 slice.Set(reflect.Append(slice, mat.newElem()))
107 itm := slice.Index(i) 107 itm := slice.Index(i)
108 mat.setKey(itm, k) 108 mat.setKey(itm, k)
109 lme.Assign(i, mat.setPM(itm, pm)) 109 lme.Assign(i, mat.setPM(itm, pm))
110 i++ 110 i++
111 return true 111 return true
112 }) 112 })
113 if err == nil { 113 if err == nil {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
149 mat := parseMultiArg(slice.Type()) 149 mat := parseMultiArg(slice.Type())
150 if !mat.valid { 150 if !mat.valid {
151 return fmt.Errorf("invalid GetMulti input type: %T", dst) 151 return fmt.Errorf("invalid GetMulti input type: %T", dst)
152 } 152 }
153 153
154 keys, pms, err := mat.GetKeysPMs(d.NewKey, slice) 154 keys, pms, err := mat.GetKeysPMs(d.NewKey, slice)
155 if err != nil { 155 if err != nil {
156 return err 156 return err
157 } 157 }
158 158
159 » lme := errors.LazyMultiError{Size: len(keys)} 159 » lme := errors.NewLazyMultiError(len(keys))
160 i := 0 160 i := 0
161 meta := NewMultiMetaGetter(pms) 161 meta := NewMultiMetaGetter(pms)
162 err = d.RawInterface.GetMulti(keys, meta, func(pm PropertyMap, err error ) { 162 err = d.RawInterface.GetMulti(keys, meta, func(pm PropertyMap, err error ) {
163 if !lme.Assign(i, err) { 163 if !lme.Assign(i, err) {
164 lme.Assign(i, mat.setPM(slice.Index(i), pm)) 164 lme.Assign(i, mat.setPM(slice.Index(i), pm))
165 } 165 }
166 i++ 166 i++
167 }) 167 })
168 168
169 if err == nil { 169 if err == nil {
170 err = lme.Get() 170 err = lme.Get()
171 } 171 }
172 return err 172 return err
173 } 173 }
174 174
175 func (d *datastoreImpl) PutMulti(src interface{}) error { 175 func (d *datastoreImpl) PutMulti(src interface{}) error {
176 slice := reflect.ValueOf(src) 176 slice := reflect.ValueOf(src)
177 mat := parseMultiArg(slice.Type()) 177 mat := parseMultiArg(slice.Type())
178 if !mat.valid { 178 if !mat.valid {
179 return fmt.Errorf("invalid PutMulti input type: %T", src) 179 return fmt.Errorf("invalid PutMulti input type: %T", src)
180 } 180 }
181 181
182 keys, vals, err := mat.GetKeysPMs(d.NewKey, slice) 182 keys, vals, err := mat.GetKeysPMs(d.NewKey, slice)
183 if err != nil { 183 if err != nil {
184 return err 184 return err
185 } 185 }
186 186
187 » lme := errors.LazyMultiError{Size: len(keys)} 187 » lme := errors.NewLazyMultiError(len(keys))
188 i := 0 188 i := 0
189 err = d.RawInterface.PutMulti(keys, vals, func(key Key, err error) { 189 err = d.RawInterface.PutMulti(keys, vals, func(key Key, err error) {
190 if key != keys[i] { 190 if key != keys[i] {
191 mat.setKey(slice.Index(i), key) 191 mat.setKey(slice.Index(i), key)
192 } 192 }
193 lme.Assign(i, err) 193 lme.Assign(i, err)
194 i++ 194 i++
195 }) 195 })
196 196
197 if err == nil { 197 if err == nil {
198 err = lme.Get() 198 err = lme.Get()
199 } 199 }
200 return err 200 return err
201 } 201 }
202 202
203 func (d *datastoreImpl) DeleteMulti(keys []Key) (err error) { 203 func (d *datastoreImpl) DeleteMulti(keys []Key) (err error) {
204 » lme := errors.LazyMultiError{Size: len(keys)} 204 » lme := errors.NewLazyMultiError(len(keys))
205 i := 0 205 i := 0
206 extErr := d.RawInterface.DeleteMulti(keys, func(internalErr error) { 206 extErr := d.RawInterface.DeleteMulti(keys, func(internalErr error) {
207 lme.Assign(i, internalErr) 207 lme.Assign(i, internalErr)
208 i++ 208 i++
209 }) 209 })
210 err = lme.Get() 210 err = lme.Get()
211 if err == nil { 211 if err == nil {
212 err = extErr 212 err = extErr
213 } 213 }
214 return 214 return
215 } 215 }
216 216
217 func (d *datastoreImpl) Raw() RawInterface { 217 func (d *datastoreImpl) Raw() RawInterface {
218 return d.RawInterface 218 return d.RawInterface
219 } 219 }
OLDNEW
« no previous file with comments | « service/datastore/checkfilter.go ('k') | service/datastore/multiarg.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698