Files
aleesa-phrases-go/internal/lib/pebble.go

113 lines
2.9 KiB
Go

package lib
import (
"errors"
"fmt"
"io/fs"
"strconv"
"github.com/cockroachdb/pebble"
)
// StoreKV сохраняет в указанной бд ключ и значение
func StoreKV(db *pebble.DB, dbName string, key string, value string, useCounter bool) error {
var kArray = []byte(key)
var vArray = []byte(value)
err := db.Set(kArray, vArray, pebble.Sync)
if useCounter {
// У pebble нет в арсенале функции count(), так что "изобретём" её
if err == nil {
amount, err := FetchV(PebbleDB.Count.DB, dbName)
if err != nil {
// Такого ключа в базе нет
if errors.Is(err, pebble.ErrNotFound) {
amount = fmt.Sprintf("%d", 0)
// Такой базы нет
} else if errors.Is(err, fs.ErrNotExist) {
amount = fmt.Sprintf("%d", 0)
} else {
return err
}
}
amountNum, err := strconv.Atoi(amount)
// Хуйня в базе, данные должны проходить конвертацию в int
if err != nil {
return err
}
amountNum += 1
amount = fmt.Sprintf("%d", amountNum)
err = PebbleDB.Count.DB.Set([]byte(dbName), []byte(amount), pebble.Sync)
if err != nil {
return err
}
}
}
return err
}
// FetchV достаёт значение по ключу
func FetchV(db *pebble.DB, key string) (string, error) {
var kArray = []byte(key)
var vArray []byte
var valueString = ""
vArray, closer, err := db.Get(kArray)
if err != nil {
return valueString, err
}
valueString = string(vArray)
err = closer.Close()
return valueString, err
}
// FetchRandomV достаёт рандомное значение из указанной базы (count_db для указанной db должна содержать количество записей)
func FetchRandomV(db *pebble.DB, dbName string) (string, error) {
answer := ""
amount, err := FetchV(PebbleDB.Count.DB, dbName)
if err != nil {
// Такого ключа в базе нет
if errors.Is(err, pebble.ErrNotFound) {
return answer, fmt.Errorf("looks like %s is not seeded or count_db is missing", dbName)
// Такой базы нет
} else if errors.Is(err, fs.ErrNotExist) {
return answer, fmt.Errorf("unable to get random value from %s: count_db is missing", dbName)
} else {
return answer, fmt.Errorf("something going wrong with %s: %w", dbName, err)
}
}
amountNum, err := strconv.Atoi(amount)
// Хуйня в базе, данные должны проходить конвертацию в int
if err != nil {
return answer, fmt.Errorf("garbage in count_db while getting info about %s: %w", dbName, err)
}
phraseNum := Random.Intn(amountNum + 1)
phraseItem := fmt.Sprintf("%d", phraseNum)
answer, err = FetchV(db, phraseItem)
if err != nil {
return "", fmt.Errorf("an error occured while getting answer from %s: %s", dbName, err)
}
return answer, nil
}
/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */