Index: service/datastore/properties.go |
diff --git a/service/datastore/properties.go b/service/datastore/properties.go |
index 4267d029ad7c7387073cfb2a70e5c369aec6628c..d82118dbe77eee6c75db7ddb90f0fd227f635e8f 100644 |
--- a/service/datastore/properties.go |
+++ b/service/datastore/properties.go |
@@ -621,6 +621,8 @@ type MetaGetter interface { |
// GetMeta will get information about the field which has the struct tag in |
// the form of `gae:"$<key>[,<default>]?"`. |
// |
+ // It returns the value, if any, and true iff the value was retrieved. |
+ // |
// Supported metadata types are: |
// int64 - may have default (ascii encoded base-10) |
// string - may have default |
@@ -648,20 +650,7 @@ type MetaGetter interface { |
// FFlag Toggle `gae:"$flag2,false"` // defaults to false |
// // BadFlag Toggle `gae:"$flag3"` // ILLEGAL |
// } |
- GetMeta(key string) (interface{}, error) |
- |
- // GetMetaDefault is GetMeta, but with a default. |
- // |
- // If the metadata key is not available, or its type doesn't equal the |
- // homogenized type of dflt, then dflt will be returned. |
- // |
- // Type homogenization: |
- // signed integer types -> int64 |
- // bool -> Toggle fields (bool) |
- // |
- // Example: |
- // pls.GetMetaDefault("foo", 100).(int64) |
- GetMetaDefault(key string, dflt interface{}) interface{} |
+ GetMeta(key string) (interface{}, bool) |
} |
// PropertyLoadSaver may be implemented by a user type, and Interface will |
@@ -679,11 +668,6 @@ type PropertyLoadSaver interface { |
// then the PropertyMap contains all the metadata (e.g. '$meta' fields) |
// which was held by this PropertyLoadSaver. |
Save(withMeta bool) (PropertyMap, error) |
- |
- // Problem indicates that this PLS has a fatal problem. Usually this is |
- // set when the underlying struct has recursion, invalid field types, nested |
- // slices, etc. |
- Problem() error |
} |
// MetaGetterSetter is the subset of PropertyLoadSaver which pertains to |
@@ -707,7 +691,8 @@ type MetaGetterSetter interface { |
GetAllMeta() PropertyMap |
// SetMeta allows you to set the current value of the meta-keyed field. |
- SetMeta(key string, val interface{}) error |
+ // It returns true iff the field was set. |
+ SetMeta(key string, val interface{}) bool |
} |
// PropertyMap represents the contents of a datastore entity in a generic way. |
@@ -761,17 +746,13 @@ func (pm PropertyMap) Save(withMeta bool) (PropertyMap, error) { |
} |
// GetMeta implements PropertyLoadSaver.GetMeta, and returns the current value |
-// associated with the metadata key. It may return ErrMetaFieldUnset if the |
-// key doesn't exist. |
-func (pm PropertyMap) GetMeta(key string) (interface{}, error) { |
+// associated with the metadata key. |
+func (pm PropertyMap) GetMeta(key string) (interface{}, bool) { |
v, ok := pm["$"+key] |
if !ok || len(v) == 0 { |
- return nil, ErrMetaFieldUnset |
+ return nil, false |
} |
- if len(v) > 1 { |
- return nil, errors.New("gae: too many values for Meta key") |
- } |
- return v[0].Value(), nil |
+ return v[0].Value(), true |
} |
// GetAllMeta implements PropertyLoadSaver.GetAllMeta. |
@@ -787,20 +768,15 @@ func (pm PropertyMap) GetAllMeta() PropertyMap { |
return ret |
} |
-// GetMetaDefault is the implementation of PropertyLoadSaver.GetMetaDefault. |
-func (pm PropertyMap) GetMetaDefault(key string, dflt interface{}) interface{} { |
- return GetMetaDefaultImpl(pm.GetMeta, key, dflt) |
-} |
- |
// SetMeta implements PropertyLoadSaver.SetMeta. It will only return an error |
// if `val` has an invalid type (e.g. not one supported by Property). |
-func (pm PropertyMap) SetMeta(key string, val interface{}) error { |
+func (pm PropertyMap) SetMeta(key string, val interface{}) bool { |
prop := Property{} |
if err := prop.SetValue(val, NoIndex); err != nil { |
- return err |
+ return false |
} |
pm["$"+key] = []Property{prop} |
- return nil |
+ return true |
} |
// Problem implements PropertyLoadSaver.Problem. It ALWAYS returns nil. |
@@ -833,17 +809,21 @@ func isMetaKey(k string) bool { |
return k == "" || k[0] == '$' |
} |
-// GetMetaDefaultImpl is the implementation of PropertyLoadSaver.GetMetaDefault. |
+// GetMetaDefault is a helper for GetMeta, allowing a default value. |
+// |
+// If the metadata key is not available, or its type doesn't equal the |
+// homogenized type of dflt, then dflt will be returned. |
// |
-// It takes the normal GetMeta function, the key and the default, and returns |
-// the value according to PropertyLoadSaver.GetMetaDefault. |
-func GetMetaDefaultImpl(gm func(string) (interface{}, error), key string, dflt interface{}) interface{} { |
+// Type homogenization: |
+// signed integer types -> int64 |
+// bool -> Toggle fields (bool) |
+// |
+// Example: |
+// pls.GetMetaDefault("foo", 100).(int64) |
+func GetMetaDefault(getter MetaGetter, key string, dflt interface{}) interface{} { |
dflt = UpconvertUnderlyingType(dflt) |
- cur, err := gm(key) |
- if err != nil { |
- return dflt |
- } |
- if dflt != nil && reflect.TypeOf(cur) != reflect.TypeOf(dflt) { |
+ cur, ok := getter.GetMeta(key) |
+ if !ok || (dflt != nil && reflect.TypeOf(cur) != reflect.TypeOf(dflt)) { |
return dflt |
} |
return cur |