message driver storage
This commit is contained in:
85
driver.go
Normal file
85
driver.go
Normal 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
7
go.mod
Normal 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
9
go.sum
Normal 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=
|
||||||
37
message.go
Normal file
37
message.go
Normal 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
22
storage.go
Normal 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}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user