Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package datastore | 5 package datastore |
| 6 | 6 |
| 7 import ( | 7 import ( |
| 8 "golang.org/x/net/context" | 8 "golang.org/x/net/context" |
| 9 ) | 9 ) |
| 10 | 10 |
| 11 // Interface is the 'user-friendly' interface to access the current filtered | 11 // Interface is the 'user-friendly' interface to access the current filtered |
| 12 // datastore service implementation. | 12 // datastore service implementation. |
| 13 // | 13 // |
| 14 // Note that in exchange for userfriendliness, this interface ends up doing | 14 // Note that in exchange for userfriendliness, this interface ends up doing |
| 15 // a lot of reflection. | 15 // a lot of reflection. |
| 16 // | 16 // |
| 17 // Methods taking 'interface{}' objects describe what a valid type for that | 17 // Methods taking 'interface{}' objects describe what a valid type for that |
| 18 // interface are in the comments. | 18 // interface are in the comments. |
| 19 // | 19 // |
| 20 // Struct objects passed in will be converted to PropertyLoadSaver interfaces | 20 // Struct objects passed in will be converted to PropertyLoadSaver interfaces |
| 21 // using this package's GetPLS function. | 21 // using this package's GetPLS function. |
| 22 type Interface interface { | 22 type Interface interface { |
| 23 // AllocateIDs allows you to allocate IDs from the datastore without put ting | 23 // AllocateIDs allows you to allocate IDs from the datastore without put ting |
| 24 » // any data. `incomplete` must be a PartialValid Key. If there's no erro r, | 24 » // any data. |
| 25 » // a contiguous block of IDs of n length starting at `start` will be res erved | 25 » // |
| 26 » // indefinitely for the user application code for use in new keys. The | 26 » // A partial valid key will be constructed from each entity's kind and p arent, |
| 27 » // appengine automatic ID generator will never automatically assign thes e IDs | 27 » // if present. An allocation will then be performed against the datastor e for |
| 28 » // for Keys of this type. | 28 » // each key, and the partial key will be populated with a unique integer ID. |
| 29 » AllocateIDs(incomplete *Key, n int) (start int64, err error) | 29 » // The resulting keys will be applied to their objects using PopulateKey . If |
| 30 » // successful, any existing ID will be destroyed. | |
| 31 » // | |
| 32 » // If the object is supplied that cannot accept an integer key, this met hod | |
| 33 » // will panic. | |
| 34 » // | |
| 35 » // ent must be one of: | |
| 36 » //» - *S where S is a struct | |
| 37 » //» - *P where *P is a concrete type implementing PropertyLoadSaver | |
| 38 » //» - []S or []*S where S is a struct | |
| 39 » //» - []P or []*P where *P is a concrete type implementing PropertyL oadSaver | |
| 40 » //» - []I where i is some interface type. Each element of the slice must | |
| 41 » //» be non-nil, and its underlying type must be either *S or *P. | |
| 42 » //» - *Key to populate a partial-valid key. | |
|
iannucci
2016/06/14 01:46:04
how can this work? Does it modify the Key in place
dnj (Google)
2016/06/14 04:24:18
Oh good point. Crap, okay, I'll remove this option
| |
| 43 » //» - []*Key, to populate a slice of partial-valid keys. | |
| 44 » // | |
| 45 » // If an error is encountered, the returned error value will depend on t he | |
| 46 » // input arguments. If one argument is supplied, the result will be the | |
| 47 » // encountered error type. If multiple arguments are supplied, the resul t will | |
| 48 » // be a MultiError whose error index corresponds to the argument in whic h the | |
| 49 » // error was encountered. | |
| 50 » // | |
| 51 » // If an ent argument is a slice, its error type will be a MultiError. N ote | |
| 52 » // that in the scenario where multiple slices are provided, this will re turn a | |
| 53 » // MultiError containing a nested MultiError for each slice argument. | |
| 54 » AllocateIDs(ent ...interface{}) error | |
| 30 | 55 |
| 31 // KeyForObj extracts a key from src. | 56 // KeyForObj extracts a key from src. |
| 32 // | 57 // |
| 33 // It is the same as KeyForObjErr, except that if KeyForObjErr would hav e | 58 // It is the same as KeyForObjErr, except that if KeyForObjErr would hav e |
| 34 // returned an error, this method panics. It's safe to use if you know t hat | 59 // returned an error, this method panics. It's safe to use if you know t hat |
| 35 // src statically meets the metadata constraints described by KeyForObjE rr. | 60 // src statically meets the metadata constraints described by KeyForObjE rr. |
| 36 KeyForObj(src interface{}) *Key | 61 KeyForObj(src interface{}) *Key |
| 37 | 62 |
| 38 // MakeKey is a convenience method for manufacturing a *Key. It should o nly be | 63 // MakeKey is a convenience method for manufacturing a *Key. It should o nly be |
| 39 // used when elems... is known statically (e.g. in the code) to be corre ct. | 64 // used when elems... is known statically (e.g. in the code) to be corre ct. |
| 40 // | 65 // |
| 41 // elems is pairs of (string, string|int|int32|int64) pairs, which corre spond | 66 // elems is pairs of (string, string|int|int32|int64) pairs, which corre spond |
| 42 // to Kind/id pairs. Example: | 67 // to Kind/id pairs. Example: |
| 43 // dstore.MakeKey("Parent", 1, "Child", "id") | 68 // dstore.MakeKey("Parent", 1, "Child", "id") |
| 44 // | 69 // |
| 45 // Would create the key: | 70 // Would create the key: |
| 46 // <current appID>:<current Namespace>:/Parent,1/Child,id | 71 // <current appID>:<current Namespace>:/Parent,1/Child,id |
| 47 // | 72 // |
| 48 // If elems is not parsable (e.g. wrong length, wrong types, etc.) this method | 73 // If elems is not parsable (e.g. wrong length, wrong types, etc.) this method |
| 49 // will panic. | 74 // will panic. |
| 50 MakeKey(elems ...interface{}) *Key | 75 MakeKey(elems ...interface{}) *Key |
| 51 | 76 |
| 52 // NewKey constructs a new key in the current appID/Namespace, using the | 77 // NewKey constructs a new key in the current appID/Namespace, using the |
| 53 // specified parameters. | 78 // specified parameters. |
| 54 NewKey(kind, stringID string, intID int64, parent *Key) *Key | 79 NewKey(kind, stringID string, intID int64, parent *Key) *Key |
| 55 | 80 |
| 81 // NewIncompleteKeys allocates count incomplete keys sharing the same ki nd and | |
| 82 // parent. It is useful as input to AllocateIDs. | |
| 83 NewIncompleteKeys(count int, kind string, parent *Key) []*Key | |
| 84 | |
| 56 // NewKeyToks constructs a new key in the current appID/Namespace, using the | 85 // NewKeyToks constructs a new key in the current appID/Namespace, using the |
| 57 // specified key tokens. | 86 // specified key tokens. |
| 58 NewKeyToks([]KeyTok) *Key | 87 NewKeyToks([]KeyTok) *Key |
| 59 | 88 |
| 60 // KeyForObjErr extracts a key from src. | 89 // KeyForObjErr extracts a key from src. |
| 61 // | 90 // |
| 62 // src must be one of: | 91 // src must be one of: |
| 63 // - *S where S is a struct | 92 // - *S where S is a struct |
| 64 // - a PropertyLoadSaver | 93 // - a PropertyLoadSaver |
| 65 // | 94 // |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 197 // - []S or []*S where S is a struct | 226 // - []S or []*S where S is a struct |
| 198 // - []P or []*P where *P is a concrete type implementing PropertyLoad Saver | 227 // - []P or []*P where *P is a concrete type implementing PropertyLoad Saver |
| 199 // - []I where I is some interface type. Each element of the slice mus t | 228 // - []I where I is some interface type. Each element of the slice mus t |
| 200 // be non-nil, and its underlying type must be either *S or *P. | 229 // be non-nil, and its underlying type must be either *S or *P. |
| 201 // | 230 // |
| 202 // NOTE: GetMulti is obsolete. The vararg-accepting Get should be used | 231 // NOTE: GetMulti is obsolete. The vararg-accepting Get should be used |
| 203 // instead. This is left for backwards compatibility, but will be remove d from | 232 // instead. This is left for backwards compatibility, but will be remove d from |
| 204 // this interface at some point in the future. | 233 // this interface at some point in the future. |
| 205 GetMulti(dst interface{}) error | 234 GetMulti(dst interface{}) error |
| 206 | 235 |
| 207 » // Put inserts a single object into the datastore | 236 » // Put writes objects into the datastore. |
| 208 // | 237 // |
| 209 // src must be one of: | 238 // src must be one of: |
| 210 // - *S where S is a struct | 239 // - *S where S is a struct |
| 211 // - *P where *P is a concrete type implementing PropertyLoadSaver | 240 // - *P where *P is a concrete type implementing PropertyLoadSaver |
| 212 // - []S or []*S where S is a struct | 241 // - []S or []*S where S is a struct |
| 213 // - []P or []*P where *P is a concrete type implementing PropertyL oadSaver | 242 // - []P or []*P where *P is a concrete type implementing PropertyL oadSaver |
| 214 // - []I where i is some interface type. Each element of the slice must | 243 // - []I where i is some interface type. Each element of the slice must |
| 215 // be non-nil, and its underlying type must be either *S or *P. | 244 // be non-nil, and its underlying type must be either *S or *P. |
| 216 // | 245 // |
| 217 // A *Key will be extracted from src via KeyForObj. If | 246 // A *Key will be extracted from src via KeyForObj. If |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 280 | 309 |
| 281 // Testable returns the Testable interface for the implementation, or ni l if | 310 // Testable returns the Testable interface for the implementation, or ni l if |
| 282 // there is none. | 311 // there is none. |
| 283 Testable() Testable | 312 Testable() Testable |
| 284 | 313 |
| 285 // Raw returns the underlying RawInterface. The Interface and RawInterfa ce may | 314 // Raw returns the underlying RawInterface. The Interface and RawInterfa ce may |
| 286 // be used interchangably; there's no danger of interleaving access to t he | 315 // be used interchangably; there's no danger of interleaving access to t he |
| 287 // datastore via the two. | 316 // datastore via the two. |
| 288 Raw() RawInterface | 317 Raw() RawInterface |
| 289 } | 318 } |
| OLD | NEW |