message driver storage

This commit is contained in:
bel
2024-04-11 22:23:17 -06:00
parent b39b5a66e7
commit def095e0e8
7 changed files with 166 additions and 0 deletions

85
driver.go Normal file
View File

@@ -0,0 +1,85 @@
package main
import (
"context"
"io/ioutil"
"os"
"time"
"go.etcd.io/bbolt"
)
type BBolt struct {
db *bbolt.DB
bkt string
}
func NewTestDB() BBolt {
d, err := ioutil.TempDir(os.TempDir(), "test-db-*")
if err != nil {
panic(err)
}
db, err := NewDB(d)
if err != nil {
panic(err)
}
return db
}
func NewDB(p string) (BBolt, error) {
db, err := bbolt.Open(p, 0600, &bbolt.Options{
Timeout: time.Second,
})
return BBolt{db: db}, err
}
func (bb BBolt) Close() error {
return bb.db.Close()
}
func (bb BBolt) ForEach(ctx context.Context, cb func(string, []byte) error) error {
return bb.db.View(func(tx *bbolt.Tx) error {
bkt := tx.Bucket([]byte(bb.bkt))
if bkt == nil {
return nil
}
c := bkt.Cursor()
for k, v := c.First(); k != nil && ctx.Err() == nil; k, v = c.Next() {
if err := cb(string(k), v); err != nil {
return err
}
}
return ctx.Err()
})
}
func (bb BBolt) Get(_ context.Context, id string) ([]byte, error) {
var b []byte
err := bb.db.View(func(tx *bbolt.Tx) error {
bkt := tx.Bucket([]byte(bb.bkt))
if bkt == nil {
return nil
}
b = bkt.Get([]byte(id))
return nil
})
return b, err
}
func (bb BBolt) Set(_ context.Context, id string, value []byte) error {
return bb.db.Update(func(tx *bbolt.Tx) error {
bkt := tx.Bucket([]byte(bb.bkt))
if bkt == nil {
var err error
bkt, err = tx.CreateBucket([]byte(bb.bkt))
if err != nil {
return err
}
}
return bkt.Put([]byte(id), value)
})
}

7
go.mod Normal file
View File

@@ -0,0 +1,7 @@
module gitea/render/slack-bot-vr
go 1.20
require go.etcd.io/bbolt v1.3.9
require golang.org/x/sys v0.4.0 // indirect

9
go.sum Normal file
View File

@@ -0,0 +1,9 @@
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI=
go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE=
golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=
golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

3
main.go Normal file
View File

@@ -0,0 +1,3 @@
package main
func main() {}

37
message.go Normal file
View File

@@ -0,0 +1,37 @@
package main
import "encoding/json"
type Message struct {
ID string
TS uint64
Plain string
Source string
Channel string
Thread string
EventName string
EventID string
AssetID string
}
func (m Message) Serialize() []byte {
b, err := json.Marshal(m)
if err != nil {
panic(err)
}
return b
}
func MustDeserialize(b []byte) Message {
m, err := Deserialize(b)
if err != nil {
panic(err)
}
return m
}
func Deserialize(b []byte) (Message, error) {
var m Message
err := json.Unmarshal(b, &m)
return m, err
}

22
storage.go Normal file
View File

@@ -0,0 +1,22 @@
package main
import "context"
type Storage struct {
driver Driver
}
type Driver interface {
Close() error
ForEach(context.Context, func(string, []byte) error) error
Get(context.Context, string) ([]byte, error)
Set(context.Context, string, []byte) error
}
func NewTestStorage() Storage {
return Storage{driver: NewTestDB()}
}
func NewStorage(driver Driver) Storage {
return Storage{driver: driver}
}

3
writer.go Normal file
View File

@@ -0,0 +1,3 @@
package main
type Writer struct{}