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

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

Issue 1291813003: Make LazyMultiError constructed via function (Closed) Base URL: https://github.com/luci/gae.git@master
Patch Set: interface not pointer Created 5 years, 4 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
« no previous file with comments | « service/datastore/multiarg.go ('k') | service/taskqueue/taskqueue.go » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package memcache 5 package memcache
6 6
7 import ( 7 import (
8 "github.com/luci/luci-go/common/errors" 8 "github.com/luci/luci-go/common/errors"
9 "golang.org/x/net/context" 9 "golang.org/x/net/context"
10 ) 10 )
(...skipping 15 matching lines...) Expand all
26 } 26 }
27 27
28 func (m *memcacheImpl) Delete(key string) error { 28 func (m *memcacheImpl) Delete(key string) error {
29 return errors.SingleError(m.DeleteMulti([]string{key})) 29 return errors.SingleError(m.DeleteMulti([]string{key}))
30 } 30 }
31 31
32 func (m *memcacheImpl) CompareAndSwap(item Item) error { 32 func (m *memcacheImpl) CompareAndSwap(item Item) error {
33 return errors.SingleError(m.CompareAndSwapMulti([]Item{item})) 33 return errors.SingleError(m.CompareAndSwapMulti([]Item{item}))
34 } 34 }
35 35
36 func filterItems(lme *errors.LazyMultiError, items []Item, nilErr error) ([]Item , []int) { 36 func filterItems(lme errors.LazyMultiError, items []Item, nilErr error) ([]Item, []int) {
37 idxMap := make([]int, 0, len(items)) 37 idxMap := make([]int, 0, len(items))
38 retItems := make([]Item, 0, len(items)) 38 retItems := make([]Item, 0, len(items))
39 for i, itm := range items { 39 for i, itm := range items {
40 if itm != nil { 40 if itm != nil {
41 idxMap = append(idxMap, i) 41 idxMap = append(idxMap, i)
42 retItems = append(retItems, itm) 42 retItems = append(retItems, itm)
43 } else { 43 } else {
44 lme.Assign(i, nilErr) 44 lme.Assign(i, nilErr)
45 } 45 }
46 } 46 }
47 return retItems, idxMap 47 return retItems, idxMap
48 } 48 }
49 49
50 func multiCall(items []Item, nilErr error, inner func(items []Item, cb RawCB) er ror) error { 50 func multiCall(items []Item, nilErr error, inner func(items []Item, cb RawCB) er ror) error {
51 » lme := errors.LazyMultiError{Size: len(items)} 51 » lme := errors.NewLazyMultiError(len(items))
52 » realItems, idxMap := filterItems(&lme, items, nilErr) 52 » realItems, idxMap := filterItems(lme, items, nilErr)
53 j := 0 53 j := 0
54 err := inner(realItems, func(err error) { 54 err := inner(realItems, func(err error) {
55 lme.Assign(idxMap[j], err) 55 lme.Assign(idxMap[j], err)
56 j++ 56 j++
57 }) 57 })
58 if err == nil { 58 if err == nil {
59 err = lme.Get() 59 err = lme.Get()
60 } 60 }
61 return err 61 return err
62 } 62 }
63 63
64 func (m *memcacheImpl) AddMulti(items []Item) error { 64 func (m *memcacheImpl) AddMulti(items []Item) error {
65 return multiCall(items, ErrNotStored, m.RawInterface.AddMulti) 65 return multiCall(items, ErrNotStored, m.RawInterface.AddMulti)
66 } 66 }
67 67
68 func (m *memcacheImpl) SetMulti(items []Item) error { 68 func (m *memcacheImpl) SetMulti(items []Item) error {
69 return multiCall(items, ErrNotStored, m.RawInterface.SetMulti) 69 return multiCall(items, ErrNotStored, m.RawInterface.SetMulti)
70 } 70 }
71 71
72 func (m *memcacheImpl) CompareAndSwapMulti(items []Item) error { 72 func (m *memcacheImpl) CompareAndSwapMulti(items []Item) error {
73 return multiCall(items, ErrNotStored, m.RawInterface.CompareAndSwapMulti ) 73 return multiCall(items, ErrNotStored, m.RawInterface.CompareAndSwapMulti )
74 } 74 }
75 75
76 func (m *memcacheImpl) DeleteMulti(keys []string) error { 76 func (m *memcacheImpl) DeleteMulti(keys []string) error {
77 » lme := errors.LazyMultiError{Size: len(keys)} 77 » lme := errors.NewLazyMultiError(len(keys))
78 i := 0 78 i := 0
79 err := m.RawInterface.DeleteMulti(keys, func(err error) { 79 err := m.RawInterface.DeleteMulti(keys, func(err error) {
80 lme.Assign(i, err) 80 lme.Assign(i, err)
81 i++ 81 i++
82 }) 82 })
83 if err == nil { 83 if err == nil {
84 err = lme.Get() 84 err = lme.Get()
85 } 85 }
86 return err 86 return err
87 } 87 }
88 88
89 func (m *memcacheImpl) GetMulti(items []Item) error { 89 func (m *memcacheImpl) GetMulti(items []Item) error {
90 » lme := errors.LazyMultiError{Size: len(items)} 90 » lme := errors.NewLazyMultiError(len(items))
91 » realItems, idxMap := filterItems(&lme, items, ErrCacheMiss) 91 » realItems, idxMap := filterItems(lme, items, ErrCacheMiss)
92 if len(realItems) == 0 { 92 if len(realItems) == 0 {
93 return lme.Get() 93 return lme.Get()
94 } 94 }
95 95
96 keys := make([]string, len(realItems)) 96 keys := make([]string, len(realItems))
97 for i, itm := range realItems { 97 for i, itm := range realItems {
98 keys[i] = itm.Key() 98 keys[i] = itm.Key()
99 } 99 }
100 100
101 j := 0 101 j := 0
(...skipping 17 matching lines...) Expand all
119 func (m *memcacheImpl) IncrementExisting(key string, delta int64) (newValue uint 64, err error) { 119 func (m *memcacheImpl) IncrementExisting(key string, delta int64) (newValue uint 64, err error) {
120 return m.RawInterface.Increment(key, delta, nil) 120 return m.RawInterface.Increment(key, delta, nil)
121 } 121 }
122 122
123 func (m *memcacheImpl) Raw() RawInterface { return m.RawInterface } 123 func (m *memcacheImpl) Raw() RawInterface { return m.RawInterface }
124 124
125 // Get gets the current memcache implementation from the context. 125 // Get gets the current memcache implementation from the context.
126 func Get(c context.Context) Interface { 126 func Get(c context.Context) Interface {
127 return &memcacheImpl{GetRaw(c)} 127 return &memcacheImpl{GetRaw(c)}
128 } 128 }
OLDNEW
« no previous file with comments | « service/datastore/multiarg.go ('k') | service/taskqueue/taskqueue.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698