ente/pkg/store.go

110 lines
2.6 KiB
Go
Raw Normal View History

package pkg
import (
"cli-go/pkg/model"
"context"
"fmt"
"log"
2023-09-25 02:47:29 +00:00
"strconv"
"time"
bolt "go.etcd.io/bbolt"
)
func GetDB(path string) (*bolt.DB, error) {
db, err := bolt.Open(path, 0600, &bolt.Options{Timeout: 1 * time.Second})
if err != nil {
log.Fatal(err)
}
return db, err
}
func (c *ClICtrl) GetInt64ConfigValue(ctx context.Context, key string) (int64, error) {
2023-09-27 05:32:36 +00:00
value, err := c.getConfigValue(ctx, key)
if err != nil {
return 0, err
}
var result int64
if value != nil {
result, err = strconv.ParseInt(string(value), 10, 64)
if err != nil {
return 0, err
}
}
return result, nil
}
2023-09-27 05:32:36 +00:00
func (c *ClICtrl) getConfigValue(ctx context.Context, key string) ([]byte, error) {
var value []byte
err := c.DB.View(func(tx *bolt.Tx) error {
kvBucket, err := getAccountStore(ctx, tx, model.KVConfig)
if err != nil {
return err
}
value = kvBucket.Get([]byte(key))
return nil
})
return value, err
}
func (c *ClICtrl) GetAllValues(ctx context.Context, store model.PhotosStore) ([][]byte, error) {
result := make([][]byte, 0)
err := c.DB.View(func(tx *bolt.Tx) error {
kvBucket, err := getAccountStore(ctx, tx, store)
2023-09-25 02:47:29 +00:00
if err != nil {
return err
2023-09-25 02:47:29 +00:00
}
kvBucket.ForEach(func(k, v []byte) error {
result = append(result, v)
return nil
})
return nil
})
return result, err
2023-09-25 02:47:29 +00:00
}
func (c *ClICtrl) PutConfigValue(ctx context.Context, key string, value []byte) error {
return c.DB.Update(func(tx *bolt.Tx) error {
kvBucket, err := getAccountStore(ctx, tx, model.KVConfig)
if err != nil {
return err
}
return kvBucket.Put([]byte(key), value)
})
}
2023-09-25 02:40:15 +00:00
func (c *ClICtrl) PutValue(ctx context.Context, store model.PhotosStore, key []byte, value []byte) error {
return c.DB.Update(func(tx *bolt.Tx) error {
kvBucket, err := getAccountStore(ctx, tx, store)
if err != nil {
return err
}
return kvBucket.Put(key, value)
})
}
// GetValue
func (c *ClICtrl) GetValue(ctx context.Context, store model.PhotosStore, key []byte) ([]byte, error) {
var value []byte
err := c.DB.View(func(tx *bolt.Tx) error {
kvBucket, err := getAccountStore(ctx, tx, store)
if err != nil {
return err
}
value = kvBucket.Get(key)
return nil
})
return value, err
}
func getAccountStore(ctx context.Context, tx *bolt.Tx, storeType model.PhotosStore) (*bolt.Bucket, error) {
2023-10-04 03:01:24 +00:00
accountKey := ctx.Value("account_key").(string)
accountBucket := tx.Bucket([]byte(accountKey))
if accountBucket == nil {
return nil, fmt.Errorf("account bucket not found")
}
store := accountBucket.Bucket([]byte(storeType))
if store == nil {
return nil, fmt.Errorf("store %s not found", storeType)
}
return store, nil
}