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

Unified Diff: go/src/infra/gae/libs/gae/raw_datastore.go

Issue 1222903002: Refactor current GAE abstraction library to be free of the SDK* (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: more fixes Created 5 years, 5 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 side-by-side diff with in-line comments
Download patch
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 })
+}

Powered by Google App Engine
This is Rietveld 408576698