go/leveldb/snapshot.go

68 lines
1.4 KiB
Go

package leveldb
import (
"github.com/jmhodges/levigo"
)
type Snapshot struct {
db *DB
s *levigo.Snapshot
readOpts *levigo.ReadOptions
iteratorOpts *levigo.ReadOptions
}
func newSnapshot(db *DB) *Snapshot {
s := new(Snapshot)
s.db = db
s.s = db.db.NewSnapshot()
s.readOpts = levigo.NewReadOptions()
s.readOpts.SetSnapshot(s.s)
s.iteratorOpts = levigo.NewReadOptions()
s.iteratorOpts.SetSnapshot(s.s)
s.iteratorOpts.SetFillCache(false)
return s
}
func (s *Snapshot) Close() {
s.db.db.ReleaseSnapshot(s.s)
s.iteratorOpts.Close()
s.readOpts.Close()
}
func (s *Snapshot) Get(key []byte) ([]byte, error) {
return s.db.db.Get(s.readOpts, key)
}
//same as db iterator and reverse iterator
func (s *Snapshot) Iterator(begin []byte, end []byte, limit int) *Iterator {
return newIterator(s.db, s.iteratorOpts, begin, end, limit, forward)
}
func (s *Snapshot) ReverseIterator(rbegin []byte, rend []byte, limit int) *Iterator {
return newIterator(s.db, s.iteratorOpts, rbegin, rend, limit, backward)
}
func (s *Snapshot) GetInt(key []byte) (int64, error) {
return Int(s.Get(key))
}
func (s *Snapshot) GetUInt(key []byte) (uint64, error) {
return Uint(s.Get(key))
}
func (s *Snapshot) GetFloat(key []byte) (float64, error) {
return Float(s.Get(key))
}
func (s *Snapshot) GetString(key []byte) (string, error) {
return String(s.Get(key))
}
func (s *Snapshot) GetSlice(key []byte) ([]byte, error) {
return Slice(s.Get(key))
}