boltdb support.

This commit is contained in:
fiatjaf
2024-02-08 12:36:34 -03:00
parent 830d51e96d
commit 9d87d1fd8a
9 changed files with 647 additions and 0 deletions

93
bolt/lib.go Normal file
View File

@@ -0,0 +1,93 @@
package bolt
import (
"sync/atomic"
"github.com/boltdb/bolt"
"github.com/fiatjaf/eventstore"
)
const (
maxuint16 = 65535
maxuint32 = 4294967295
)
var (
bucketSettings = []byte{99}
bucketRaw = []byte{1}
bucketCreatedAt = []byte{2}
bucketId = []byte{3}
bucketKind = []byte{4}
bucketPubkey = []byte{5}
bucketPubkeyKind = []byte{6}
bucketTag = []byte{7}
bucketTag32 = []byte{8}
bucketTagAddr = []byte{9}
)
var _ eventstore.Store = (*BoltBackend)(nil)
type BoltBackend struct {
Path string
MaxLimit int
db *bolt.DB
lastId atomic.Uint32
}
func (b *BoltBackend) Init() error {
if b.MaxLimit == 0 {
b.MaxLimit = 500
}
// open boltdb
db, err := bolt.Open(b.Path, 0644, nil)
if err != nil {
return err
}
b.db = db
// open each bucket
if err := b.db.Update(func(txn *bolt.Tx) error {
if _, err := txn.CreateBucket(bucketSettings); err != nil && err != bolt.ErrBucketExists {
return err
}
if _, err := txn.CreateBucket(bucketRaw); err != nil && err != bolt.ErrBucketExists {
return err
}
if _, err := txn.CreateBucket(bucketCreatedAt); err != nil && err != bolt.ErrBucketExists {
return err
}
if _, err := txn.CreateBucket(bucketId); err != nil && err != bolt.ErrBucketExists {
return err
}
if _, err := txn.CreateBucket(bucketKind); err != nil && err != bolt.ErrBucketExists {
return err
}
if _, err := txn.CreateBucket(bucketPubkey); err != nil && err != bolt.ErrBucketExists {
return err
}
if _, err := txn.CreateBucket(bucketPubkeyKind); err != nil && err != bolt.ErrBucketExists {
return err
}
if _, err := txn.CreateBucket(bucketTag); err != nil && err != bolt.ErrBucketExists {
return err
}
if _, err := txn.CreateBucket(bucketTag32); err != nil && err != bolt.ErrBucketExists {
return err
}
if _, err := txn.CreateBucket(bucketTagAddr); err != nil && err != bolt.ErrBucketExists {
return err
}
return nil
}); err != nil {
return err
}
return b.runMigrations()
}
func (b *BoltBackend) Close() {
b.db.Close()
}