Quellcode durchsuchen

add leveldb options passthrough

Aneurin Barker Snook vor 11 Monaten
Ursprung
Commit
404ff3bd7c
3 geänderte Dateien mit 48 neuen und 8 gelöschten Zeilen
  1. 17 7
      leveldb.go
  2. 30 0
      leveldb_options.go
  3. 1 1
      leveldb_test.go

+ 17 - 7
leveldb.go

@@ -4,6 +4,7 @@ import (
 	"os"
 
 	"github.com/syndtr/goleveldb/leveldb"
+	"github.com/syndtr/goleveldb/leveldb/opt"
 )
 
 type LevelDBCollection[T any] struct {
@@ -11,6 +12,10 @@ type LevelDBCollection[T any] struct {
 
 	db *leveldb.DB
 	m  DocumentMarshaler[T, []byte]
+
+	optOpen  *opt.Options
+	optRead  *opt.ReadOptions
+	optWrite *opt.WriteOptions
 }
 
 func (c *LevelDBCollection[T]) Close() error {
@@ -26,7 +31,7 @@ func (c *LevelDBCollection[T]) Close() error {
 }
 
 func (c *LevelDBCollection[T]) Delete(key string) error {
-	return c.db.Delete([]byte(key), nil)
+	return c.db.Delete([]byte(key), c.optWrite)
 }
 
 // Destroy the database completely, removing it from disk.
@@ -41,7 +46,7 @@ func (c *LevelDBCollection[T]) Destroy() error {
 func (c *LevelDBCollection[T]) Get(key string) (T, error) {
 	dest := c.m.Factory()
 
-	src, err := c.db.Get([]byte(key), nil)
+	src, err := c.db.Get([]byte(key), c.optRead)
 	if err != nil {
 		return dest, err
 	}
@@ -52,12 +57,12 @@ func (c *LevelDBCollection[T]) Get(key string) (T, error) {
 }
 
 func (c *LevelDBCollection[T]) Has(key string) (bool, error) {
-	return c.db.Has([]byte(key), nil)
+	return c.db.Has([]byte(key), c.optRead)
 }
 
 func (c *LevelDBCollection[T]) Iter() Iterator[T] {
 	i := &LevelDBIterator[T]{
-		i: c.db.NewIterator(nil, nil),
+		i: c.db.NewIterator(nil, c.optRead),
 		m: c.m,
 	}
 
@@ -66,7 +71,7 @@ func (c *LevelDBCollection[T]) Iter() Iterator[T] {
 
 func (c *LevelDBCollection[T]) Open() error {
 	if c.db == nil {
-		db, err := leveldb.OpenFile(c.path, nil)
+		db, err := leveldb.OpenFile(c.path, c.optOpen)
 		if err != nil {
 			return err
 		}
@@ -87,15 +92,20 @@ func (c *LevelDBCollection[T]) Put(key string, src T) error {
 		return err
 	}
 
-	return c.db.Put([]byte(key), dest, nil)
+	return c.db.Put([]byte(key), dest, c.optWrite)
 }
 
 // LevelDB creates a new collection using LevelDB storage.
-func LevelDB[T any](path string, m DocumentMarshaler[T, []byte]) *LevelDBCollection[T] {
+func LevelDB[T any](path string, m DocumentMarshaler[T, []byte], o *LevelDBOptions) *LevelDBCollection[T] {
 	c := &LevelDBCollection[T]{
 		path: path,
 
 		m: m,
+
+		// Unpack options now to reduce nil checks
+		optOpen:  o.GetOpen(),
+		optRead:  o.GetRead(),
+		optWrite: o.GetWrite(),
 	}
 	return c
 }

+ 30 - 0
leveldb_options.go

@@ -0,0 +1,30 @@
+package ezdb
+
+import "github.com/syndtr/goleveldb/leveldb/opt"
+
+type LevelDBOptions struct {
+	Open  *opt.Options
+	Read  *opt.ReadOptions
+	Write *opt.WriteOptions
+}
+
+func (o *LevelDBOptions) GetOpen() *opt.Options {
+	if o == nil {
+		return nil
+	}
+	return o.Open
+}
+
+func (o *LevelDBOptions) GetRead() *opt.ReadOptions {
+	if o == nil {
+		return nil
+	}
+	return o.Read
+}
+
+func (o *LevelDBOptions) GetWrite() *opt.WriteOptions {
+	if o == nil {
+		return nil
+	}
+	return o.Write
+}

+ 1 - 1
leveldb_test.go

@@ -4,7 +4,7 @@ import "testing"
 
 func TestLevelDB(t *testing.T) {
 	path := ".leveldb/leveldb_test"
-	c := LevelDB[*Student](path, studentMarshaler)
+	c := LevelDB[*Student](path, studentMarshaler, nil)
 
 	fixture := &CollectionTest{
 		C: c,