Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
|
dnj (Google)
2015/08/23 06:50:07
Perhaps you already have, but would be worthwhile
iannucci
2015/08/23 18:19:43
Yeah, it would be. I was thinking about doing that
| |
| 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 memory | 5 package memory |
| 6 | 6 |
| 7 import ( | 7 import ( |
| 8 "errors" | 8 "errors" |
| 9 "fmt" | 9 "fmt" |
| 10 | 10 |
| 11 "golang.org/x/net/context" | 11 "golang.org/x/net/context" |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 62 func (d *dsImpl) DeleteMulti(keys []ds.Key, cb ds.DeleteMultiCB) error { | 62 func (d *dsImpl) DeleteMulti(keys []ds.Key, cb ds.DeleteMultiCB) error { |
| 63 d.data.delMulti(keys, cb) | 63 d.data.delMulti(keys, cb) |
| 64 return nil | 64 return nil |
| 65 } | 65 } |
| 66 | 66 |
| 67 func (d *dsImpl) NewQuery(kind string) ds.Query { | 67 func (d *dsImpl) NewQuery(kind string) ds.Query { |
| 68 return &queryImpl{ns: d.ns, kind: kind} | 68 return &queryImpl{ns: d.ns, kind: kind} |
| 69 } | 69 } |
| 70 | 70 |
| 71 func (d *dsImpl) DecodeCursor(s string) (ds.Cursor, error) { | 71 func (d *dsImpl) DecodeCursor(s string) (ds.Cursor, error) { |
| 72 » return decodeCursor(s) | 72 » return newCursor(s) |
| 73 } | 73 } |
| 74 | 74 |
| 75 func (d *dsImpl) Run(q ds.Query, cb ds.RawRunCB) error { | 75 func (d *dsImpl) Run(q ds.Query, cb ds.RawRunCB) error { |
| 76 rq := q.(*queryImpl) | 76 rq := q.(*queryImpl) |
| 77 » done, err := rq.valid(d.ns, true) | 77 » consistent := rq.eqFilters["__ancestor__"] != nil && !rq.eventualConsist ency |
| 78 » if done || err != nil { | 78 » idx, head := d.data.getQuerySnaps(consistent) |
| 79 » » return err // will be nil if done | 79 » return executeQuery(q, d.ns, false, idx, head, cb) |
| 80 » } | |
| 81 » return nil | |
| 82 } | 80 } |
| 83 | 81 |
| 84 func (d *dsImpl) AddIndexes(idxs ...*ds.IndexDefinition) { | 82 func (d *dsImpl) AddIndexes(idxs ...*ds.IndexDefinition) { |
| 83 if len(idxs) == 0 { | |
| 84 return | |
| 85 } | |
| 86 | |
| 85 for _, i := range idxs { | 87 for _, i := range idxs { |
| 86 if !i.Compound() { | 88 if !i.Compound() { |
| 87 panic(fmt.Errorf("Attempted to add non-compound index: % s", i)) | 89 panic(fmt.Errorf("Attempted to add non-compound index: % s", i)) |
| 88 } | 90 } |
| 89 } | 91 } |
| 90 | 92 |
| 91 d.data.Lock() | 93 d.data.Lock() |
| 92 defer d.data.Unlock() | 94 defer d.data.Unlock() |
| 93 addIndex(d.data.store, d.ns, idxs) | 95 addIndex(d.data.store, d.ns, idxs) |
| 94 } | 96 } |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 139 }) | 141 }) |
| 140 } | 142 } |
| 141 | 143 |
| 142 func (d *txnDsImpl) DeleteMulti(keys []ds.Key, cb ds.DeleteMultiCB) error { | 144 func (d *txnDsImpl) DeleteMulti(keys []ds.Key, cb ds.DeleteMultiCB) error { |
| 143 return d.data.run(func() error { | 145 return d.data.run(func() error { |
| 144 return d.data.delMulti(keys, cb) | 146 return d.data.delMulti(keys, cb) |
| 145 }) | 147 }) |
| 146 } | 148 } |
| 147 | 149 |
| 148 func (d *txnDsImpl) DecodeCursor(s string) (ds.Cursor, error) { | 150 func (d *txnDsImpl) DecodeCursor(s string) (ds.Cursor, error) { |
| 149 » return decodeCursor(s) | 151 » return newCursor(s) |
| 150 } | 152 } |
| 151 | 153 |
| 152 func (d *txnDsImpl) Run(q ds.Query, cb ds.RawRunCB) error { | 154 func (d *txnDsImpl) Run(q ds.Query, cb ds.RawRunCB) error { |
| 153 » rq := q.(*queryImpl) | 155 » return executeQuery(q, d.ns, true, d.data.snap, d.data.snap, cb) |
| 154 » done, err := rq.valid(d.ns, true) | |
| 155 » if done || err != nil { | |
| 156 » » return err // will be nil if done | |
| 157 » } | |
| 158 » if rq.eventualConsistency { | |
| 159 » » rq = rq.checkMutateClone(nil, nil) | |
| 160 » » rq.eventualConsistency = false | |
| 161 » } | |
| 162 » // TODO(riannucci): use head instead of snap for indexes | |
| 163 » panic("NOT IMPLEMENTED") | |
| 164 } | 156 } |
| 165 | 157 |
| 166 func (*txnDsImpl) RunInTransaction(func(c context.Context) error, *ds.Transactio nOptions) error { | 158 func (*txnDsImpl) RunInTransaction(func(c context.Context) error, *ds.Transactio nOptions) error { |
| 167 return errors.New("datastore: nested transactions are not supported") | 159 return errors.New("datastore: nested transactions are not supported") |
| 168 } | 160 } |
| 169 | 161 |
| 170 func (d *txnDsImpl) NewQuery(kind string) ds.Query { | 162 func (d *txnDsImpl) NewQuery(kind string) ds.Query { |
| 171 return &queryImpl{ns: d.ns, kind: kind} | 163 return &queryImpl{ns: d.ns, kind: kind} |
| 172 } | 164 } |
| 173 | 165 |
| 174 func (*txnDsImpl) Testable() ds.Testable { | 166 func (*txnDsImpl) Testable() ds.Testable { |
| 175 return nil | 167 return nil |
| 176 } | 168 } |
| OLD | NEW |