syncbase.store: memstore stream and snapshot
Change-Id: I10bd79f30838e6a0ab04dec2dc455f419f083b6f
diff --git a/services/syncbase/store/leveldb/db.go b/services/syncbase/store/leveldb/db.go
index 57556c1..b15374d 100644
--- a/services/syncbase/store/leveldb/db.go
+++ b/services/syncbase/store/leveldb/db.go
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+// Package leveldb provides a LevelDB-based implementation of store.Store.
package leveldb
// #cgo LDFLAGS: -lleveldb
@@ -16,9 +17,9 @@
"v.io/syncbase/x/ref/services/syncbase/store"
)
-// DB is a wrapper around LevelDB that implements the store.Store interface.
+// db is a wrapper around LevelDB that implements the store.Store interface.
// TODO(rogulenko): ensure thread safety.
-type DB struct {
+type db struct {
cDb *C.leveldb_t
// Default read/write options.
readOptions *C.leveldb_readoptions_t
@@ -28,11 +29,11 @@
mu sync.Mutex
}
-var _ store.Store = (*DB)(nil)
+var _ store.Store = (*db)(nil)
// Open opens the database located at the given path, creating it if it doesn't
// exist.
-func Open(path string) (*DB, error) {
+func Open(path string) (store.Store, error) {
var cError *C.char
cPath := C.CString(path)
defer C.free(unsafe.Pointer(cPath))
@@ -48,7 +49,7 @@
}
readOptions := C.leveldb_readoptions_create()
C.leveldb_readoptions_set_verify_checksums(readOptions, 1)
- return &DB{
+ return &db{
cDb: cDb,
readOptions: readOptions,
writeOptions: C.leveldb_writeoptions_create(),
@@ -56,10 +57,10 @@
}
// Close implements the store.Store interface.
-func (db *DB) Close() error {
- C.leveldb_close(db.cDb)
- C.leveldb_readoptions_destroy(db.readOptions)
- C.leveldb_writeoptions_destroy(db.writeOptions)
+func (d *db) Close() error {
+ C.leveldb_close(d.cDb)
+ C.leveldb_readoptions_destroy(d.readOptions)
+ C.leveldb_writeoptions_destroy(d.writeOptions)
return nil
}
@@ -74,49 +75,49 @@
return goError(cError)
}
-// NewTransaction implements the store.Store interface.
-func (db *DB) NewTransaction() store.Transaction {
- return newTransaction(db)
-}
-
-// NewSnapshot implements the store.Store interface.
-func (db *DB) NewSnapshot() store.Snapshot {
- return newSnapshot(db)
+// Get implements the store.StoreReader interface.
+func (d *db) Get(key, valbuf []byte) ([]byte, error) {
+ return d.getWithOpts(key, valbuf, d.readOptions)
}
// Scan implements the store.StoreReader interface.
-func (db *DB) Scan(start, end []byte) (store.Stream, error) {
- return newStream(db, start, end, db.readOptions), nil
-}
-
-// Get implements the store.StoreReader interface.
-func (db *DB) Get(key, valbuf []byte) ([]byte, error) {
- return db.getWithOpts(key, valbuf, db.readOptions)
+func (d *db) Scan(start, end []byte) (store.Stream, error) {
+ return newStream(d, start, end, d.readOptions), nil
}
// Put implements the store.StoreWriter interface.
-func (db *DB) Put(key, value []byte) error {
+func (d *db) Put(key, value []byte) error {
// TODO(rogulenko): improve performance.
- return store.RunInTransaction(db, func(st store.StoreReadWriter) error {
+ return store.RunInTransaction(d, func(st store.StoreReadWriter) error {
return st.Put(key, value)
})
}
// Delete implements the store.StoreWriter interface.
-func (db *DB) Delete(key []byte) error {
+func (d *db) Delete(key []byte) error {
// TODO(rogulenko): improve performance.
- return store.RunInTransaction(db, func(st store.StoreReadWriter) error {
+ return store.RunInTransaction(d, func(st store.StoreReadWriter) error {
return st.Delete(key)
})
}
+// NewTransaction implements the store.Store interface.
+func (d *db) NewTransaction() store.Transaction {
+ return newTransaction(d)
+}
+
+// NewSnapshot implements the store.Store interface.
+func (d *db) NewSnapshot() store.Snapshot {
+ return newSnapshot(d)
+}
+
// getWithOpts returns the value for the given key.
// cOpts may contain a pointer to a snapshot.
-func (db *DB) getWithOpts(key, valbuf []byte, cOpts *C.leveldb_readoptions_t) ([]byte, error) {
+func (d *db) getWithOpts(key, valbuf []byte, cOpts *C.leveldb_readoptions_t) ([]byte, error) {
var cError *C.char
var valLen C.size_t
cStr, cLen := cSlice(key)
- val := C.leveldb_get(db.cDb, cOpts, cStr, cLen, &valLen, &cError)
+ val := C.leveldb_get(d.cDb, cOpts, cStr, cLen, &valLen, &cError)
if err := goError(cError); err != nil {
return nil, err
}
@@ -124,5 +125,5 @@
return nil, &store.ErrUnknownKey{Key: string(key)}
}
defer C.leveldb_free(unsafe.Pointer(val))
- return copyAll(valbuf, goBytes(val, valLen)), nil
+ return store.CopyBytes(valbuf, goBytes(val, valLen)), nil
}