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  }