OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 package wrapper | |
6 | |
7 import ( | |
8 "fmt" | |
9 | |
10 "golang.org/x/net/context" | |
11 | |
12 "appengine/datastore" | |
13 | |
14 "github.com/mjibson/goon" | |
15 ) | |
16 | |
17 /// Kinds + Keys | |
18 | |
19 // DSKinder simply allows you to resolve the datastore 'kind' of an object. | |
20 // See goon.Goon.Kind(). | |
21 type DSKinder interface { | |
22 Kind(src interface{}) string | |
23 } | |
24 | |
25 // DSKindSetter allows you to manipulate the current Kind resolution function. | |
26 // See goon.Goon.KindNameResolver. | |
27 type DSKindSetter interface { | |
28 KindNameResolver() goon.KindNameResolver | |
29 SetKindNameResolver(goon.KindNameResolver) | |
30 } | |
31 | |
32 // DSNewKeyer allows you to generate a new *datastore.Key in a couple ways. | |
33 // See goon.Goon.Key* for the NewKeyObj* methods, as well as datastore.NewKey. | |
34 type DSNewKeyer interface { | |
35 NewKey(kind, stringID string, intID int64, parent *datastore.Key) *datas
tore.Key | |
36 NewKeyObj(src interface{}) *datastore.Key | |
37 NewKeyObjError(src interface{}) (*datastore.Key, error) | |
38 } | |
39 | |
40 /// Read + Write | |
41 | |
42 // DSSingleReadWriter allows you to read and write a single datastore object. | |
43 // See goon.Goon for more detail on the same-named functions. | |
44 type DSSingleReadWriter interface { | |
45 Put(src interface{}) (*datastore.Key, error) | |
46 Get(dst interface{}) error | |
47 Delete(key *datastore.Key) error | |
48 } | |
49 | |
50 // DSMultiReadWriter allows you to read and write a multiple datastore objects | |
51 // in a non-atomic batch. See goon.Goon for more detail on the same-named. | |
52 // functions. Also implies DSSingleReadWriter. | |
53 type DSMultiReadWriter interface { | |
54 DSSingleReadWriter | |
55 DeleteMulti(keys []*datastore.Key) error | |
56 GetMulti(dst interface{}) error | |
57 PutMulti(src interface{}) ([]*datastore.Key, error) | |
58 } | |
59 | |
60 /// Queries | |
61 | |
62 // DSCursor wraps datastore.Cursor. | |
63 type DSCursor interface { | |
64 fmt.Stringer | |
65 } | |
66 | |
67 // DSIterator wraps datastore.Iterator. | |
68 type DSIterator interface { | |
69 Cursor() (DSCursor, error) | |
70 Next(dst interface{}) (*datastore.Key, error) | |
71 } | |
72 | |
73 // DSQuery wraps datastore.Query. | |
74 type DSQuery interface { | |
75 Ancestor(ancestor *datastore.Key) DSQuery | |
76 Distinct() DSQuery | |
77 End(c DSCursor) DSQuery | |
78 EventualConsistency() DSQuery | |
79 Filter(filterStr string, value interface{}) DSQuery | |
80 KeysOnly() DSQuery | |
81 Limit(limit int) DSQuery | |
82 Offset(offset int) DSQuery | |
83 Order(fieldName string) DSQuery | |
84 Project(fieldNames ...string) DSQuery | |
85 Start(c DSCursor) DSQuery | |
86 } | |
87 | |
88 // DSQueryer implements all query-related functionality of goon.Goon/datastore. | |
89 type DSQueryer interface { | |
90 NewQuery(kind string) DSQuery | |
91 Run(q DSQuery) DSIterator | |
92 GetAll(q DSQuery, dst interface{}) ([]*datastore.Key, error) | |
93 Count(q DSQuery) (int, error) | |
94 } | |
95 | |
96 /// Transactions | |
97 | |
98 // DSTransactioner implements the function for entering a transaction with | |
99 // datastore. The function receives a context without the ability to enter a | |
100 // transaction again (since recursive transactions are not implemented in | |
101 // datastore). | |
102 type DSTransactioner interface { | |
103 RunInTransaction(f func(c context.Context) error, opts *datastore.Transa
ctionOptions) error | |
104 } | |
105 | |
106 // Datastore implements the full datastore functionality. | |
107 type Datastore interface { | |
108 DSKinder | |
109 DSNewKeyer | |
110 DSMultiReadWriter | |
111 DSQueryer | |
112 DSKindSetter | |
113 DSTransactioner | |
114 } | |
115 | |
116 // DSFactory is the function signature for factory methods compatible with | |
117 // SetDSFactory. | |
118 type DSFactory func(context.Context) Datastore | |
119 | |
120 // GetDS gets the Datastore implementation from context. | |
121 func GetDS(c context.Context) Datastore { | |
122 if f, ok := c.Value(datastoreKey).(DSFactory); ok && f != nil { | |
123 return f(c) | |
124 } | |
125 return nil | |
126 } | |
127 | |
128 // SetDSFactory sets the function to produce Datastore instances, as returned by | |
129 // the GetDS method. | |
130 func SetDSFactory(c context.Context, dsf DSFactory) context.Context { | |
131 return context.WithValue(c, datastoreKey, dsf) | |
132 } | |
133 | |
134 // SetDS sets the current Datastore object in the context. Useful for testing | |
135 // with a quick mock. This is just a shorthand SetDSFactory invocation to set | |
136 // a factory which always returns the same object. | |
137 func SetDS(c context.Context, ds Datastore) context.Context { | |
138 return SetDSFactory(c, func(context.Context) Datastore { return ds }) | |
139 } | |
OLD | NEW |