|
@@ -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
|
|
|
}
|