github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/pingcap/tidb/kv/memdb_buffer.go (about) 1 // Copyright 2015 PingCAP, Inc. 2 // 3 // Copyright 2015 Wenbin Xiao 4 // 5 // Licensed under the Apache License, Version 2.0 (the "License"); 6 // you may not use this file except in compliance with the License. 7 // You may obtain a copy of the License at 8 // 9 // http://www.apache.org/licenses/LICENSE-2.0 10 // 11 // Unless required by applicable law or agreed to in writing, software 12 // distributed under the License is distributed on an "AS IS" BASIS, 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 16 package kv 17 18 import ( 19 "github.com/insionng/yougam/libraries/juju/errors" 20 "github.com/insionng/yougam/libraries/pingcap/tidb/terror" 21 "github.com/insionng/yougam/libraries/syndtr/goleveldb/leveldb" 22 "github.com/insionng/yougam/libraries/syndtr/goleveldb/leveldb/comparer" 23 "github.com/insionng/yougam/libraries/syndtr/goleveldb/leveldb/iterator" 24 "github.com/insionng/yougam/libraries/syndtr/goleveldb/leveldb/memdb" 25 "github.com/insionng/yougam/libraries/syndtr/goleveldb/leveldb/util" 26 ) 27 28 type memDbBuffer struct { 29 db *memdb.DB 30 } 31 32 type memDbIter struct { 33 iter iterator.Iterator 34 reverse bool 35 } 36 37 // NewMemDbBuffer creates a new memDbBuffer. 38 func NewMemDbBuffer() MemBuffer { 39 return &memDbBuffer{db: memdb.New(comparer.DefaultComparer, 4*1024)} 40 } 41 42 // Seek creates an Iterator. 43 func (m *memDbBuffer) Seek(k Key) (Iterator, error) { 44 var i Iterator 45 if k == nil { 46 i = &memDbIter{iter: m.db.NewIterator(&util.Range{}), reverse: false} 47 } else { 48 i = &memDbIter{iter: m.db.NewIterator(&util.Range{Start: []byte(k)}), reverse: false} 49 } 50 i.Next() 51 return i, nil 52 } 53 54 func (m *memDbBuffer) SeekReverse(k Key) (Iterator, error) { 55 var i *memDbIter 56 if k == nil { 57 i = &memDbIter{iter: m.db.NewIterator(&util.Range{}), reverse: true} 58 } else { 59 i = &memDbIter{iter: m.db.NewIterator(&util.Range{Limit: []byte(k)}), reverse: true} 60 } 61 i.iter.Last() 62 return i, nil 63 } 64 65 // Get returns the value associated with key. 66 func (m *memDbBuffer) Get(k Key) ([]byte, error) { 67 v, err := m.db.Get(k) 68 if terror.ErrorEqual(err, leveldb.ErrNotFound) { 69 return nil, ErrNotExist 70 } 71 return v, nil 72 } 73 74 // Set associates key with value. 75 func (m *memDbBuffer) Set(k Key, v []byte) error { 76 if len(v) == 0 { 77 return errors.Trace(ErrCannotSetNilValue) 78 } 79 err := m.db.Put(k, v) 80 return errors.Trace(err) 81 } 82 83 // Delete removes the entry from buffer with provided key. 84 func (m *memDbBuffer) Delete(k Key) error { 85 err := m.db.Put(k, nil) 86 return errors.Trace(err) 87 } 88 89 // Release reset the buffer. 90 func (m *memDbBuffer) Release() { 91 m.db.Reset() 92 } 93 94 // Next implements the Iterator Next. 95 func (i *memDbIter) Next() error { 96 if i.reverse { 97 i.iter.Prev() 98 } else { 99 i.iter.Next() 100 } 101 return nil 102 } 103 104 // Valid implements the Iterator Valid. 105 func (i *memDbIter) Valid() bool { 106 return i.iter.Valid() 107 } 108 109 // Key implements the Iterator Key. 110 func (i *memDbIter) Key() Key { 111 return i.iter.Key() 112 } 113 114 // Value implements the Iterator Value. 115 func (i *memDbIter) Value() []byte { 116 return i.iter.Value() 117 } 118 119 // Close Implements the Iterator Close. 120 func (i *memDbIter) Close() { 121 i.iter.Release() 122 }