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 21 matching lines...) Expand all Loading... |
32 | 32 |
33 type rdsImpl struct { | 33 type rdsImpl struct { |
34 // userCtx is the context that has the luci/gae services and user object
s in | 34 // userCtx is the context that has the luci/gae services and user object
s in |
35 // it. | 35 // it. |
36 userCtx context.Context | 36 userCtx context.Context |
37 | 37 |
38 // aeCtx is the context with the appengine connection information in it. | 38 // aeCtx is the context with the appengine connection information in it. |
39 aeCtx context.Context | 39 aeCtx context.Context |
40 } | 40 } |
41 | 41 |
42 func idxCallbacker(err error, amt int, cb func(idx int, err error)) error { | 42 func idxCallbacker(err error, amt int, cb func(idx int, err error) error) error
{ |
43 if err == nil { | 43 if err == nil { |
44 for i := 0; i < amt; i++ { | 44 for i := 0; i < amt; i++ { |
45 » » » cb(i, nil) | 45 » » » if err := cb(i, nil); err != nil { |
| 46 » » » » return err |
| 47 » » » } |
46 } | 48 } |
47 return nil | 49 return nil |
48 } | 50 } |
49 err = errors.Fix(err) | 51 err = errors.Fix(err) |
50 me, ok := err.(errors.MultiError) | 52 me, ok := err.(errors.MultiError) |
51 if ok { | 53 if ok { |
52 for i, err := range me { | 54 for i, err := range me { |
53 » » » cb(i, err) | 55 » » » if err := cb(i, err); err != nil { |
| 56 » » » » return err |
| 57 » » » } |
54 } | 58 } |
55 return nil | 59 return nil |
56 } | 60 } |
57 return err | 61 return err |
58 } | 62 } |
59 | 63 |
60 func (d rdsImpl) AllocateIDs(keys []*ds.Key, cb ds.NewKeyCB) error { | 64 func (d rdsImpl) AllocateIDs(keys []*ds.Key, cb ds.NewKeyCB) error { |
61 // Map keys by entity type. | 65 // Map keys by entity type. |
62 entityMap := make(map[string][]int) | 66 entityMap := make(map[string][]int) |
63 for i, key := range keys { | 67 for i, key := range keys { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 } | 104 } |
101 } | 105 } |
102 return nil | 106 return nil |
103 } | 107 } |
104 | 108 |
105 func (d rdsImpl) DeleteMulti(ks []*ds.Key, cb ds.DeleteMultiCB) error { | 109 func (d rdsImpl) DeleteMulti(ks []*ds.Key, cb ds.DeleteMultiCB) error { |
106 keys, err := dsMF2R(d.aeCtx, ks) | 110 keys, err := dsMF2R(d.aeCtx, ks) |
107 if err == nil { | 111 if err == nil { |
108 err = datastore.DeleteMulti(d.aeCtx, keys) | 112 err = datastore.DeleteMulti(d.aeCtx, keys) |
109 } | 113 } |
110 » return idxCallbacker(err, len(ks), func(_ int, err error) { | 114 » return idxCallbacker(err, len(ks), func(_ int, err error) error { |
111 » » cb(err) | 115 » » return cb(err) |
112 }) | 116 }) |
113 } | 117 } |
114 | 118 |
115 func (d rdsImpl) GetMulti(keys []*ds.Key, _meta ds.MultiMetaGetter, cb ds.GetMul
tiCB) error { | 119 func (d rdsImpl) GetMulti(keys []*ds.Key, _meta ds.MultiMetaGetter, cb ds.GetMul
tiCB) error { |
116 vals := make([]datastore.PropertyLoadSaver, len(keys)) | 120 vals := make([]datastore.PropertyLoadSaver, len(keys)) |
117 rkeys, err := dsMF2R(d.aeCtx, keys) | 121 rkeys, err := dsMF2R(d.aeCtx, keys) |
118 if err == nil { | 122 if err == nil { |
119 for i := range keys { | 123 for i := range keys { |
120 vals[i] = &typeFilter{d.aeCtx, ds.PropertyMap{}} | 124 vals[i] = &typeFilter{d.aeCtx, ds.PropertyMap{}} |
121 } | 125 } |
122 err = datastore.GetMulti(d.aeCtx, rkeys, vals) | 126 err = datastore.GetMulti(d.aeCtx, rkeys, vals) |
123 } | 127 } |
124 » return idxCallbacker(err, len(keys), func(idx int, err error) { | 128 » return idxCallbacker(err, len(keys), func(idx int, err error) error { |
125 if pls := vals[idx]; pls != nil { | 129 if pls := vals[idx]; pls != nil { |
126 » » » cb(pls.(*typeFilter).pm, err) | 130 » » » return cb(pls.(*typeFilter).pm, err) |
127 » » } else { | |
128 » » » cb(nil, err) | |
129 } | 131 } |
| 132 return cb(nil, err) |
130 }) | 133 }) |
131 } | 134 } |
132 | 135 |
133 func (d rdsImpl) PutMulti(keys []*ds.Key, vals []ds.PropertyMap, cb ds.NewKeyCB)
error { | 136 func (d rdsImpl) PutMulti(keys []*ds.Key, vals []ds.PropertyMap, cb ds.NewKeyCB)
error { |
134 rkeys, err := dsMF2R(d.aeCtx, keys) | 137 rkeys, err := dsMF2R(d.aeCtx, keys) |
135 if err == nil { | 138 if err == nil { |
136 rvals := make([]datastore.PropertyLoadSaver, len(vals)) | 139 rvals := make([]datastore.PropertyLoadSaver, len(vals)) |
137 for i, val := range vals { | 140 for i, val := range vals { |
138 rvals[i] = &typeFilter{d.aeCtx, val} | 141 rvals[i] = &typeFilter{d.aeCtx, val} |
139 } | 142 } |
140 rkeys, err = datastore.PutMulti(d.aeCtx, rkeys, rvals) | 143 rkeys, err = datastore.PutMulti(d.aeCtx, rkeys, rvals) |
141 } | 144 } |
142 » return idxCallbacker(err, len(keys), func(idx int, err error) { | 145 » return idxCallbacker(err, len(keys), func(idx int, err error) error { |
143 k := (*ds.Key)(nil) | 146 k := (*ds.Key)(nil) |
144 if err == nil { | 147 if err == nil { |
145 k = dsR2F(rkeys[idx]) | 148 k = dsR2F(rkeys[idx]) |
146 } | 149 } |
147 » » cb(k, err) | 150 » » return cb(k, err) |
148 }) | 151 }) |
149 } | 152 } |
150 | 153 |
151 func (d rdsImpl) fixQuery(fq *ds.FinalizedQuery) (*datastore.Query, error) { | 154 func (d rdsImpl) fixQuery(fq *ds.FinalizedQuery) (*datastore.Query, error) { |
152 ret := datastore.NewQuery(fq.Kind()) | 155 ret := datastore.NewQuery(fq.Kind()) |
153 | 156 |
154 start, end := fq.Bounds() | 157 start, end := fq.Bounds() |
155 if start != nil { | 158 if start != nil { |
156 ret = ret.Start(start.(datastore.Cursor)) | 159 ret = ret.Start(start.(datastore.Cursor)) |
157 } | 160 } |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 func (d rdsImpl) RunInTransaction(f func(c context.Context) error, opts *ds.Tran
sactionOptions) error { | 268 func (d rdsImpl) RunInTransaction(f func(c context.Context) error, opts *ds.Tran
sactionOptions) error { |
266 ropts := (*datastore.TransactionOptions)(opts) | 269 ropts := (*datastore.TransactionOptions)(opts) |
267 return datastore.RunInTransaction(d.aeCtx, func(c context.Context) error
{ | 270 return datastore.RunInTransaction(d.aeCtx, func(c context.Context) error
{ |
268 return f(context.WithValue(d.userCtx, prodContextKey, c)) | 271 return f(context.WithValue(d.userCtx, prodContextKey, c)) |
269 }, ropts) | 272 }, ropts) |
270 } | 273 } |
271 | 274 |
272 func (d rdsImpl) Testable() ds.Testable { | 275 func (d rdsImpl) Testable() ds.Testable { |
273 return nil | 276 return nil |
274 } | 277 } |
OLD | NEW |