| OLD | NEW |
| 1 // Copyright 2015 The LUCI Authors. All rights reserved. | 1 // Copyright 2015 The LUCI Authors. All rights reserved. |
| 2 // Use of this source code is governed under the Apache License, Version 2.0 | 2 // Use of this source code is governed under the Apache License, Version 2.0 |
| 3 // that can be found in the LICENSE file. | 3 // that can be found in the LICENSE file. |
| 4 | 4 |
| 5 package prod | 5 package prod |
| 6 | 6 |
| 7 import ( | 7 import ( |
| 8 ds "github.com/luci/gae/service/datastore" | 8 ds "github.com/luci/gae/service/datastore" |
| 9 "github.com/luci/luci-go/common/errors" | 9 "github.com/luci/luci-go/common/errors" |
| 10 "golang.org/x/net/context" | 10 "golang.org/x/net/context" |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 50 me, ok := err.(errors.MultiError) | 50 me, ok := err.(errors.MultiError) |
| 51 if ok { | 51 if ok { |
| 52 for i, err := range me { | 52 for i, err := range me { |
| 53 cb(i, err) | 53 cb(i, err) |
| 54 } | 54 } |
| 55 return nil | 55 return nil |
| 56 } | 56 } |
| 57 return err | 57 return err |
| 58 } | 58 } |
| 59 | 59 |
| 60 func (d rdsImpl) AllocateIDs(incomplete *ds.Key, n int) (start int64, err error)
{ | 60 func (d rdsImpl) AllocateIDs(keys []*ds.Key, cb ds.NewKeyCB) error { |
| 61 » par, err := dsF2R(d.aeCtx, incomplete.Parent()) | 61 » // Map keys by entity type. |
| 62 » if err != nil { | 62 » entityMap := make(map[string][]int) |
| 63 » » return | 63 » for i, key := range keys { |
| 64 » » ks := key.String() |
| 65 » » entityMap[ks] = append(entityMap[ks], i) |
| 64 } | 66 } |
| 65 | 67 |
| 66 » start, _, err = datastore.AllocateIDs(d.aeCtx, incomplete.Kind(), par, n
) | 68 » // Allocate a set of IDs for each unique entity type. |
| 67 » return | 69 » errors := errors.NewLazyMultiError(len(keys)) |
| 70 » setErrs := func(idxs []int, err error) { |
| 71 » » for _, idx := range idxs { |
| 72 » » » errors.Assign(idx, err) |
| 73 » » } |
| 74 » } |
| 75 |
| 76 » for _, idxs := range entityMap { |
| 77 » » incomplete := keys[idxs[0]] |
| 78 » » par, err := dsF2R(d.aeCtx, incomplete.Parent()) |
| 79 » » if err != nil { |
| 80 » » » setErrs(idxs, err) |
| 81 » » » continue |
| 82 » » } |
| 83 |
| 84 » » start, _, err := datastore.AllocateIDs(d.aeCtx, incomplete.Kind(
), par, len(idxs)) |
| 85 » » if err != nil { |
| 86 » » » setErrs(idxs, err) |
| 87 » » » continue |
| 88 » » } |
| 89 |
| 90 » » for i, idx := range idxs { |
| 91 » » » keys[idx] = incomplete.WithID("", start+int64(i)) |
| 92 » » } |
| 93 » } |
| 94 |
| 95 » for i, key := range keys { |
| 96 » » if err := errors.GetOne(i); err != nil { |
| 97 » » » cb(nil, err) |
| 98 » » } else { |
| 99 » » » cb(key, nil) |
| 100 » » } |
| 101 » } |
| 102 » return nil |
| 68 } | 103 } |
| 69 | 104 |
| 70 func (d rdsImpl) DeleteMulti(ks []*ds.Key, cb ds.DeleteMultiCB) error { | 105 func (d rdsImpl) DeleteMulti(ks []*ds.Key, cb ds.DeleteMultiCB) error { |
| 71 keys, err := dsMF2R(d.aeCtx, ks) | 106 keys, err := dsMF2R(d.aeCtx, ks) |
| 72 if err == nil { | 107 if err == nil { |
| 73 err = datastore.DeleteMulti(d.aeCtx, keys) | 108 err = datastore.DeleteMulti(d.aeCtx, keys) |
| 74 } | 109 } |
| 75 return idxCallbacker(err, len(ks), func(_ int, err error) { | 110 return idxCallbacker(err, len(ks), func(_ int, err error) { |
| 76 cb(err) | 111 cb(err) |
| 77 }) | 112 }) |
| (...skipping 10 matching lines...) Expand all Loading... |
| 88 } | 123 } |
| 89 return idxCallbacker(err, len(keys), func(idx int, err error) { | 124 return idxCallbacker(err, len(keys), func(idx int, err error) { |
| 90 if pls := vals[idx]; pls != nil { | 125 if pls := vals[idx]; pls != nil { |
| 91 cb(pls.(*typeFilter).pm, err) | 126 cb(pls.(*typeFilter).pm, err) |
| 92 } else { | 127 } else { |
| 93 cb(nil, err) | 128 cb(nil, err) |
| 94 } | 129 } |
| 95 }) | 130 }) |
| 96 } | 131 } |
| 97 | 132 |
| 98 func (d rdsImpl) PutMulti(keys []*ds.Key, vals []ds.PropertyMap, cb ds.PutMultiC
B) error { | 133 func (d rdsImpl) PutMulti(keys []*ds.Key, vals []ds.PropertyMap, cb ds.NewKeyCB)
error { |
| 99 rkeys, err := dsMF2R(d.aeCtx, keys) | 134 rkeys, err := dsMF2R(d.aeCtx, keys) |
| 100 if err == nil { | 135 if err == nil { |
| 101 rvals := make([]datastore.PropertyLoadSaver, len(vals)) | 136 rvals := make([]datastore.PropertyLoadSaver, len(vals)) |
| 102 for i, val := range vals { | 137 for i, val := range vals { |
| 103 rvals[i] = &typeFilter{d.aeCtx, val} | 138 rvals[i] = &typeFilter{d.aeCtx, val} |
| 104 } | 139 } |
| 105 rkeys, err = datastore.PutMulti(d.aeCtx, rkeys, rvals) | 140 rkeys, err = datastore.PutMulti(d.aeCtx, rkeys, rvals) |
| 106 } | 141 } |
| 107 return idxCallbacker(err, len(keys), func(idx int, err error) { | 142 return idxCallbacker(err, len(keys), func(idx int, err error) { |
| 108 k := (*ds.Key)(nil) | 143 k := (*ds.Key)(nil) |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 func (d rdsImpl) RunInTransaction(f func(c context.Context) error, opts *ds.Tran
sactionOptions) error { | 265 func (d rdsImpl) RunInTransaction(f func(c context.Context) error, opts *ds.Tran
sactionOptions) error { |
| 231 ropts := (*datastore.TransactionOptions)(opts) | 266 ropts := (*datastore.TransactionOptions)(opts) |
| 232 return datastore.RunInTransaction(d.aeCtx, func(c context.Context) error
{ | 267 return datastore.RunInTransaction(d.aeCtx, func(c context.Context) error
{ |
| 233 return f(context.WithValue(d.userCtx, prodContextKey, c)) | 268 return f(context.WithValue(d.userCtx, prodContextKey, c)) |
| 234 }, ropts) | 269 }, ropts) |
| 235 } | 270 } |
| 236 | 271 |
| 237 func (d rdsImpl) Testable() ds.Testable { | 272 func (d rdsImpl) Testable() ds.Testable { |
| 238 return nil | 273 return nil |
| 239 } | 274 } |
| OLD | NEW |