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 "reflect" | 9 "reflect" |
10 | 10 |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
175 func isOkType(v reflect.Type) bool { | 175 func isOkType(v reflect.Type) bool { |
176 if v.Implements(typeOfPropertyLoadSaver) { | 176 if v.Implements(typeOfPropertyLoadSaver) { |
177 return true | 177 return true |
178 } | 178 } |
179 if v.Kind() == reflect.Ptr && v.Elem().Kind() == reflect.Struct { | 179 if v.Kind() == reflect.Ptr && v.Elem().Kind() == reflect.Struct { |
180 return true | 180 return true |
181 } | 181 } |
182 return false | 182 return false |
183 } | 183 } |
184 | 184 |
| 185 func (d *datastoreImpl) ExistsMulti(keys []*Key) ([]bool, error) { |
| 186 lme := errors.NewLazyMultiError(len(keys)) |
| 187 ret := make([]bool, len(keys)) |
| 188 i := 0 |
| 189 err := d.RawInterface.GetMulti(keys, nil, func(_ PropertyMap, err error)
{ |
| 190 if err == nil { |
| 191 ret[i] = true |
| 192 } else if err != ErrNoSuchEntity { |
| 193 lme.Assign(i, err) |
| 194 } |
| 195 i++ |
| 196 }) |
| 197 if err != nil { |
| 198 return ret, err |
| 199 } |
| 200 return ret, lme.Get() |
| 201 } |
| 202 |
| 203 func (d *datastoreImpl) Exists(k *Key) (bool, error) { |
| 204 ret, err := d.ExistsMulti([]*Key{k}) |
| 205 return ret[0], errors.SingleError(err) |
| 206 } |
| 207 |
185 func (d *datastoreImpl) Get(dst interface{}) (err error) { | 208 func (d *datastoreImpl) Get(dst interface{}) (err error) { |
186 if !isOkType(reflect.TypeOf(dst)) { | 209 if !isOkType(reflect.TypeOf(dst)) { |
187 return fmt.Errorf("invalid Get input type: %T", dst) | 210 return fmt.Errorf("invalid Get input type: %T", dst) |
188 } | 211 } |
189 return errors.SingleError(d.GetMulti([]interface{}{dst})) | 212 return errors.SingleError(d.GetMulti([]interface{}{dst})) |
190 } | 213 } |
191 | 214 |
192 func (d *datastoreImpl) Put(src interface{}) (err error) { | 215 func (d *datastoreImpl) Put(src interface{}) (err error) { |
193 if !isOkType(reflect.TypeOf(src)) { | 216 if !isOkType(reflect.TypeOf(src)) { |
194 return fmt.Errorf("invalid Put input type: %T", src) | 217 return fmt.Errorf("invalid Put input type: %T", src) |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 err = lme.Get() | 289 err = lme.Get() |
267 if err == nil { | 290 if err == nil { |
268 err = extErr | 291 err = extErr |
269 } | 292 } |
270 return | 293 return |
271 } | 294 } |
272 | 295 |
273 func (d *datastoreImpl) Raw() RawInterface { | 296 func (d *datastoreImpl) Raw() RawInterface { |
274 return d.RawInterface | 297 return d.RawInterface |
275 } | 298 } |
OLD | NEW |