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