113 lines
2.9 KiB
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: */
|