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

Side by Side Diff: impl/prod/raw_datastore.go

Issue 1259593005: Add 'user friendly' datastore API. (Closed) Base URL: https://github.com/luci/gae.git@master
Patch Set: more docs 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 | « impl/prod/context.go ('k') | service/datastore/checkfilter.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 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/gae/service/info"
9 "golang.org/x/net/context" 10 "golang.org/x/net/context"
10 "google.golang.org/appengine" 11 "google.golang.org/appengine"
11 "google.golang.org/appengine/datastore" 12 "google.golang.org/appengine/datastore"
12 ) 13 )
13 14
14 // useRDS adds a gae.RawDatastore implementation to context, accessible 15 // useRDS adds a gae.RawDatastore implementation to context, accessible
15 // by gae.GetDS(c) 16 // by gae.GetDS(c)
16 func useRDS(c context.Context) context.Context { 17 func useRDS(c context.Context) context.Context {
17 » return ds.SetFactory(c, func(ci context.Context) ds.Interface { 18 » return ds.SetRawFactory(c, func(ci context.Context) ds.RawInterface {
18 » » // TODO(riannucci): Track namespace in a better way 19 » » return rdsImpl{ci, info.Get(ci).GetNamespace()}
19 » » k := datastore.NewKey(ci, "kind", "", 1, nil) // get current nam espace.
20 » » return rdsImpl{ci, k.Namespace()}
21 }) 20 })
22 } 21 }
23 22
24 ////////// Query 23 ////////// Query
25 24
26 type queryImpl struct{ *datastore.Query } 25 type queryImpl struct{ *datastore.Query }
27 26
28 func (q queryImpl) Distinct() ds.Query { 27 func (q queryImpl) Distinct() ds.Query {
29 return queryImpl{q.Query.Distinct()} 28 return queryImpl{q.Query.Distinct()}
30 } 29 }
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 vals := make([]datastore.PropertyLoadSaver, len(keys)) 104 vals := make([]datastore.PropertyLoadSaver, len(keys))
106 for i := range keys { 105 for i := range keys {
107 vals[i] = &typeFilter{ds.PropertyMap{}} 106 vals[i] = &typeFilter{ds.PropertyMap{}}
108 } 107 }
109 err := datastore.GetMulti(d, rkeys, vals) 108 err := datastore.GetMulti(d, rkeys, vals)
110 return idxCallbacker(err, len(keys), func(idx int, err error) { 109 return idxCallbacker(err, len(keys), func(idx int, err error) {
111 cb(vals[idx].(*typeFilter).pm, err) 110 cb(vals[idx].(*typeFilter).pm, err)
112 }) 111 })
113 } 112 }
114 113
115 func (d rdsImpl) PutMulti(keys []ds.Key, vals []ds.PropertyLoadSaver, cb ds.PutM ultiCB) error { 114 func (d rdsImpl) PutMulti(keys []ds.Key, vals []ds.PropertyMap, cb ds.PutMultiCB ) error {
116 rkeys := dsMF2R(keys) 115 rkeys := dsMF2R(keys)
117 rvals := make([]datastore.PropertyLoadSaver, len(vals)) 116 rvals := make([]datastore.PropertyLoadSaver, len(vals))
118 for i, val := range vals { 117 for i, val := range vals {
119 » » rvals[i] = &typeFilter{val.(ds.PropertyMap)} 118 » » rvals[i] = &typeFilter{val}
120 } 119 }
121 rkeys, err := datastore.PutMulti(d, rkeys, vals) 120 rkeys, err := datastore.PutMulti(d, rkeys, vals)
122 return idxCallbacker(err, len(keys), func(idx int, err error) { 121 return idxCallbacker(err, len(keys), func(idx int, err error) {
123 k := ds.Key(nil) 122 k := ds.Key(nil)
124 if err == nil { 123 if err == nil {
125 k = dsR2F(rkeys[idx]) 124 k = dsR2F(rkeys[idx])
126 } 125 }
127 cb(k, err) 126 cb(k, err)
128 }) 127 })
129 } 128 }
130 129
131 func (d rdsImpl) NewQuery(kind string) ds.Query { 130 func (d rdsImpl) NewQuery(kind string) ds.Query {
132 return queryImpl{datastore.NewQuery(kind)} 131 return queryImpl{datastore.NewQuery(kind)}
133 } 132 }
134 133
135 func (d rdsImpl) Run(q ds.Query, cb ds.RunCB) error { 134 func (d rdsImpl) Run(q ds.Query, cb ds.RawRunCB) error {
136 tf := typeFilter{} 135 tf := typeFilter{}
137 t := q.(queryImpl).Query.Run(d) 136 t := q.(queryImpl).Query.Run(d)
138 cfunc := func() (ds.Cursor, error) { 137 cfunc := func() (ds.Cursor, error) {
139 return t.Cursor() 138 return t.Cursor()
140 } 139 }
141 for { 140 for {
142 k, err := t.Next(&tf) 141 k, err := t.Next(&tf)
143 if err == datastore.Done { 142 if err == datastore.Done {
144 return nil 143 return nil
145 } 144 }
146 if err != nil { 145 if err != nil {
147 return err 146 return err
148 } 147 }
149 if !cb(dsR2F(k), tf.pm, cfunc) { 148 if !cb(dsR2F(k), tf.pm, cfunc) {
150 return nil 149 return nil
151 } 150 }
152 } 151 }
153 } 152 }
154 153
155 func (d rdsImpl) RunInTransaction(f func(c context.Context) error, opts *ds.Tran sactionOptions) error { 154 func (d rdsImpl) RunInTransaction(f func(c context.Context) error, opts *ds.Tran sactionOptions) error {
156 ropts := (*datastore.TransactionOptions)(opts) 155 ropts := (*datastore.TransactionOptions)(opts)
157 return datastore.RunInTransaction(d, f, ropts) 156 return datastore.RunInTransaction(d, f, ropts)
158 } 157 }
OLDNEW
« no previous file with comments | « impl/prod/context.go ('k') | service/datastore/checkfilter.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698