From def095e0e884a0f92d4aced95069d89ba32cbad7 Mon Sep 17 00:00:00 2001 From: bel Date: Thu, 11 Apr 2024 22:23:17 -0600 Subject: [PATCH] message driver storage --- driver.go | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ go.mod | 7 +++++ go.sum | 9 ++++++ main.go | 3 ++ message.go | 37 ++++++++++++++++++++++++ storage.go | 22 ++++++++++++++ writer.go | 3 ++ 7 files changed, 166 insertions(+) create mode 100644 driver.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go create mode 100644 message.go create mode 100644 storage.go create mode 100644 writer.go diff --git a/driver.go b/driver.go new file mode 100644 index 0000000..053e7a1 --- /dev/null +++ b/driver.go @@ -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) + }) +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..0668477 --- /dev/null +++ b/go.mod @@ -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 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..2745d0e --- /dev/null +++ b/go.sum @@ -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= diff --git a/main.go b/main.go new file mode 100644 index 0000000..38dd16d --- /dev/null +++ b/main.go @@ -0,0 +1,3 @@ +package main + +func main() {} diff --git a/message.go b/message.go new file mode 100644 index 0000000..8417fea --- /dev/null +++ b/message.go @@ -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 +} diff --git a/storage.go b/storage.go new file mode 100644 index 0000000..7645adc --- /dev/null +++ b/storage.go @@ -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} +} diff --git a/writer.go b/writer.go new file mode 100644 index 0000000..fb613a7 --- /dev/null +++ b/writer.go @@ -0,0 +1,3 @@ +package main + +type Writer struct{}