Index: go/src/infra/gae/libs/gae/raw_datastore.go |
diff --git a/go/src/infra/gae/libs/gae/raw_datastore.go b/go/src/infra/gae/libs/gae/raw_datastore.go |
new file mode 100644 |
index 0000000000000000000000000000000000000000..100b7d9471c850bbb1c7fff79286fdd0c41ce25d |
--- /dev/null |
+++ b/go/src/infra/gae/libs/gae/raw_datastore.go |
@@ -0,0 +1,116 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package gae |
+ |
+import ( |
+ "fmt" |
+ |
+ "golang.org/x/net/context" |
+) |
+ |
+/// Kinds + Keys |
+ |
+// DSKey is the equivalent of *datastore.Key from the original SDK, except that |
+// it can have multiple implementations. See helper.DSKey* methods for missing |
+// methods like DSKeyIncomplete (and some new ones like DSKeyValid). |
+type DSKey interface { |
+ Kind() string |
+ StringID() string |
+ IntID() int64 |
+ Parent() DSKey |
+ AppID() string |
+ Namespace() string |
+ |
+ String() string |
+} |
+ |
+// DSKeyTok is a single token from a multi-part DSKey. |
+type DSKeyTok struct { |
+ Kind string |
+ IntID int64 |
+ StringID string |
+} |
+ |
+// DSCursor wraps datastore.Cursor. |
+type DSCursor interface { |
+ fmt.Stringer |
+} |
+ |
+// DSIterator wraps datastore.Iterator. |
+type DSIterator interface { |
+ Cursor() (DSCursor, error) |
+ Next(dst interface{}) (DSKey, error) |
+} |
+ |
+// DSQuery wraps datastore.Query. |
+type DSQuery interface { |
+ Ancestor(ancestor DSKey) DSQuery |
+ Distinct() DSQuery |
+ End(c DSCursor) DSQuery |
+ EventualConsistency() DSQuery |
+ Filter(filterStr string, value interface{}) DSQuery |
+ KeysOnly() DSQuery |
+ Limit(limit int) DSQuery |
+ Offset(offset int) DSQuery |
+ Order(fieldName string) DSQuery |
+ Project(fieldNames ...string) DSQuery |
+ Start(c DSCursor) DSQuery |
+} |
+ |
+// CommonDatastore is the interface for the methods which are common between |
+// Datastore and RawDatastore. |
+type CommonDatastore interface { |
+ NewKey(kind, stringID string, intID int64, parent DSKey) DSKey |
+ DecodeKey(encoded string) (DSKey, error) |
+ |
+ NewQuery(kind string) DSQuery |
+ Run(q DSQuery) DSIterator |
+ GetAll(q DSQuery, dst interface{}) ([]DSKey, error) |
+ Count(q DSQuery) (int, error) |
+ |
+ RunInTransaction(f func(c context.Context) error, opts *DSTransactionOptions) error |
+} |
+ |
+// RawDatastore implements the datastore functionality as described by |
+// the raw appengine documentation. No key inference occurs, nor does any |
+// caching. See Datastore for a nicer interface. |
+type RawDatastore interface { |
+ CommonDatastore |
+ |
+ Put(key DSKey, src interface{}) (DSKey, error) |
+ Get(key DSKey, dst interface{}) error |
+ Delete(key DSKey) error |
+ |
+ // These allow you to read and write a multiple datastore objects in |
+ // a non-atomic batch. |
+ DeleteMulti(keys []DSKey) error |
+ GetMulti(keys []DSKey, dst interface{}) error |
+ PutMulti(keys []DSKey, src interface{}) ([]DSKey, error) |
+} |
+ |
+// RDSFactory is the function signature for factory methods compatible with |
+// SetRDSFactory. |
+type RDSFactory func(context.Context) RawDatastore |
+ |
+// GetRDS gets the RawDatastore implementation from context. |
+func GetRDS(c context.Context) RawDatastore { |
+ if f, ok := c.Value(rawDatastoreKey).(RDSFactory); ok && f != nil { |
+ return f(c) |
+ } |
+ return nil |
+} |
+ |
+// SetRDSFactory sets the function to produce Datastore instances, as returned by |
+// the GetRDS method. |
+func SetRDSFactory(c context.Context, rdsf RDSFactory) context.Context { |
+ return context.WithValue(c, rawDatastoreKey, rdsf) |
+} |
+ |
+// SetRDS sets the current Datastore object in the context. Useful for testing |
+// with a quick mock. This is just a shorthand SetDSFactory invocation to set |
+// a factory which always returns the same object. |
+func SetRDS(c context.Context, rds RawDatastore) context.Context { |
+ return SetRDSFactory(c, func(context.Context) RawDatastore { return rds }) |
+} |