| Index: go/src/infra/gae/libs/gae/memcache.go
|
| diff --git a/go/src/infra/gae/libs/gae/memcache.go b/go/src/infra/gae/libs/gae/memcache.go
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..63d4f1fd58c92289ce48f1ec90908fb3b6d73568
|
| --- /dev/null
|
| +++ b/go/src/infra/gae/libs/gae/memcache.go
|
| @@ -0,0 +1,79 @@
|
| +// 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 gae
|
| +
|
| +import (
|
| + "time"
|
| +
|
| + "golang.org/x/net/context"
|
| +)
|
| +
|
| +// MCItem is a wrapper around *memcache.Item. Note that the Set* methods all
|
| +// return the original MCItem (e.g. they mutate the original), due to
|
| +// implementation constraints. They return the original item to allow easy
|
| +// chaining, e.g.:
|
| +// itm := gae.MC(c).NewItem("foo").SetValue([]byte("stuff"))
|
| +type MCItem interface {
|
| + Key() string
|
| + Value() []byte
|
| + Object() interface{}
|
| + Flags() uint32
|
| + Expiration() time.Duration
|
| +
|
| + SetKey(string) MCItem
|
| + SetValue([]byte) MCItem
|
| + SetObject(interface{}) MCItem
|
| + SetFlags(uint32) MCItem
|
| + SetExpiration(time.Duration) MCItem
|
| +}
|
| +
|
| +// Memcache is the full interface to the memcache service.
|
| +type Memcache interface {
|
| + NewItem(key string) MCItem
|
| +
|
| + Add(item MCItem) error
|
| + Set(item MCItem) error
|
| + Get(key string) (MCItem, error)
|
| + Delete(key string) error
|
| + CompareAndSwap(item MCItem) error
|
| +
|
| + AddMulti(items []MCItem) error
|
| + SetMulti(items []MCItem) error
|
| + GetMulti(keys []string) (map[string]MCItem, error)
|
| + DeleteMulti(keys []string) error
|
| + CompareAndSwapMulti(items []MCItem) error
|
| +
|
| + Increment(key string, delta int64, initialValue uint64) (newValue uint64, err error)
|
| + IncrementExisting(key string, delta int64) (newValue uint64, err error)
|
| +
|
| + Flush() error
|
| +
|
| + Stats() (*MCStatistics, error)
|
| +}
|
| +
|
| +// MCFactory is the function signature for factory methods compatible with
|
| +// SetMCFactory.
|
| +type MCFactory func(context.Context) Memcache
|
| +
|
| +// GetMC gets the current memcache implementation from the context.
|
| +func GetMC(c context.Context) Memcache {
|
| + if f, ok := c.Value(memcacheKey).(MCFactory); ok && f != nil {
|
| + return f(c)
|
| + }
|
| + return nil
|
| +}
|
| +
|
| +// SetMCFactory sets the function to produce Memcache instances, as returned by
|
| +// the GetMC method.
|
| +func SetMCFactory(c context.Context, mcf MCFactory) context.Context {
|
| + return context.WithValue(c, memcacheKey, mcf)
|
| +}
|
| +
|
| +// SetMC sets the current Memcache object in the context. Useful for testing
|
| +// with a quick mock. This is just a shorthand SetMCFactory invocation to set
|
| +// a factory which always returns the same object.
|
| +func SetMC(c context.Context, mc Memcache) context.Context {
|
| + return SetMCFactory(c, func(context.Context) Memcache { return mc })
|
| +}
|
|
|