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

Unified Diff: service/datastore/interface.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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « service/datastore/datastore_test.go ('k') | service/datastore/multiarg.go » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: service/datastore/interface.go
diff --git a/service/datastore/interface.go b/service/datastore/interface.go
new file mode 100644
index 0000000000000000000000000000000000000000..af40056640a4eab2869bdc1471dd1951ca0be8bd
--- /dev/null
+++ b/service/datastore/interface.go
@@ -0,0 +1,150 @@
+// 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 datastore
+
+import (
+ "golang.org/x/net/context"
+)
+
+// RunCB is the callback signature provided to Interface.Run
+//
+// - obj is an object as specified by the proto argument of Run
+// - getCursor can be invoked to obtain the current cursor.
+//
+// Return true to continue iterating through the query results, or false to stop.
+type RunCB func(obj interface{}, getCursor func() (Cursor, error)) bool
+
+// Interface is the 'user-friendly' interface to access the current filtered
+// datastore service implementation.
+//
+// Note that in exchange for userfriendliness, this interface ends up doing
+// a lot of reflection.
+//
+// Methods taking 'interface{}' objects describe what a valid type for that
+// interface are in the comments.
+//
+// Struct objects passed in will be converted to PropertyLoadSaver interfaces
+// using this package's GetPLS function.
+type Interface interface {
+ // NewKey produces a new Key with the current appid and namespace.
+ NewKey(kind, stringID string, intID int64, parent Key) Key
+
+ // KeyForObj extracts a key from src.
+ //
+ // It is the same as KeyForObjErr, except that if KeyForObjErr would have
+ // returned an error, this method panics. It's safe to use if you know that
+ // src statically meets the metadata constraints described by KeyForObjErr.
+ KeyForObj(src interface{}) Key
+
+ // KeyForObjErr extracts a key from src.
+ //
+ // src must be one of:
+ // - *S where S is a struct
+ // - a PropertyLoadSaver
+ //
+ // It is expected that the struct or PropertyLoadSaver exposes the
+ // following metadata (as retrieved by PropertyLoadSaver.GetMeta):
+ // - "key" (type: Key) - The full datastore key to use. Must not be nil.
+ // OR
+ // - "id" (type: int64 or string) - The id of the Key to create
+ // - "kind" (optional, type: string) - The kind of the Key to create. If
+ // blank or not present, KeyForObjErr will extract the name of the src
+ // object's type.
+ // - "parent" (optional, type: Key) - The parent key to use.
+ //
+ // If a required metadata item is missing or of the wrong type, then this will
+ // return an error.
+ KeyForObjErr(src interface{}) (Key, error)
+
+ // DecodeKey decodes a proto-encoded key.
+ //
+ // The encoding is defined by the appengine SDK's implementation. In
+ // particular, it is a no-pad-base64-encoded protobuf. If there's an error
+ // during the decoding process, it will be returned.
+ DecodeKey(encoded string) (Key, error)
+
+ // NewQuery creates a new Query object. No server communication occurs.
+ NewQuery(kind string) Query
+
+ // RunInTransaction runs f inside of a transaction. See the appengine SDK's
+ // documentation for full details on the behavior of transactions in the
+ // datastore.
+ //
+ // Note that the behavior of transactions may change depending on what filters
+ // have been installed. It's possible that we'll end up implementing things
+ // like nested/buffered transactions as filters.
+ RunInTransaction(f func(c context.Context) error, opts *TransactionOptions) error
+
+ // Run executes the given query, and calls `cb` for each successfully
+ // retrieved item.
+ //
+ // proto is a prototype of the objects which will be passed to the callback.
+ // It will be used solely for type information, and the actual proto object
+ // may be zero/nil. It must be of the form:
+ // - S or *S where S is a struct
+ // - P or *P where *P is a concrete type implementing PropertyLoadSaver
+ // - *Key implies a keys-only query (and cb will be invoked with Key objects)
+ // Run will create a new, populated instance of proto for each call of
+ // cb. Run stops on the first error encountered.
+ Run(q Query, proto interface{}, cb RunCB) error
+
+ // GetAll retrieves all of the Query results into dst.
+ //
+ // dst must be one of:
+ // - *[]S or *[]*S where S is a struct
+ // - *[]P or *[]*P where *P is a concrete type implementing PropertyLoadSaver
+ // - *[]Key implies a keys-only query.
+ GetAll(q Query, dst interface{}) error
+
+ // Get retrieves a single object from the datastore
+ //
+ // dst must be one of:
+ // - *S where S is a struct
+ // - *P where *P is a concrete type implementing PropertyLoadSaver
+ Get(dst interface{}) error
+
+ // Put inserts a single object into the datastore
+ //
+ // src must be one of:
+ // - *S where S is a struct
+ // - *P where *P is a concrete type implementing PropertyLoadSaver
+ //
+ // A Key will be extracted from src via KeyForObj. If
+ // KeyIncomplete(extractedKey) is true, then Put will write the resolved (i.e.
+ // automatic datastore-populated) Key back to src.
+ Put(src interface{}) error
+
+ // Delete removes an item from the datastore.
+ Delete(key Key) error
+
+ // GetMulti retrieves items from the datastore.
+ //
+ // dst must be one of:
+ // - []S or []*S where S is a struct
+ // - []P or []*P where *P is a concrete type implementing PropertyLoadSaver
+ // - []I where I is some interface type. Each element of the slice must
+ // be non-nil, and its underlying type must be either *S or *P.
+ GetMulti(dst interface{}) error
+
+ // PutMulti writes items to the datastore.
+ //
+ // src must be one of:
+ // - []S or []*S where S is a struct
+ // - []P or []*P where *P is a concrete type implementing PropertyLoadSaver
+ // - []I where i is some interface type. Each elemet of the slice must
+ // be non-nil, and its underlying type must be either *S or *P.
+ //
+ // If items in src resolve to Incomplete keys, PutMulti will write the
+ // resolved keys back to the items in src.
+ PutMulti(src interface{}) error
+
+ // DeleteMulti removes items from the datastore.
+ DeleteMulti(keys []Key) error
+
+ // Raw returns the underlying RawInterface. The Interface and RawInterface may
+ // be used interchangably; there's no danger of interleaving access to the
+ // datastore via the two.
+ Raw() RawInterface
+}
« no previous file with comments | « service/datastore/datastore_test.go ('k') | service/datastore/multiarg.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698