Index: go/src/infra/gae/libs/wrapper/memory/context.go |
diff --git a/go/src/infra/gae/libs/wrapper/memory/context.go b/go/src/infra/gae/libs/wrapper/memory/context.go |
deleted file mode 100644 |
index b6607fcc4d0231f8b23874083be039c09a157545..0000000000000000000000000000000000000000 |
--- a/go/src/infra/gae/libs/wrapper/memory/context.go |
+++ /dev/null |
@@ -1,168 +0,0 @@ |
-// Copyright 2015 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-package memory |
- |
-import ( |
- "errors" |
- "sync" |
- |
- "golang.org/x/net/context" |
- |
- "appengine/datastore" |
-) |
- |
-type memContextObj interface { |
- sync.Locker |
- canApplyTxn(m memContextObj) bool |
- applyTxn(c context.Context, m memContextObj) |
- |
- endTxn() |
- mkTxn(*datastore.TransactionOptions) (memContextObj, error) |
-} |
- |
-type memContext []memContextObj |
- |
-var _ = memContextObj((memContext)(nil)) |
- |
-func newMemContext() memContext { |
- return memContext{ |
- newTaskQueueData(), |
- newDataStoreData(), |
- } |
-} |
- |
-type memContextIdx int |
- |
-const ( |
- memContextTQIdx memContextIdx = iota |
- memContextDSIdx |
-) |
- |
-func (m memContext) Get(itm memContextIdx) memContextObj { |
- return m[itm] |
-} |
- |
-func (m memContext) Lock() { |
- for _, itm := range m { |
- itm.Lock() |
- } |
-} |
- |
-func (m memContext) Unlock() { |
- for i := len(m) - 1; i >= 0; i-- { |
- m[i].Unlock() |
- } |
-} |
- |
-func (m memContext) endTxn() { |
- for _, itm := range m { |
- itm.endTxn() |
- } |
-} |
- |
-func (m memContext) mkTxn(o *datastore.TransactionOptions) (memContextObj, error) { |
- ret := make(memContext, len(m)) |
- for i, itm := range m { |
- newItm, err := itm.mkTxn(o) |
- if err != nil { |
- return nil, err |
- } |
- ret[i] = newItm |
- } |
- return ret, nil |
-} |
- |
-func (m memContext) canApplyTxn(txnCtxObj memContextObj) bool { |
- txnCtx := txnCtxObj.(memContext) |
- for i := range m { |
- if !m[i].canApplyTxn(txnCtx[i]) { |
- return false |
- } |
- } |
- return true |
-} |
- |
-func (m memContext) applyTxn(c context.Context, txnCtxObj memContextObj) { |
- txnCtx := txnCtxObj.(memContext) |
- for i := range m { |
- m[i].applyTxn(c, txnCtx[i]) |
- } |
-} |
- |
-// Use adds implementations for the following gae/wrapper interfaces to the |
-// context: |
-// * wrapper.Datastore |
-// * wrapper.TaskQueue |
-// * wrapper.Memcache |
-// * wrapper.GlobalInfo |
-// |
-// These can be retrieved with the "gae/wrapper".Get functions. |
-// |
-// The implementations are all backed by an in-memory implementation, and start |
-// with an empty state. |
-// |
-// Using this more than once per context.Context will cause a panic. |
-func Use(c context.Context) context.Context { |
- if c.Value(memContextKey) != nil { |
- panic(errors.New("memory.Use: called twice on the same Context")) |
- } |
- c = context.WithValue( |
- context.WithValue(c, memContextKey, newMemContext()), |
- giContextKey, &globalInfoData{}) |
- return useTQ(useDS(useMC(useGI(c)))) |
-} |
- |
-func cur(c context.Context) (p memContext) { |
- p, _ = c.Value(memContextKey).(memContext) |
- return |
-} |
- |
-type memContextKeyType int |
- |
-var memContextKey memContextKeyType |
- |
-// weird stuff |
- |
-// RunInTransaction is here because it's really a service-wide transaction, not |
-// just in the datastore. TaskQueue behaves differently in a transaction in |
-// a couple ways, for example. |
-// |
-// It really should have been appengine.Context.RunInTransaction(func(tc...)), |
-// but because it's not, this method is on dsImpl instead to mirror the official |
-// API. |
-// |
-// The fake implementation also differs from the real implementation because the |
-// fake TaskQueue is NOT backed by the fake Datastore. This is done to make the |
-// test-access API for TaskQueue better (instead of trying to reconstitute the |
-// state of the task queue from a bunch of datastore accesses). |
-func (d *dsImpl) RunInTransaction(f func(context.Context) error, o *datastore.TransactionOptions) error { |
- curMC := cur(d.c) |
- |
- txnMC, err := curMC.mkTxn(o) |
- if err != nil { |
- return err |
- } |
- |
- defer func() { |
- txnMC.Lock() |
- defer txnMC.Unlock() |
- |
- txnMC.endTxn() |
- }() |
- |
- if err = f(context.WithValue(d.c, memContextKey, txnMC)); err != nil { |
- return err |
- } |
- |
- txnMC.Lock() |
- defer txnMC.Unlock() |
- |
- if curMC.canApplyTxn(txnMC) { |
- curMC.applyTxn(d.c, txnMC) |
- } else { |
- return datastore.ErrConcurrentTransaction |
- } |
- return nil |
-} |