2023-07-28 11:04:21 +00:00
|
|
|
package fusenrender
|
|
|
|
|
2023-07-29 13:58:11 +00:00
|
|
|
// import (
|
|
|
|
// "encoding/json"
|
|
|
|
// "fmt"
|
|
|
|
// "log"
|
|
|
|
|
|
|
|
// "github.com/dgraph-io/badger/v3"
|
|
|
|
// )
|
|
|
|
|
|
|
|
// import (
|
|
|
|
// "bytes"
|
|
|
|
// "encoding/gob"
|
|
|
|
// "encoding/json"
|
|
|
|
// "fmt"
|
|
|
|
// "log"
|
|
|
|
// "time"
|
|
|
|
|
|
|
|
// "github.com/dgraph-io/badger/v3"
|
|
|
|
// )
|
|
|
|
|
|
|
|
// type ApplyTask struct {
|
|
|
|
// Name string
|
|
|
|
// Object []byte
|
|
|
|
// }
|
|
|
|
|
|
|
|
// func (t *ApplyTask) Encode() ([]byte, error) {
|
|
|
|
// var buf bytes.Buffer
|
|
|
|
// enc := gob.NewEncoder(&buf)
|
|
|
|
// err := enc.Encode(t)
|
|
|
|
// if err != nil {
|
|
|
|
// return nil, err
|
|
|
|
// }
|
|
|
|
|
|
|
|
// return buf.Bytes(), nil
|
|
|
|
// }
|
|
|
|
|
|
|
|
// func (t *ApplyTask) Decode(data []byte) error {
|
|
|
|
// buf := bytes.NewBuffer(data)
|
|
|
|
// dec := gob.NewDecoder(buf)
|
|
|
|
// return dec.Decode(t)
|
|
|
|
// }
|
|
|
|
|
|
|
|
// type QueueItem struct {
|
|
|
|
// Group string `json:"group"` // 组名
|
|
|
|
// Priority uint32 `json:"priority"` // 处理的优先级
|
|
|
|
// CreateAt time.Time `json:"create_at"` // 创建时间 统一utc
|
|
|
|
// Data any `json:"data"` // 操作的数据结构
|
|
|
|
// }
|
|
|
|
|
|
|
|
// func (item *QueueItem) Encode() ([]byte, error) {
|
|
|
|
// val, err := json.Marshal(item)
|
|
|
|
// if err != nil {
|
|
|
|
// return nil, err
|
|
|
|
// }
|
|
|
|
// return val, nil
|
|
|
|
// }
|
|
|
|
|
|
|
|
// type Queue struct {
|
|
|
|
// db *badger.DB
|
|
|
|
// }
|
|
|
|
|
|
|
|
// func NewQueue(datapath string) (*Queue, error) {
|
|
|
|
|
|
|
|
// opts := badger.DefaultOptions(datapath)
|
|
|
|
|
|
|
|
// db, err := badger.Open(opts)
|
|
|
|
// if err != nil {
|
|
|
|
// return nil, err
|
|
|
|
// }
|
|
|
|
|
|
|
|
// return &Queue{
|
|
|
|
// db: db,
|
|
|
|
// }, nil
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
// func (q *Queue) GetKey(item *QueueItem) []byte {
|
|
|
|
// return []byte(fmt.Sprintf("%s_%d_%d", item.Group, -item.Priority, item.CreateAt.UTC().Unix()))
|
|
|
|
// }
|
|
|
|
|
|
|
|
// func (q *Queue) Enqueue(item *QueueItem) error {
|
|
|
|
// // Badger存储
|
|
|
|
|
|
|
|
// val, err := json.Marshal(item)
|
|
|
|
// if err != nil {
|
|
|
|
// return err
|
|
|
|
// }
|
|
|
|
|
|
|
|
// err = q.db.Update(func(txn *badger.Txn) error {
|
|
|
|
// return txn.Set([]byte(q.GetKey(item)), val)
|
|
|
|
// })
|
|
|
|
|
|
|
|
// return err
|
|
|
|
// }
|
|
|
|
|
|
|
|
// func (q *Queue) Dequeue(group string) (item *QueueItem, err error) {
|
|
|
|
|
|
|
|
// prefix := []byte(fmt.Sprintf("%s_", group))
|
|
|
|
|
|
|
|
// err = q.db.Update(func(txn *badger.Txn) error {
|
|
|
|
|
|
|
|
// it := txn.NewIterator(badger.DefaultIteratorOptions)
|
|
|
|
// defer it.Close()
|
|
|
|
|
|
|
|
// it.Seek(prefix)
|
|
|
|
// if !it.ValidForPrefix(prefix) {
|
|
|
|
// return nil
|
|
|
|
// }
|
|
|
|
|
|
|
|
// itemKey := it.Item().Key()
|
|
|
|
// err = it.Item().Value(func(val []byte) error {
|
|
|
|
// item = &QueueItem{}
|
|
|
|
// return json.Unmarshal(val, item)
|
|
|
|
// })
|
|
|
|
// if err != nil {
|
|
|
|
// log.Println(err)
|
|
|
|
// }
|
2023-07-28 11:04:21 +00:00
|
|
|
|
2023-07-29 13:58:11 +00:00
|
|
|
// return txn.Delete(itemKey)
|
2023-07-28 11:04:21 +00:00
|
|
|
|
2023-07-29 13:58:11 +00:00
|
|
|
// })
|
2023-07-28 11:04:21 +00:00
|
|
|
|
2023-07-29 13:58:11 +00:00
|
|
|
// return item, err
|
|
|
|
// }
|