Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(205)

Side by Side Diff: service/memcache/memcache.go

Issue 2302743002: Interface update, per-method Contexts. (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 The LUCI Authors. All rights reserved.
2 // Use of this source code is governed under the Apache License, Version 2.0
3 // that can be 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(key string) (Item, error) {
25 ret := m.NewItem(key)
26 err := errors.SingleError(m.GetMulti([]Item{ret}))
27 return ret, err
28 }
29
30 func (m *memcacheImpl) Delete(key string) error {
31 return errors.SingleError(m.DeleteMulti([]string{key}))
32 }
33
34 func (m *memcacheImpl) CompareAndSwap(item Item) error {
35 return errors.SingleError(m.CompareAndSwapMulti([]Item{item}))
36 }
37
38 func filterItems(lme errors.LazyMultiError, items []Item, nilErr error) ([]Item, []int) {
39 idxMap := make([]int, 0, len(items))
40 retItems := make([]Item, 0, len(items))
41 for i, itm := range items {
42 if itm != nil {
43 idxMap = append(idxMap, i)
44 retItems = append(retItems, itm)
45 } else {
46 lme.Assign(i, nilErr)
47 }
48 }
49 return retItems, idxMap
50 }
51
52 func multiCall(items []Item, nilErr error, inner func(items []Item, cb RawCB) er ror) error {
53 lme := errors.NewLazyMultiError(len(items))
54 realItems, idxMap := filterItems(lme, items, nilErr)
55 j := 0
56 err := inner(realItems, func(err error) {
57 lme.Assign(idxMap[j], err)
58 j++
59 })
60 if err == nil {
61 err = lme.Get()
62 }
63 return err
64 }
65
66 func (m *memcacheImpl) AddMulti(items []Item) error {
67 return multiCall(items, ErrNotStored, m.RawInterface.AddMulti)
68 }
69
70 func (m *memcacheImpl) SetMulti(items []Item) error {
71 return multiCall(items, ErrNotStored, m.RawInterface.SetMulti)
72 }
73
74 func (m *memcacheImpl) CompareAndSwapMulti(items []Item) error {
75 return multiCall(items, ErrNotStored, m.RawInterface.CompareAndSwapMulti )
76 }
77
78 func (m *memcacheImpl) DeleteMulti(keys []string) error {
79 lme := errors.NewLazyMultiError(len(keys))
80 i := 0
81 err := m.RawInterface.DeleteMulti(keys, func(err error) {
82 lme.Assign(i, err)
83 i++
84 })
85 if err == nil {
86 err = lme.Get()
87 }
88 return err
89 }
90
91 func (m *memcacheImpl) GetMulti(items []Item) error {
92 lme := errors.NewLazyMultiError(len(items))
93 realItems, idxMap := filterItems(lme, items, ErrCacheMiss)
94 if len(realItems) == 0 {
95 return lme.Get()
96 }
97
98 keys := make([]string, len(realItems))
99 for i, itm := range realItems {
100 keys[i] = itm.Key()
101 }
102
103 j := 0
104 err := m.RawInterface.GetMulti(keys, func(item Item, err error) {
105 i := idxMap[j]
106 if !lme.Assign(i, err) {
107 items[i].SetAll(item)
108 }
109 j++
110 })
111 if err == nil {
112 err = lme.Get()
113 }
114 return err
115 }
116
117 func (m *memcacheImpl) Increment(key string, delta int64, initialValue uint64) ( newValue uint64, err error) {
118 return m.RawInterface.Increment(key, delta, &initialValue)
119 }
120
121 func (m *memcacheImpl) IncrementExisting(key string, delta int64) (newValue uint 64, err error) {
122 return m.RawInterface.Increment(key, delta, nil)
123 }
124
125 func (m *memcacheImpl) Raw() RawInterface { return m.RawInterface }
126
127 // Get gets the current memcache implementation from the context.
128 func Get(c context.Context) Interface {
129 return &memcacheImpl{GetRaw(c)}
130 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698