| Index: go/src/infra/gae/libs/wrapper/datastore.go
|
| diff --git a/go/src/infra/gae/libs/wrapper/datastore.go b/go/src/infra/gae/libs/wrapper/datastore.go
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..68c86fdd134e0eadcbd0b58a3ad55048d9c5fb58
|
| --- /dev/null
|
| +++ b/go/src/infra/gae/libs/wrapper/datastore.go
|
| @@ -0,0 +1,139 @@
|
| +// 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 wrapper
|
| +
|
| +import (
|
| + "fmt"
|
| +
|
| + "golang.org/x/net/context"
|
| +
|
| + "appengine/datastore"
|
| +
|
| + "github.com/mjibson/goon"
|
| +)
|
| +
|
| +/// Kinds + Keys
|
| +
|
| +// DSKinder simply allows you to resolve the datastore 'kind' of an object.
|
| +// See goon.Goon.Kind().
|
| +type DSKinder interface {
|
| + Kind(src interface{}) string
|
| +}
|
| +
|
| +// DSKindSetter allows you to manipulate the current Kind resolution function.
|
| +// See goon.Goon.KindNameResolver.
|
| +type DSKindSetter interface {
|
| + KindNameResolver() goon.KindNameResolver
|
| + SetKindNameResolver(goon.KindNameResolver)
|
| +}
|
| +
|
| +// DSNewKeyer allows you to generate a new *datastore.Key in a couple ways.
|
| +// See goon.Goon.Key* for the NewKeyObj* methods, as well as datastore.NewKey.
|
| +type DSNewKeyer interface {
|
| + NewKey(kind, stringID string, intID int64, parent *datastore.Key) *datastore.Key
|
| + NewKeyObj(src interface{}) *datastore.Key
|
| + NewKeyObjError(src interface{}) (*datastore.Key, error)
|
| +}
|
| +
|
| +/// Read + Write
|
| +
|
| +// DSSingleReadWriter allows you to read and write a single datastore object.
|
| +// See goon.Goon for more detail on the same-named functions.
|
| +type DSSingleReadWriter interface {
|
| + Put(src interface{}) (*datastore.Key, error)
|
| + Get(dst interface{}) error
|
| + Delete(key *datastore.Key) error
|
| +}
|
| +
|
| +// DSMultiReadWriter allows you to read and write a multiple datastore objects
|
| +// in a non-atomic batch. See goon.Goon for more detail on the same-named.
|
| +// functions. Also implies DSSingleReadWriter.
|
| +type DSMultiReadWriter interface {
|
| + DSSingleReadWriter
|
| + DeleteMulti(keys []*datastore.Key) error
|
| + GetMulti(dst interface{}) error
|
| + PutMulti(src interface{}) ([]*datastore.Key, error)
|
| +}
|
| +
|
| +/// Queries
|
| +
|
| +// DSCursor wraps datastore.Cursor.
|
| +type DSCursor interface {
|
| + fmt.Stringer
|
| +}
|
| +
|
| +// DSIterator wraps datastore.Iterator.
|
| +type DSIterator interface {
|
| + Cursor() (DSCursor, error)
|
| + Next(dst interface{}) (*datastore.Key, error)
|
| +}
|
| +
|
| +// DSQuery wraps datastore.Query.
|
| +type DSQuery interface {
|
| + Ancestor(ancestor *datastore.Key) 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
|
| +}
|
| +
|
| +// DSQueryer implements all query-related functionality of goon.Goon/datastore.
|
| +type DSQueryer interface {
|
| + NewQuery(kind string) DSQuery
|
| + Run(q DSQuery) DSIterator
|
| + GetAll(q DSQuery, dst interface{}) ([]*datastore.Key, error)
|
| + Count(q DSQuery) (int, error)
|
| +}
|
| +
|
| +/// Transactions
|
| +
|
| +// DSTransactioner implements the function for entering a transaction with
|
| +// datastore. The function receives a context without the ability to enter a
|
| +// transaction again (since recursive transactions are not implemented in
|
| +// datastore).
|
| +type DSTransactioner interface {
|
| + RunInTransaction(f func(c context.Context) error, opts *datastore.TransactionOptions) error
|
| +}
|
| +
|
| +// Datastore implements the full datastore functionality.
|
| +type Datastore interface {
|
| + DSKinder
|
| + DSNewKeyer
|
| + DSMultiReadWriter
|
| + DSQueryer
|
| + DSKindSetter
|
| + DSTransactioner
|
| +}
|
| +
|
| +// DSFactory is the function signature for factory methods compatible with
|
| +// SetDSFactory.
|
| +type DSFactory func(context.Context) Datastore
|
| +
|
| +// GetDS gets the Datastore implementation from context.
|
| +func GetDS(c context.Context) Datastore {
|
| + if f, ok := c.Value(datastoreKey).(DSFactory); ok && f != nil {
|
| + return f(c)
|
| + }
|
| + return nil
|
| +}
|
| +
|
| +// SetDSFactory sets the function to produce Datastore instances, as returned by
|
| +// the GetDS method.
|
| +func SetDSFactory(c context.Context, dsf DSFactory) context.Context {
|
| + return context.WithValue(c, datastoreKey, dsf)
|
| +}
|
| +
|
| +// SetDS 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 SetDS(c context.Context, ds Datastore) context.Context {
|
| + return SetDSFactory(c, func(context.Context) Datastore { return ds })
|
| +}
|
|
|