diff options
-rw-r--r-- | src/dedo.go | 96 |
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) { |