| 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
|
| -}
|
|
|