gбновление зависимостей, рефакторинг кода, чтобы он выглядел как гошный проект
This commit is contained in:
112
internal/lib/pebble.go
Normal file
112
internal/lib/pebble.go
Normal file
@@ -0,0 +1,112 @@
|
||||
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: */
|
||||
Reference in New Issue
Block a user