package fusenrender // 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) // } // return txn.Delete(itemKey) // }) // return item, err // }