| Index: impl/memory/datastore.go
|
| diff --git a/impl/memory/datastore.go b/impl/memory/datastore.go
|
| index 37048d62051ef57f6128142a9fbbed145952df63..c01b4d4120a9f547e5de0d9675524ddc3f9198ee 100644
|
| --- a/impl/memory/datastore.go
|
| +++ b/impl/memory/datastore.go
|
| @@ -19,27 +19,14 @@ import (
|
| // useRDS adds a gae.Datastore implementation to context, accessible
|
| // by gae.GetDS(c)
|
| func useRDS(c context.Context) context.Context {
|
| - return ds.SetRawFactory(c, func(ic context.Context, wantTxn bool) ds.RawInterface {
|
| - ns, hasNS := curGID(ic).getNamespace()
|
| - maybeTxnCtx := cur(ic)
|
| -
|
| - needResetCtx := false
|
| - if !wantTxn {
|
| - rootctx := curNoTxn(ic)
|
| - if rootctx != maybeTxnCtx {
|
| - needResetCtx = true
|
| - maybeTxnCtx = rootctx
|
| - }
|
| + return ds.SetRawFactory(c, func(ic context.Context) ds.RawInterface {
|
| + kc := ds.GetKeyContext(ic)
|
| + memCtx, isTxn := cur(ic)
|
| + dsd := memCtx.Get(memContextDSIdx)
|
| + if isTxn {
|
| + return &txnDsImpl{ic, dsd.(*txnDataStoreData), kc}
|
| }
|
| -
|
| - dsd := maybeTxnCtx.Get(memContextDSIdx)
|
| - if x, ok := dsd.(*dataStoreData); ok {
|
| - if needResetCtx {
|
| - ic = context.WithValue(ic, memContextKey, maybeTxnCtx)
|
| - }
|
| - return &dsImpl{x, ns, hasNS, ic}
|
| - }
|
| - return &txnDsImpl{dsd.(*txnDataStoreData), ns, hasNS}
|
| + return &dsImpl{ic, dsd.(*dataStoreData), kc}
|
| })
|
| }
|
|
|
| @@ -51,18 +38,17 @@ func useRDS(c context.Context) context.Context {
|
| // * Consistent(true)
|
| // * DisableSpecialEntities(true)
|
| //
|
| -// These settings can of course be changed by using the Testable() interface.
|
| -func NewDatastore(inf info.Interface) ds.Interface {
|
| - fqAppID := inf.FullyQualifiedAppID()
|
| - ns, hasNS := inf.GetNamespace()
|
| +// These settings can of course be changed by using the Testable interface.
|
| +func NewDatastore(c context.Context, inf info.RawInterface) ds.RawInterface {
|
| + kc := ds.GetKeyContext(c)
|
|
|
| - memctx := newMemContext(fqAppID)
|
| + memctx := newMemContext(kc.AppID)
|
|
|
| dsCtx := info.Set(context.Background(), inf)
|
| - rds := &dsImpl{memctx.Get(memContextDSIdx).(*dataStoreData), ns, hasNS, dsCtx}
|
| + rds := &dsImpl{dsCtx, memctx.Get(memContextDSIdx).(*dataStoreData), kc}
|
|
|
| - ret := ds.Get(ds.SetRaw(dsCtx, rds))
|
| - t := ret.Testable()
|
| + ret := ds.Raw(ds.SetRaw(dsCtx, rds))
|
| + t := ret.GetTestable()
|
| t.AutoIndex(true)
|
| t.Consistent(true)
|
| t.DisableSpecialEntities(true)
|
| @@ -74,10 +60,10 @@ func NewDatastore(inf info.Interface) ds.Interface {
|
|
|
| // dsImpl exists solely to bind the current c to the datastore data.
|
| type dsImpl struct {
|
| - data *dataStoreData
|
| - ns string
|
| - hasNS bool
|
| - c context.Context
|
| + context.Context
|
| +
|
| + data *dataStoreData
|
| + kc ds.KeyContext
|
| }
|
|
|
| var _ ds.RawInterface = (*dsImpl)(nil)
|
| @@ -106,24 +92,31 @@ func (d *dsImpl) DecodeCursor(s string) (ds.Cursor, error) {
|
|
|
| func (d *dsImpl) Run(fq *ds.FinalizedQuery, cb ds.RawRunCB) error {
|
| idx, head := d.data.getQuerySnaps(!fq.EventuallyConsistent())
|
| - err := executeQuery(fq, d.data.aid, d.ns, false, idx, head, cb)
|
| + err := executeQuery(fq, d.kc, false, idx, head, cb)
|
| if d.data.maybeAutoIndex(err) {
|
| idx, head = d.data.getQuerySnaps(!fq.EventuallyConsistent())
|
| - err = executeQuery(fq, d.data.aid, d.ns, false, idx, head, cb)
|
| + err = executeQuery(fq, d.kc, false, idx, head, cb)
|
| }
|
| return err
|
| }
|
|
|
| func (d *dsImpl) Count(fq *ds.FinalizedQuery) (ret int64, err error) {
|
| idx, head := d.data.getQuerySnaps(!fq.EventuallyConsistent())
|
| - ret, err = countQuery(fq, d.data.aid, d.ns, false, idx, head)
|
| + ret, err = countQuery(fq, d.kc, false, idx, head)
|
| if d.data.maybeAutoIndex(err) {
|
| idx, head := d.data.getQuerySnaps(!fq.EventuallyConsistent())
|
| - ret, err = countQuery(fq, d.data.aid, d.ns, false, idx, head)
|
| + ret, err = countQuery(fq, d.kc, false, idx, head)
|
| }
|
| return
|
| }
|
|
|
| +func (d *dsImpl) WithoutTransaction() context.Context {
|
| + // Already not in a Transaction.
|
| + return d
|
| +}
|
| +
|
| +func (*dsImpl) CurrentTransaction() ds.Transaction { return nil }
|
| +
|
| func (d *dsImpl) AddIndexes(idxs ...*ds.IndexDefinition) {
|
| if len(idxs) == 0 {
|
| return
|
| @@ -166,16 +159,15 @@ func (d *dsImpl) DisableSpecialEntities(enabled bool) {
|
| d.data.setDisableSpecialEntities(enabled)
|
| }
|
|
|
| -func (d *dsImpl) Testable() ds.Testable {
|
| - return d
|
| -}
|
| +func (d *dsImpl) GetTestable() ds.Testable { return d }
|
|
|
| ////////////////////////////////// txnDsImpl ///////////////////////////////////
|
|
|
| type txnDsImpl struct {
|
| - data *txnDataStoreData
|
| - ns string
|
| - hasNS bool
|
| + context.Context
|
| +
|
| + data *txnDataStoreData
|
| + kc ds.KeyContext
|
| }
|
|
|
| var _ ds.RawInterface = (*txnDsImpl)(nil)
|
| @@ -203,9 +195,7 @@ func (d *txnDsImpl) DeleteMulti(keys []*ds.Key, cb ds.DeleteMultiCB) error {
|
| })
|
| }
|
|
|
| -func (d *txnDsImpl) DecodeCursor(s string) (ds.Cursor, error) {
|
| - return newCursor(s)
|
| -}
|
| +func (d *txnDsImpl) DecodeCursor(s string) (ds.Cursor, error) { return newCursor(s) }
|
|
|
| func (d *txnDsImpl) Run(q *ds.FinalizedQuery, cb ds.RawRunCB) error {
|
| // note that autoIndex has no effect inside transactions. This is because
|
| @@ -217,17 +207,23 @@ func (d *txnDsImpl) Run(q *ds.FinalizedQuery, cb ds.RawRunCB) error {
|
| // It's possible that if you have full-consistency and also auto index enabled
|
| // that this would make sense... but at that point you should probably just
|
| // add the index up front.
|
| - return executeQuery(q, d.data.parent.aid, d.ns, true, d.data.snap, d.data.snap, cb)
|
| + return executeQuery(q, d.kc, true, d.data.snap, d.data.snap, cb)
|
| }
|
|
|
| func (d *txnDsImpl) Count(fq *ds.FinalizedQuery) (ret int64, err error) {
|
| - return countQuery(fq, d.data.parent.aid, d.ns, true, d.data.snap, d.data.snap)
|
| + return countQuery(fq, d.kc, true, d.data.snap, d.data.snap)
|
| }
|
|
|
| func (*txnDsImpl) RunInTransaction(func(c context.Context) error, *ds.TransactionOptions) error {
|
| return errors.New("datastore: nested transactions are not supported")
|
| }
|
|
|
| -func (*txnDsImpl) Testable() ds.Testable {
|
| - return nil
|
| +func (d *txnDsImpl) WithoutTransaction() context.Context {
|
| + return context.WithValue(d, currentTxnKey, nil)
|
| +}
|
| +
|
| +func (d *txnDsImpl) CurrentTransaction() ds.Transaction {
|
| + return d.data.txn
|
| }
|
| +
|
| +func (d *txnDsImpl) GetTestable() ds.Testable { return nil }
|
|
|