Index: impl/memory/raw_datastore_query.go |
diff --git a/impl/memory/raw_datastore_query.go b/impl/memory/raw_datastore_query.go |
index 1ee48f36d8de0c8f85cd3731c0798233dd00903e..90498931bcaa4b2951897140de4e1524000397bb 100644 |
--- a/impl/memory/raw_datastore_query.go |
+++ b/impl/memory/raw_datastore_query.go |
@@ -238,26 +238,6 @@ type queryImpl struct { |
var _ rds.Query = (*queryImpl)(nil) |
-type queryIterImpl struct { |
- idx *queryImpl |
-} |
- |
-var _ rds.Iterator = (*queryIterImpl)(nil) |
- |
-func (q *queryIterImpl) Cursor() (rds.Cursor, error) { |
- if q.idx.err != nil { |
- return nil, q.idx.err |
- } |
- return nil, nil |
-} |
- |
-func (q *queryIterImpl) Next(dst rds.PropertyLoadSaver) (rds.Key, error) { |
- if q.idx.err != nil { |
- return nil, q.idx.err |
- } |
- return nil, nil |
-} |
- |
func (q *queryImpl) normalize() (ret *queryImpl) { |
// ported from GAE SDK datastore_index.py;Normalize() |
ret = q.clone() |
@@ -392,13 +372,17 @@ func (q *queryImpl) checkCorrectness(ns string, isTxn bool) (ret *queryImpl) { |
"gae/memory: __key__ filter value must be a Key") |
return |
} |
- if !rds.KeyValid(k, ret.ns, false) { |
+ if !rds.KeyValid(k, false, globalAppID, q.ns) { |
// See the comment in queryImpl.Ancestor; basically this check |
// never happens in the real env because the SDK silently swallows |
// this condition :/ |
ret.err = rds.ErrInvalidKey |
return |
} |
+ if k.Namespace() != ns { |
+ ret.err = fmt.Errorf("bad namespace: %q (expected %q)", k.Namespace(), ns) |
+ return |
+ } |
// __key__ filter app is X but query app is X |
// __key__ filter namespace is X but query namespace is X |
} |
@@ -480,13 +464,15 @@ func (q *queryImpl) Ancestor(k rds.Key) rds.Query { |
if k == nil { |
// SDK has an explicit nil-check |
q.err = errors.New("datastore: nil query ancestor") |
- } else if !rds.KeyValid(k, q.ns, false) { |
+ } else if !rds.KeyValid(k, false, globalAppID, q.ns) { |
// technically the SDK implementation does a Weird Thing (tm) if both the |
// stringID and intID are set on a key; it only serializes the stringID in |
// the proto. This means that if you set the Ancestor to an invalid key, |
// you'll never actually hear about it. Instead of doing that insanity, we |
// just swap to an error here. |
q.err = rds.ErrInvalidKey |
+ } else if k.Namespace() != q.ns { |
+ q.err = fmt.Errorf("bad namespace: %q (expected %q)", k.Namespace(), q.ns) |
} |
return q |
} |