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 "fmt" | 8 "fmt" |
9 | 9 |
10 "golang.org/x/net/context" | 10 "golang.org/x/net/context" |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
45 // - err is an error associated with putting this entity. | 45 // - err is an error associated with putting this entity. |
46 type PutMultiCB func(key *Key, err error) | 46 type PutMultiCB func(key *Key, err error) |
47 | 47 |
48 // DeleteMultiCB is the callback signature provided to RawInterface.DeleteMulti | 48 // DeleteMultiCB is the callback signature provided to RawInterface.DeleteMulti |
49 // | 49 // |
50 // - err is an error associated with deleting this entity. | 50 // - err is an error associated with deleting this entity. |
51 type DeleteMultiCB func(err error) | 51 type DeleteMultiCB func(err error) |
52 | 52 |
53 type nullMetaGetterType struct{} | 53 type nullMetaGetterType struct{} |
54 | 54 |
55 func (nullMetaGetterType) GetMeta(string) (interface{}, error)
{ return nil, ErrMetaFieldUnset } | 55 func (nullMetaGetterType) GetMeta(string) (interface{}, bool) { return nil, fals
e } |
56 func (nullMetaGetterType) GetMetaDefault(_ string, dflt interface{}) interface{}
{ return dflt } | |
57 | 56 |
58 var nullMetaGetter MetaGetter = nullMetaGetterType{} | 57 var nullMetaGetter MetaGetter = nullMetaGetterType{} |
59 | 58 |
60 // MultiMetaGetter is a carrier for metadata, used with RawInterface.GetMulti | 59 // MultiMetaGetter is a carrier for metadata, used with RawInterface.GetMulti |
61 // | 60 // |
62 // It's OK to default-construct this. GetMeta will just return | 61 // It's OK to default-construct this. GetMeta will just return |
63 // (nil, ErrMetaFieldUnset) for every index. | 62 // (nil, ErrMetaFieldUnset) for every index. |
64 type MultiMetaGetter []MetaGetter | 63 type MultiMetaGetter []MetaGetter |
65 | 64 |
66 // NewMultiMetaGetter returns a new MultiMetaGetter object. data may be nil. | 65 // NewMultiMetaGetter returns a new MultiMetaGetter object. data may be nil. |
67 func NewMultiMetaGetter(data []PropertyMap) MultiMetaGetter { | 66 func NewMultiMetaGetter(data []PropertyMap) MultiMetaGetter { |
68 if len(data) == 0 { | 67 if len(data) == 0 { |
69 return nil | 68 return nil |
70 } | 69 } |
71 inner := make(MultiMetaGetter, len(data)) | 70 inner := make(MultiMetaGetter, len(data)) |
72 for i, pm := range data { | 71 for i, pm := range data { |
73 inner[i] = pm | 72 inner[i] = pm |
74 } | 73 } |
75 return inner | 74 return inner |
76 } | 75 } |
77 | 76 |
78 // GetMeta is like PropertyLoadSaver.GetMeta, but it also takes an index | 77 // GetMeta is like PropertyLoadSaver.GetMeta, but it also takes an index |
79 // indicating which slot you want metadata for. If idx isn't there, this | 78 // indicating which slot you want metadata for. If idx isn't there, this |
80 // returns (nil, ErrMetaFieldUnset). | 79 // returns (nil, ErrMetaFieldUnset). |
81 func (m MultiMetaGetter) GetMeta(idx int, key string) (interface{}, error) { | 80 func (m MultiMetaGetter) GetMeta(idx int, key string) (interface{}, bool) { |
82 return m.GetSingle(idx).GetMeta(key) | 81 return m.GetSingle(idx).GetMeta(key) |
83 } | 82 } |
84 | 83 |
85 // GetMetaDefault is like PropertyLoadSaver.GetMetaDefault, but it also takes an | |
86 // index indicating which slot you want metadata for. If idx isn't there, this | |
87 // returns dflt. | |
88 func (m MultiMetaGetter) GetMetaDefault(idx int, key string, dflt interface{}) i
nterface{} { | |
89 return m.GetSingle(idx).GetMetaDefault(key, dflt) | |
90 } | |
91 | |
92 // GetSingle gets a single MetaGetter at the specified index. | 84 // GetSingle gets a single MetaGetter at the specified index. |
93 func (m MultiMetaGetter) GetSingle(idx int) MetaGetter { | 85 func (m MultiMetaGetter) GetSingle(idx int) MetaGetter { |
94 if idx >= len(m) || m[idx] == nil { | 86 if idx >= len(m) || m[idx] == nil { |
95 return nullMetaGetter | 87 return nullMetaGetter |
96 } | 88 } |
97 return m[idx] | 89 return m[idx] |
98 } | 90 } |
99 | 91 |
100 // RawInterface implements the datastore functionality without any of the fancy | 92 // RawInterface implements the datastore functionality without any of the fancy |
101 // reflection stuff. This is so that Filters can avoid doing lots of redundant | 93 // reflection stuff. This is so that Filters can avoid doing lots of redundant |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 // - len(keys) > 0 | 160 // - len(keys) > 0 |
169 // - all keys are Valid, !Incomplete, and in the current namespace | 161 // - all keys are Valid, !Incomplete, and in the current namespace |
170 // - none keys of the keys are 'special' (use a kind prefixed with '__
') | 162 // - none keys of the keys are 'special' (use a kind prefixed with '__
') |
171 // - cb is not nil | 163 // - cb is not nil |
172 DeleteMulti(keys []*Key, cb DeleteMultiCB) error | 164 DeleteMulti(keys []*Key, cb DeleteMultiCB) error |
173 | 165 |
174 // Testable returns the Testable interface for the implementation, or ni
l if | 166 // Testable returns the Testable interface for the implementation, or ni
l if |
175 // there is none. | 167 // there is none. |
176 Testable() Testable | 168 Testable() Testable |
177 } | 169 } |
OLD | NEW |