OLD | NEW |
(Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 package memcache |
| 6 |
| 7 import ( |
| 8 "github.com/luci/luci-go/common/errors" |
| 9 "golang.org/x/net/context" |
| 10 ) |
| 11 |
| 12 type memcacheImpl struct{ RawInterface } |
| 13 |
| 14 var _ Interface = (*memcacheImpl)(nil) |
| 15 |
| 16 func (m *memcacheImpl) Add(item Item) error { |
| 17 return errors.SingleError(m.AddMulti([]Item{item})) |
| 18 } |
| 19 |
| 20 func (m *memcacheImpl) Set(item Item) error { |
| 21 return errors.SingleError(m.SetMulti([]Item{item})) |
| 22 } |
| 23 |
| 24 func (m *memcacheImpl) Get(item Item) error { |
| 25 return errors.SingleError(m.GetMulti([]Item{item})) |
| 26 } |
| 27 |
| 28 func (m *memcacheImpl) Delete(key string) error { |
| 29 return errors.SingleError(m.DeleteMulti([]string{key})) |
| 30 } |
| 31 |
| 32 func (m *memcacheImpl) CompareAndSwap(item Item) error { |
| 33 return errors.SingleError(m.CompareAndSwapMulti([]Item{item})) |
| 34 } |
| 35 |
| 36 func multiCall(items []Item, inner func(items []Item, cb RawCB) error) error { |
| 37 lme := errors.LazyMultiError{Size: len(items)} |
| 38 i := 0 |
| 39 err := inner(items, func(err error) { |
| 40 lme.Assign(i, err) |
| 41 i++ |
| 42 }) |
| 43 if err == nil { |
| 44 err = lme.Get() |
| 45 } |
| 46 return err |
| 47 } |
| 48 |
| 49 func (m *memcacheImpl) AddMulti(items []Item) error { |
| 50 return multiCall(items, m.RawInterface.AddMulti) |
| 51 } |
| 52 |
| 53 func (m *memcacheImpl) SetMulti(items []Item) error { |
| 54 return multiCall(items, m.RawInterface.SetMulti) |
| 55 } |
| 56 |
| 57 func (m *memcacheImpl) CompareAndSwapMulti(items []Item) error { |
| 58 return multiCall(items, m.RawInterface.CompareAndSwapMulti) |
| 59 } |
| 60 |
| 61 func (m *memcacheImpl) DeleteMulti(keys []string) error { |
| 62 lme := errors.LazyMultiError{Size: len(keys)} |
| 63 i := 0 |
| 64 err := m.RawInterface.DeleteMulti(keys, func(err error) { |
| 65 lme.Assign(i, err) |
| 66 i++ |
| 67 }) |
| 68 if err == nil { |
| 69 err = lme.Get() |
| 70 } |
| 71 return err |
| 72 } |
| 73 |
| 74 func (m *memcacheImpl) GetMulti(items []Item) error { |
| 75 lme := errors.LazyMultiError{Size: len(items)} |
| 76 i := 0 |
| 77 keys := make([]string, len(items)) |
| 78 for i, itm := range items { |
| 79 keys[i] = itm.Key() |
| 80 } |
| 81 err := m.RawInterface.GetMulti(keys, func(item Item, err error) { |
| 82 if !lme.Assign(i, err) { |
| 83 items[i].SetAll(item) |
| 84 } |
| 85 i++ |
| 86 }) |
| 87 if err == nil { |
| 88 err = lme.Get() |
| 89 } |
| 90 return err |
| 91 } |
| 92 |
| 93 func (m *memcacheImpl) Increment(key string, delta int64, initialValue uint64) (
newValue uint64, err error) { |
| 94 return m.RawInterface.Increment(key, delta, &initialValue) |
| 95 } |
| 96 |
| 97 func (m *memcacheImpl) IncrementExisting(key string, delta int64) (newValue uint
64, err error) { |
| 98 return m.RawInterface.Increment(key, delta, nil) |
| 99 } |
| 100 |
| 101 func (m *memcacheImpl) Raw() RawInterface { return m.RawInterface } |
| 102 |
| 103 // Get gets the current memcache implementation from the context. |
| 104 func Get(c context.Context) Interface { |
| 105 return &memcacheImpl{GetRaw(c)} |
| 106 } |
OLD | NEW |