| Index: service/memcache/memcache.go
|
| diff --git a/service/memcache/memcache.go b/service/memcache/memcache.go
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e9a1e40bd77ffc08e0440b43156c64ceb32af267
|
| --- /dev/null
|
| +++ b/service/memcache/memcache.go
|
| @@ -0,0 +1,106 @@
|
| +// 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 memcache
|
| +
|
| +import (
|
| + "github.com/luci/luci-go/common/errors"
|
| + "golang.org/x/net/context"
|
| +)
|
| +
|
| +type memcacheImpl struct{ RawInterface }
|
| +
|
| +var _ Interface = (*memcacheImpl)(nil)
|
| +
|
| +func (m *memcacheImpl) Add(item Item) error {
|
| + return errors.SingleError(m.AddMulti([]Item{item}))
|
| +}
|
| +
|
| +func (m *memcacheImpl) Set(item Item) error {
|
| + return errors.SingleError(m.SetMulti([]Item{item}))
|
| +}
|
| +
|
| +func (m *memcacheImpl) Get(item Item) error {
|
| + return errors.SingleError(m.GetMulti([]Item{item}))
|
| +}
|
| +
|
| +func (m *memcacheImpl) Delete(key string) error {
|
| + return errors.SingleError(m.DeleteMulti([]string{key}))
|
| +}
|
| +
|
| +func (m *memcacheImpl) CompareAndSwap(item Item) error {
|
| + return errors.SingleError(m.CompareAndSwapMulti([]Item{item}))
|
| +}
|
| +
|
| +func multiCall(items []Item, inner func(items []Item, cb RawCB) error) error {
|
| + lme := errors.LazyMultiError{Size: len(items)}
|
| + i := 0
|
| + err := inner(items, func(err error) {
|
| + lme.Assign(i, err)
|
| + i++
|
| + })
|
| + if err == nil {
|
| + err = lme.Get()
|
| + }
|
| + return err
|
| +}
|
| +
|
| +func (m *memcacheImpl) AddMulti(items []Item) error {
|
| + return multiCall(items, m.RawInterface.AddMulti)
|
| +}
|
| +
|
| +func (m *memcacheImpl) SetMulti(items []Item) error {
|
| + return multiCall(items, m.RawInterface.SetMulti)
|
| +}
|
| +
|
| +func (m *memcacheImpl) CompareAndSwapMulti(items []Item) error {
|
| + return multiCall(items, m.RawInterface.CompareAndSwapMulti)
|
| +}
|
| +
|
| +func (m *memcacheImpl) DeleteMulti(keys []string) error {
|
| + lme := errors.LazyMultiError{Size: len(keys)}
|
| + i := 0
|
| + err := m.RawInterface.DeleteMulti(keys, func(err error) {
|
| + lme.Assign(i, err)
|
| + i++
|
| + })
|
| + if err == nil {
|
| + err = lme.Get()
|
| + }
|
| + return err
|
| +}
|
| +
|
| +func (m *memcacheImpl) GetMulti(items []Item) error {
|
| + lme := errors.LazyMultiError{Size: len(items)}
|
| + i := 0
|
| + keys := make([]string, len(items))
|
| + for i, itm := range items {
|
| + keys[i] = itm.Key()
|
| + }
|
| + err := m.RawInterface.GetMulti(keys, func(item Item, err error) {
|
| + if !lme.Assign(i, err) {
|
| + items[i].SetAll(item)
|
| + }
|
| + i++
|
| + })
|
| + if err == nil {
|
| + err = lme.Get()
|
| + }
|
| + return err
|
| +}
|
| +
|
| +func (m *memcacheImpl) Increment(key string, delta int64, initialValue uint64) (newValue uint64, err error) {
|
| + return m.RawInterface.Increment(key, delta, &initialValue)
|
| +}
|
| +
|
| +func (m *memcacheImpl) IncrementExisting(key string, delta int64) (newValue uint64, err error) {
|
| + return m.RawInterface.Increment(key, delta, nil)
|
| +}
|
| +
|
| +func (m *memcacheImpl) Raw() RawInterface { return m.RawInterface }
|
| +
|
| +// Get gets the current memcache implementation from the context.
|
| +func Get(c context.Context) Interface {
|
| + return &memcacheImpl{GetRaw(c)}
|
| +}
|
|
|