81 lines
1.5 KiB
Go
81 lines
1.5 KiB
Go
package heartwood
|
|
|
|
import (
|
|
"github.com/boltdb/bolt"
|
|
)
|
|
|
|
// Interface
|
|
|
|
type BoltDB interface {
|
|
Setup() error
|
|
BatchCheckEventsExist(eventIDs []string) map[string]bool
|
|
BatchWriteEvents(events []EventBlob) error
|
|
}
|
|
|
|
func NewKVDB(boltdb *bolt.DB) BoltDB {
|
|
return &boltDB{db: boltdb}
|
|
}
|
|
|
|
type boltDB struct {
|
|
db *bolt.DB
|
|
}
|
|
|
|
func (b *boltDB) Setup() error {
|
|
return SetupBoltDB(b.db)
|
|
}
|
|
|
|
func (b *boltDB) BatchCheckEventsExist(eventIDs []string) map[string]bool {
|
|
return BatchCheckEventsExist(b.db, eventIDs)
|
|
}
|
|
|
|
func (b *boltDB) BatchWriteEvents(events []EventBlob) error {
|
|
return BatchWriteEvents(b.db, events)
|
|
}
|
|
|
|
func SetupBoltDB(boltdb *bolt.DB) error {
|
|
return boltdb.Update(func(tx *bolt.Tx) error {
|
|
_, err := tx.CreateBucketIfNotExists([]byte(BucketName))
|
|
return err
|
|
})
|
|
}
|
|
|
|
// Functions
|
|
|
|
const BucketName string = "events"
|
|
|
|
type EventBlob struct {
|
|
ID string
|
|
JSON string
|
|
}
|
|
|
|
func BatchCheckEventsExist(boltdb *bolt.DB, eventIDs []string) map[string]bool {
|
|
existsMap := make(map[string]bool)
|
|
|
|
boltdb.View(func(tx *bolt.Tx) error {
|
|
bucket := tx.Bucket([]byte(BucketName))
|
|
if bucket == nil {
|
|
return nil
|
|
}
|
|
for _, id := range eventIDs {
|
|
existsMap[id] = bucket.Get([]byte(id)) != nil
|
|
}
|
|
return nil
|
|
})
|
|
|
|
return existsMap
|
|
}
|
|
|
|
func BatchWriteEvents(boltdb *bolt.DB, events []EventBlob) error {
|
|
return boltdb.Update(func(tx *bolt.Tx) error {
|
|
bucket := tx.Bucket([]byte(BucketName))
|
|
for _, event := range events {
|
|
if err := bucket.Put(
|
|
[]byte(event.ID), []byte(event.JSON),
|
|
); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
})
|
|
}
|