| 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 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 return errors.SingleError(d.DeleteMulti([]Key{key})) | 120 return errors.SingleError(d.DeleteMulti([]Key{key})) |
| 121 } | 121 } |
| 122 | 122 |
| 123 func (d *datastoreImpl) GetMulti(dst interface{}) error { | 123 func (d *datastoreImpl) GetMulti(dst interface{}) error { |
| 124 slice := reflect.ValueOf(dst) | 124 slice := reflect.ValueOf(dst) |
| 125 mat := parseMultiArg(slice.Type()) | 125 mat := parseMultiArg(slice.Type()) |
| 126 if !mat.valid { | 126 if !mat.valid { |
| 127 return fmt.Errorf("invalid GetMulti input type: %T", dst) | 127 return fmt.Errorf("invalid GetMulti input type: %T", dst) |
| 128 } | 128 } |
| 129 | 129 |
| 130 » keys, err := mat.GetKeys(d.NewKey, slice) | 130 » keys, pms, err := mat.GetKeysPMs(d.NewKey, slice) |
| 131 if err != nil { | 131 if err != nil { |
| 132 return err | 132 return err |
| 133 } | 133 } |
| 134 | 134 |
| 135 lme := errors.LazyMultiError{Size: len(keys)} | 135 lme := errors.LazyMultiError{Size: len(keys)} |
| 136 i := 0 | 136 i := 0 |
| 137 » err = d.RawInterface.GetMulti(keys, func(pm PropertyMap, err error) { | 137 » meta := NewMultiMetaGetter(pms) |
| 138 » err = d.RawInterface.GetMulti(keys, meta, func(pm PropertyMap, err error
) { |
| 138 if !lme.Assign(i, err) { | 139 if !lme.Assign(i, err) { |
| 139 lme.Assign(i, mat.setPM(slice.Index(i), pm)) | 140 lme.Assign(i, mat.setPM(slice.Index(i), pm)) |
| 140 } | 141 } |
| 141 i++ | 142 i++ |
| 142 }) | 143 }) |
| 143 | 144 |
| 144 if err == nil { | 145 if err == nil { |
| 145 err = lme.Get() | 146 err = lme.Get() |
| 146 } | 147 } |
| 147 return err | 148 return err |
| 148 } | 149 } |
| 149 | 150 |
| 150 func (d *datastoreImpl) PutMulti(src interface{}) error { | 151 func (d *datastoreImpl) PutMulti(src interface{}) error { |
| 151 slice := reflect.ValueOf(src) | 152 slice := reflect.ValueOf(src) |
| 152 mat := parseMultiArg(slice.Type()) | 153 mat := parseMultiArg(slice.Type()) |
| 153 if !mat.valid { | 154 if !mat.valid { |
| 154 return fmt.Errorf("invalid PutMulti input type: %T", src) | 155 return fmt.Errorf("invalid PutMulti input type: %T", src) |
| 155 } | 156 } |
| 156 | 157 |
| 157 » keys, err := mat.GetKeys(d.NewKey, slice) | 158 » keys, vals, err := mat.GetKeysPMs(d.NewKey, slice) |
| 158 if err != nil { | 159 if err != nil { |
| 159 return err | 160 return err |
| 160 } | 161 } |
| 161 | |
| 162 vals, err := mat.GetPMs(slice) | |
| 163 if err != nil { | |
| 164 return err | |
| 165 } | |
| 166 | 162 |
| 167 lme := errors.LazyMultiError{Size: len(keys)} | 163 lme := errors.LazyMultiError{Size: len(keys)} |
| 168 i := 0 | 164 i := 0 |
| 169 err = d.RawInterface.PutMulti(keys, vals, func(key Key, err error) { | 165 err = d.RawInterface.PutMulti(keys, vals, func(key Key, err error) { |
| 170 if key != keys[i] { | 166 if key != keys[i] { |
| 171 mat.setKey(slice.Index(i), key) | 167 mat.setKey(slice.Index(i), key) |
| 172 } | 168 } |
| 173 lme.Assign(i, err) | 169 lme.Assign(i, err) |
| 174 i++ | 170 i++ |
| 175 }) | 171 }) |
| (...skipping 14 matching lines...) Expand all Loading... |
| 190 err = lme.Get() | 186 err = lme.Get() |
| 191 if err == nil { | 187 if err == nil { |
| 192 err = extErr | 188 err = extErr |
| 193 } | 189 } |
| 194 return | 190 return |
| 195 } | 191 } |
| 196 | 192 |
| 197 func (d *datastoreImpl) Raw() RawInterface { | 193 func (d *datastoreImpl) Raw() RawInterface { |
| 198 return d.RawInterface | 194 return d.RawInterface |
| 199 } | 195 } |
| OLD | NEW |