aboutsummaryrefslogtreecommitdiff
path: root/src/dedo.go
diff options
context:
space:
mode:
authorEuAndreh <eu@euandre.org>2025-02-07 06:49:16 -0300
committerEuAndreh <eu@euandre.org>2025-02-07 06:49:16 -0300
commit9d83ab4d2ea783422f3ef7f14f7951c096a6f93f (patch)
tree984296f315601c105488803db150ca6caab95727 /src/dedo.go
parentsrc/dedo.go: Introduce ITx interface (diff)
downloaddedo-9d83ab4d2ea783422f3ef7f14f7951c096a6f93f.tar.gz
dedo-9d83ab4d2ea783422f3ef7f14f7951c096a6f93f.tar.xz
src/dedo.go: Introduce inMemoryTx
Diffstat (limited to 'src/dedo.go')
-rw-r--r--src/dedo.go96
1 files changed, 89 insertions, 7 deletions
diff --git a/src/dedo.go b/src/dedo.go
index a439ac6..9f64693 100644
--- a/src/dedo.go
+++ b/src/dedo.go
@@ -105,12 +105,14 @@ type elemRef struct {
index int
}
-type Value interface{
- value() []byte // FIXME: should be - []byte | IBucket
+type inMemoryTx struct{
+ commitHandlers []func()
+ db *InMemory
+ writable bool
}
type InMemory struct{
- *pds.Map[[]byte, Value]
+ *pds.Map[[]byte, *Bucket]
}
type ITx interface{
@@ -1649,8 +1651,72 @@ func initDB(db *DB, size int64) error {
return nil
}
-func OpenMemory() IDedo {
- return &InMemory{pds.NewMap[[]byte, Value](nil)}
+func (tx *inMemoryTx) Bucket(name []byte) *Bucket {
+ bucket, _ := tx.db.Get(name)
+ return bucket
+}
+
+func (bucket *Bucket) value() []byte {
+ return nil
+}
+
+// FIXME: split Tx/Snapshot
+func (tx *inMemoryTx) CreateBucket(name []byte) (*Bucket, error) {
+ if tx.db == nil {
+ return nil, ErrTxClosed
+ }
+
+ if len(name) == 0 {
+ return nil, ErrBucketNameRequired
+ }
+
+ _, ok := tx.db.Get(name)
+ if ok {
+ return nil, ErrBucketExists
+ }
+
+ bucket := &Bucket{}
+ tx.db.set(name, bucket)
+ return bucket, nil
+}
+
+func (tx *inMemoryTx) CreateBucketIfNotExists(name []byte) (*Bucket, error) {
+ bucket, err := tx.CreateBucket(name)
+ if err == ErrBucketExists {
+ return bucket.Bucket(name), nil
+ } else if err != nil {
+ return nil, err
+ }
+
+ return bucket, nil
+}
+
+func (tx *inMemoryTx) Cursor() *Cursor {
+ return nil
+}
+
+func (tx *inMemoryTx) DeleteBucket(name []byte) error {
+ return nil
+}
+
+func (tx *inMemoryTx) ForEach(fn func([]byte, *Bucket) error) error {
+ return nil
+}
+
+func (tx *inMemoryTx) OnCommit(fn func()) {
+ tx.commitHandlers = append(tx.commitHandlers, fn)
+}
+
+func (tx *inMemoryTx) Check() <-chan error {
+ return nil
+}
+
+func (tx *inMemoryTx) WriteTo(io.Writer) (int64, error) {
+ return 0, nil
+}
+
+func (m *InMemory) set(key []byte, value *Bucket) {
+ m = &InMemory{m.Set(key, value)}
}
func (m *InMemory) Close() error {
@@ -1661,14 +1727,30 @@ func (m *InMemory) Path() string {
return ""
}
-func (m *InMemory) Update(func(ITx) error) error {
- return nil
+func (m *InMemory) Update(fn func(ITx) error) error {
+ tx := &inMemoryTx{
+ db: m,
+ commitHandlers: []func(){},
+ writable: true,
+ }
+ err := fn(tx)
+
+ // Execute commit handlers now that the locks have been removed.
+ for _, fn := range tx.commitHandlers {
+ fn()
+ }
+
+ return err
}
func (m *InMemory) View(func(ITx) error) error {
return nil
}
+func OpenMemory() IDedo {
+ return &InMemory{pds.NewMap[[]byte, *Bucket](nil)}
+}
+
/// Open creates and opens a database at the given path. If the file does not
/// exist then it will be created automatically.
func OpenWith(path string, options OpenOptionsT) (IDedo, error) {