| Index: service/datastore/context.go | 
| diff --git a/service/datastore/context.go b/service/datastore/context.go | 
| index 717797bb3eb94694fad9b80dfda7efb8a1c4d889..8557a5f5fb77cc593a480bfa375f1db31a8826d3 100644 | 
| --- a/service/datastore/context.go | 
| +++ b/service/datastore/context.go | 
| @@ -6,6 +6,7 @@ package datastore | 
|  | 
| import ( | 
| "github.com/luci/gae/service/info" | 
| + | 
| "golang.org/x/net/context" | 
| ) | 
|  | 
| @@ -17,10 +18,8 @@ var ( | 
| ) | 
|  | 
| // RawFactory is the function signature for factory methods compatible with | 
| -// SetRawFactory. wantTxn is true if the Factory should return the datastore in | 
| -// the current transaction, and false if the Factory should return the | 
| -// non-transactional (root) datastore. | 
| -type RawFactory func(c context.Context, wantTxn bool) RawInterface | 
| +// SetRawFactory. | 
| +type RawFactory func(c context.Context) RawInterface | 
|  | 
| // RawFilter is the function signature for a RawFilter implementation. It | 
| // gets the current RDS implementation, and returns a new RDS implementation | 
| @@ -29,17 +28,17 @@ type RawFilter func(context.Context, RawInterface) RawInterface | 
|  | 
| // getUnfiltered gets gets the RawInterface implementation from context without | 
| // any of the filters applied. | 
| -func getUnfiltered(c context.Context, wantTxn bool) RawInterface { | 
| +func getUnfiltered(c context.Context) RawInterface { | 
| if f, ok := c.Value(rawDatastoreKey).(RawFactory); ok && f != nil { | 
| -		return f(c, wantTxn) | 
| +		return f(c) | 
| } | 
| return nil | 
| } | 
|  | 
| // getFiltered gets the datastore (transactional or not), and applies all of | 
| // the currently installed filters to it. | 
| -func getFiltered(c context.Context, wantTxn bool) RawInterface { | 
| -	ret := getUnfiltered(c, wantTxn) | 
| +func getFiltered(c context.Context) RawInterface { | 
| +	ret := getUnfiltered(c) | 
| if ret == nil { | 
| return nil | 
| } | 
| @@ -49,45 +48,13 @@ func getFiltered(c context.Context, wantTxn bool) RawInterface { | 
| return applyCheckFilter(c, ret) | 
| } | 
|  | 
| -// GetRaw gets the RawInterface implementation from context. | 
| -func GetRaw(c context.Context) RawInterface { | 
| -	return getFiltered(c, true) | 
| -} | 
| - | 
| -// GetRawNoTxn gets the RawInterface implementation from context. If there's a | 
| -// currently active transaction, this will return a non-transactional connection | 
| -// to the datastore, otherwise this is the same as GetRaw. | 
| -func GetRawNoTxn(c context.Context) RawInterface { | 
| -	return getFiltered(c, false) | 
| -} | 
| - | 
| -// Get gets the Interface implementation from context. | 
| -func Get(c context.Context) Interface { | 
| -	inf := info.Get(c) | 
| -	ns, _ := inf.GetNamespace() | 
| -	return &datastoreImpl{ | 
| -		GetRaw(c), | 
| -		inf.FullyQualifiedAppID(), | 
| -		ns, | 
| -	} | 
| -} | 
| - | 
| -// GetNoTxn gets the Interface implementation from context. If there's a | 
| -// currently active transaction, this will return a non-transactional connection | 
| -// to the datastore, otherwise this is the same as GetRaw. | 
| -// Get gets the Interface implementation from context. | 
| -func GetNoTxn(c context.Context) Interface { | 
| -	inf := info.Get(c) | 
| -	ns, _ := inf.GetNamespace() | 
| -	return &datastoreImpl{ | 
| -		GetRawNoTxn(c), | 
| -		inf.FullyQualifiedAppID(), | 
| -		ns, | 
| -	} | 
| +// Raw gets the RawInterface implementation from context. | 
| +func Raw(c context.Context) RawInterface { | 
| +	return getFiltered(c) | 
| } | 
|  | 
| // SetRawFactory sets the function to produce Datastore instances, as returned by | 
| -// the GetRaw method. | 
| +// the Raw method. | 
| func SetRawFactory(c context.Context, rdsf RawFactory) context.Context { | 
| return context.WithValue(c, rawDatastoreKey, rdsf) | 
| } | 
| @@ -96,7 +63,7 @@ func SetRawFactory(c context.Context, rdsf RawFactory) context.Context { | 
| // with a quick mock. This is just a shorthand SetRawFactory invocation to set | 
| // a factory which always returns the same object. | 
| func SetRaw(c context.Context, rds RawInterface) context.Context { | 
| -	return SetRawFactory(c, func(context.Context, bool) RawInterface { return rds }) | 
| +	return SetRawFactory(c, func(context.Context) RawInterface { return rds }) | 
| } | 
|  | 
| func getCurFilters(c context.Context) []RawFilter { | 
| @@ -118,3 +85,10 @@ func AddRawFilters(c context.Context, filts ...RawFilter) context.Context { | 
| newFilts = append(newFilts, filts...) | 
| return context.WithValue(c, rawDatastoreFilterKey, newFilts) | 
| } | 
| + | 
| +// GetKeyContext returns the KeyContext whose AppID and Namespace match those | 
| +// installed in the supplied Context. | 
| +func GetKeyContext(c context.Context) KeyContext { | 
| +	ri := info.Raw(c) | 
| +	return KeyContext{ri.FullyQualifiedAppID(), ri.GetNamespace()} | 
| +} | 
|  |