Index: impl/prod/raw_datastore_type_converter.go |
diff --git a/impl/prod/raw_datastore_type_converter.go b/impl/prod/raw_datastore_type_converter.go |
index 5df7d355525038c593c648e1e5dec9534b0dd59f..e249e4877974894607257172bcf4adf2017665d9 100644 |
--- a/impl/prod/raw_datastore_type_converter.go |
+++ b/impl/prod/raw_datastore_type_converter.go |
@@ -11,12 +11,14 @@ import ( |
bs "github.com/luci/gae/service/blobstore" |
ds "github.com/luci/gae/service/datastore" |
- "github.com/luci/gae/service/datastore/dskey" |
+ "golang.org/x/net/context" |
"google.golang.org/appengine" |
"google.golang.org/appengine/datastore" |
) |
type typeFilter struct { |
+ ctx context.Context |
+ |
pm ds.PropertyMap |
} |
@@ -80,7 +82,7 @@ func maybeIndexValue(val interface{}) interface{} { |
toks[i].StringID = sid.Elem().String() |
} |
} |
- return dskey.NewToks(aid, ns, toks) |
+ return ds.NewKeyToks(aid, ns, toks) |
} |
panic(fmt.Errorf( |
"UNKNOWN datastore.indexValue field type: %s", field.Type())) |
@@ -98,31 +100,62 @@ func maybeIndexValue(val interface{}) interface{} { |
} |
} |
+func dsR2FProp(in datastore.Property) (ds.Property, error) { |
iannucci
2015/09/18 04:31:53
I extracted these functions out from the PropertyM
|
+ val := in.Value |
+ switch x := val.(type) { |
+ case datastore.ByteString: |
+ val = []byte(x) |
+ case *datastore.Key: |
+ val = dsR2F(x) |
+ case appengine.BlobKey: |
+ val = bs.Key(x) |
+ case appengine.GeoPoint: |
+ val = ds.GeoPoint(x) |
+ case time.Time: |
+ // "appengine" layer instantiates with Local timezone. |
+ val = x.UTC() |
+ default: |
+ val = maybeIndexValue(val) |
+ } |
+ ret := ds.Property{} |
+ is := ds.ShouldIndex |
+ if in.NoIndex { |
+ is = ds.NoIndex |
+ } |
+ err := ret.SetValue(val, is) |
+ return ret, err |
+} |
+ |
+func dsF2RProp(ctx context.Context, in ds.Property) (datastore.Property, error) { |
+ err := error(nil) |
+ ret := datastore.Property{ |
+ NoIndex: in.IndexSetting() == ds.NoIndex, |
+ } |
+ switch in.Type() { |
+ case ds.PTBytes: |
+ v := in.Value().([]byte) |
+ if in.IndexSetting() == ds.ShouldIndex { |
+ ret.Value = datastore.ByteString(v) |
+ } else { |
+ ret.Value = v |
+ } |
+ case ds.PTKey: |
+ ret.Value, err = dsF2R(ctx, in.Value().(*ds.Key)) |
+ case ds.PTBlobKey: |
+ ret.Value = appengine.BlobKey(in.Value().(bs.Key)) |
+ case ds.PTGeoPoint: |
+ ret.Value = appengine.GeoPoint(in.Value().(ds.GeoPoint)) |
+ default: |
+ ret.Value = in.Value() |
+ } |
+ return ret, err |
+} |
+ |
func (tf *typeFilter) Load(props []datastore.Property) error { |
tf.pm = make(ds.PropertyMap, len(props)) |
for _, p := range props { |
- val := p.Value |
- switch x := val.(type) { |
- case datastore.ByteString: |
- val = []byte(x) |
- case *datastore.Key: |
- val = dsR2F(x) |
- case appengine.BlobKey: |
- val = bs.Key(x) |
- case appengine.GeoPoint: |
- val = ds.GeoPoint(x) |
- case time.Time: |
- // "appengine" layer instantiates with Local timezone. |
- val = x.UTC() |
- default: |
- val = maybeIndexValue(val) |
- } |
- prop := ds.Property{} |
- is := ds.ShouldIndex |
- if p.NoIndex { |
- is = ds.NoIndex |
- } |
- if err := prop.SetValue(val, is); err != nil { |
+ prop, err := dsR2FProp(p) |
+ if err != nil { |
return err |
} |
tf.pm[p.Name] = append(tf.pm[p.Name], prop) |
@@ -138,28 +171,12 @@ func (tf *typeFilter) Save() ([]datastore.Property, error) { |
} |
multiple := len(propList) > 1 |
for _, prop := range propList { |
- toAdd := datastore.Property{ |
- Name: name, |
- Multiple: multiple, |
- NoIndex: prop.IndexSetting() == ds.NoIndex, |
- } |
- switch prop.Type() { |
- case ds.PTBytes: |
- v := prop.Value().([]byte) |
- if prop.IndexSetting() == ds.ShouldIndex { |
- toAdd.Value = datastore.ByteString(v) |
- } else { |
- toAdd.Value = v |
- } |
- case ds.PTKey: |
- toAdd.Value = dsF2R(prop.Value().(ds.Key)) |
- case ds.PTBlobKey: |
- toAdd.Value = appengine.BlobKey(prop.Value().(bs.Key)) |
- case ds.PTGeoPoint: |
- toAdd.Value = appengine.GeoPoint(prop.Value().(ds.GeoPoint)) |
- default: |
- toAdd.Value = prop.Value() |
+ toAdd, err := dsF2RProp(tf.ctx, prop) |
+ if err != nil { |
+ return nil, err |
} |
+ toAdd.Name = name |
+ toAdd.Multiple = multiple |
props = append(props, toAdd) |
} |
} |