gбновление зависимостей, рефакторинг кода, чтобы он выглядел как гошный проект
This commit is contained in:
186
cmd/aleesa-phrases-go/main.go
Normal file
186
cmd/aleesa-phrases-go/main.go
Normal file
@@ -0,0 +1,186 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"aleesa-phrases-go/internal/lib"
|
||||
|
||||
"github.com/cockroachdb/pebble"
|
||||
"github.com/go-redis/redis/v8"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
// Производит некоторую инициализацию перед запуском main()
|
||||
func init() {
|
||||
log.SetFormatter(&log.TextFormatter{
|
||||
DisableQuote: true,
|
||||
DisableLevelTruncation: false,
|
||||
DisableColors: true,
|
||||
FullTimestamp: true,
|
||||
TimestampFormat: "2006-01-02 15:04:05",
|
||||
})
|
||||
|
||||
// Запустим наш рандомайзер
|
||||
rngSeed := rand.NewSource(time.Now().UnixNano())
|
||||
lib.Random = rand.New(rngSeed)
|
||||
|
||||
lib.Config = lib.ReadConfig()
|
||||
|
||||
// no panic, no trace
|
||||
switch lib.Config.LogLevel {
|
||||
case "fatal":
|
||||
log.SetLevel(log.FatalLevel)
|
||||
case "error":
|
||||
log.SetLevel(log.ErrorLevel)
|
||||
case "warn":
|
||||
log.SetLevel(log.WarnLevel)
|
||||
case "info":
|
||||
log.SetLevel(log.InfoLevel)
|
||||
case "debug":
|
||||
log.SetLevel(log.DebugLevel)
|
||||
default:
|
||||
log.SetLevel(log.InfoLevel)
|
||||
}
|
||||
|
||||
// Надеюсь, это заловит все ошибки и паники в лог при падении программы
|
||||
defer func() {
|
||||
if err := recover(); err != nil {
|
||||
log.Fatalf("Exception: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
}()
|
||||
|
||||
var err error
|
||||
// Самое гнусное - открыть базки со статичными фразами, конкретно тут - в RO-режиме
|
||||
var options pebble.Options
|
||||
options.ReadOnly = true
|
||||
|
||||
lib.PebbleDB.Count.Name = "count_db"
|
||||
lib.PebbleDB.Count.DB, err = pebble.Open(lib.Config.DataDir+"/"+lib.PebbleDB.Count.Name, &options)
|
||||
if err != nil {
|
||||
log.Errorf("Unable to open count_db: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
lib.PebbleDB.Fortune.Name = "fortune_db"
|
||||
lib.PebbleDB.Fortune.DB, err = pebble.Open(lib.Config.DataDir+"/"+lib.PebbleDB.Fortune.Name, &options)
|
||||
if err != nil {
|
||||
log.Errorf("Unable to open fortune db: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
lib.PebbleDB.Proverb.Name = "proverb_db"
|
||||
lib.PebbleDB.Proverb.DB, err = pebble.Open(lib.Config.DataDir+"/"+lib.PebbleDB.Proverb.Name, &options)
|
||||
if err != nil {
|
||||
log.Errorf("Unable to open proverb db: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
lib.PebbleDB.Monday.Name = "monday"
|
||||
lib.PebbleDB.Monday.DB, err = pebble.Open(lib.Config.DataDir+"/friday_db/"+lib.PebbleDB.Monday.Name, &options)
|
||||
if err != nil {
|
||||
log.Errorf("Unable to open monday db: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
lib.PebbleDB.Tuesday.Name = "tuesday"
|
||||
lib.PebbleDB.Tuesday.DB, err = pebble.Open(lib.Config.DataDir+"/friday_db/"+lib.PebbleDB.Tuesday.Name, &options)
|
||||
if err != nil {
|
||||
log.Errorf("Unable to open tuesday db: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
lib.PebbleDB.Wednesday.Name = "wednesday"
|
||||
lib.PebbleDB.Wednesday.DB, err = pebble.Open(lib.Config.DataDir+"/friday_db/"+lib.PebbleDB.Wednesday.Name, &options)
|
||||
if err != nil {
|
||||
log.Errorf("Unable to open wednesday db: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
lib.PebbleDB.Thursday.Name = "thursday"
|
||||
lib.PebbleDB.Thursday.DB, err = pebble.Open(lib.Config.DataDir+"/friday_db/"+lib.PebbleDB.Thursday.Name, &options)
|
||||
if err != nil {
|
||||
log.Errorf("Unable to open thursday db: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
lib.PebbleDB.Friday.Name = "friday"
|
||||
lib.PebbleDB.Friday.DB, err = pebble.Open(lib.Config.DataDir+"/friday_db/"+lib.PebbleDB.Friday.Name, &options)
|
||||
if err != nil {
|
||||
log.Errorf("Unable to open friday db: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
lib.PebbleDB.Saturday.Name = "saturday"
|
||||
lib.PebbleDB.Saturday.DB, err = pebble.Open(lib.Config.DataDir+"/friday_db/"+lib.PebbleDB.Saturday.Name, &options)
|
||||
if err != nil {
|
||||
log.Errorf("Unable to open saturday db: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
lib.PebbleDB.Sunday.Name = "sunday"
|
||||
lib.PebbleDB.Sunday.DB, err = pebble.Open(lib.Config.DataDir+"/friday_db/"+lib.PebbleDB.Sunday.Name, &options)
|
||||
if err != nil {
|
||||
log.Errorf("Unable to open sunday db: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
// Основная функция программы, не добавить и не убавить
|
||||
func main() {
|
||||
|
||||
// Откроем лог и скормим его логгеру
|
||||
if lib.Config.Log != "" {
|
||||
logfile, err := os.OpenFile(lib.Config.Log, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
|
||||
|
||||
if err != nil {
|
||||
log.Fatalf("Unable to open log file %s: %s", lib.Config.Log, err)
|
||||
}
|
||||
|
||||
log.SetOutput(logfile)
|
||||
}
|
||||
|
||||
// Иницализируем клиента
|
||||
lib.RedisClient = redis.NewClient(&redis.Options{
|
||||
Addr: fmt.Sprintf("%s:%d", lib.Config.Server, lib.Config.Port),
|
||||
})
|
||||
|
||||
log.Debugf("Lazy connect() to redis at %s:%d", lib.Config.Server, lib.Config.Port)
|
||||
lib.Subscriber = lib.RedisClient.Subscribe(lib.Ctx, lib.Config.Channel)
|
||||
|
||||
// Самое время поставить траппер сигналов
|
||||
signal.Notify(lib.SigChan,
|
||||
syscall.SIGINT,
|
||||
syscall.SIGTERM,
|
||||
syscall.SIGQUIT)
|
||||
|
||||
go lib.SigHandler()
|
||||
|
||||
// Обработчик событий от редиски
|
||||
for {
|
||||
if lib.Shutdown {
|
||||
time.Sleep(1 * time.Second)
|
||||
continue
|
||||
}
|
||||
|
||||
msg, err := lib.Subscriber.ReceiveMessage(lib.Ctx)
|
||||
|
||||
if err != nil {
|
||||
if !lib.Shutdown {
|
||||
log.Warnf("Unable to connect to redis at %s:%d: %s", lib.Config.Server, lib.Config.Port, err)
|
||||
}
|
||||
|
||||
time.Sleep(1 * time.Second)
|
||||
continue
|
||||
}
|
||||
|
||||
go lib.MsgParser(lib.Ctx, msg.Payload)
|
||||
}
|
||||
}
|
||||
|
||||
/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */
|
||||
99
cmd/seed-fortune/main.go
Normal file
99
cmd/seed-fortune/main.go
Normal file
@@ -0,0 +1,99 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"aleesa-phrases-go/internal/lib"
|
||||
|
||||
"github.com/cockroachdb/pebble"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
func main() {
|
||||
lib.Config = lib.ReadConfig()
|
||||
srcDir := lib.Config.DataDir + "/fortune_src"
|
||||
|
||||
// Вычитывать сразу весь список файлов - плохая практика, но мы предполагаем, что тут их немного.
|
||||
files, err := os.ReadDir(srcDir)
|
||||
|
||||
if err != nil {
|
||||
log.Errorf("Unable to read dir %s: %s\n", srcDir, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
// Откроем все наши БД
|
||||
var options pebble.Options
|
||||
// По дефолту ограничение ставится на мегабайты данных, а не на количество файлов, поэтому с дефолтными настройками
|
||||
// порождается огромное количество файлов. Умолчальное ограничение на количество файлов - 500 штук, что нас не
|
||||
// устраивает, поэтому немного снизим эту цифру до более приемлемых значений
|
||||
options.L0CompactionFileThreshold = 8
|
||||
|
||||
lib.PebbleDB.Fortune.Name = "fortune_db"
|
||||
lib.PebbleDB.Fortune.DB, err = pebble.Open(lib.Config.DataDir+"/"+lib.PebbleDB.Fortune.Name, &options)
|
||||
if err != nil {
|
||||
log.Errorf("Unable to open %s db: %s\n", lib.PebbleDB.Fortune.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
lib.PebbleDB.Count.Name = "count_db"
|
||||
lib.PebbleDB.Count.DB, err = pebble.Open(lib.Config.DataDir+"/"+lib.PebbleDB.Count.Name, &options)
|
||||
if err != nil {
|
||||
log.Errorf("Unable to open %s db: %s\n", lib.PebbleDB.Count.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
for _, file := range files {
|
||||
if file.IsDir() || file.Name() == "." || file.Name() == ".." {
|
||||
continue
|
||||
}
|
||||
|
||||
// "Заглатывать" файл целиком - плохая практика, но мы предополагаем, что файлы будут небольшие.
|
||||
fortuneFile := fmt.Sprintf("%s/%s", srcDir, file.Name())
|
||||
bytesRead, err := os.ReadFile(fortuneFile)
|
||||
|
||||
if err != nil {
|
||||
log.Errorf("Unable to read %s: %s\n", file.Name(), err)
|
||||
continue
|
||||
}
|
||||
|
||||
fileContent := string(bytesRead)
|
||||
lines := strings.Split(fileContent, "\n%\n")
|
||||
|
||||
for _, line := range lines {
|
||||
lib.Counter += 1
|
||||
key := fmt.Sprintf("%d", lib.Counter)
|
||||
value := strings.Trim(line, "\n\r\t ")
|
||||
|
||||
if err := lib.StoreKV(lib.PebbleDB.Fortune.DB, lib.PebbleDB.Fortune.Name, key, value, true); err != nil {
|
||||
log.Errorf("Unable to store key %s with value %s in fortune_db: %s", key, value, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if err = lib.PebbleDB.Fortune.DB.Flush(); err != nil {
|
||||
log.Errorf("Unable to flush %s: %s", lib.PebbleDB.Fortune.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if err = lib.PebbleDB.Fortune.DB.Close(); err != nil {
|
||||
log.Errorf("Unable to close %s: %s", lib.PebbleDB.Fortune.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if err = lib.PebbleDB.Count.DB.Flush(); err != nil {
|
||||
log.Errorf("Unable to flush %s: %s", lib.PebbleDB.Count.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if err = lib.PebbleDB.Count.DB.Close(); err != nil {
|
||||
log.Errorf("Unable to close %s: %s", lib.PebbleDB.Count.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
log.Printf("Seeded %d fortunes in database.\n", lib.Counter)
|
||||
}
|
||||
|
||||
/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */
|
||||
250
cmd/seed-friday/main.go
Normal file
250
cmd/seed-friday/main.go
Normal file
@@ -0,0 +1,250 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"aleesa-phrases-go/internal/lib"
|
||||
|
||||
"github.com/cockroachdb/pebble"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
func main() {
|
||||
lib.Config = lib.ReadConfig()
|
||||
var err error
|
||||
|
||||
// Откроем все нужные нам для работы базюльки
|
||||
var options pebble.Options
|
||||
// По дефолту ограничение ставится на мегабайты данных, а не на количество файлов, поэтому с дефолтными настройками
|
||||
// порождается огромное количество файлов. Умолчальное ограничение на количество файлов - 500 штук, что нас не
|
||||
// устраивает, поэтому немного снизим эту цифру до более приемлемых значений
|
||||
options.L0CompactionFileThreshold = 8
|
||||
|
||||
lib.PebbleDB.Monday.Name = "monday"
|
||||
lib.PebbleDB.Monday.DB, err = pebble.Open(lib.Config.DataDir+"/friday_db/"+lib.PebbleDB.Monday.Name, &options)
|
||||
if err != nil {
|
||||
log.Errorf("Unable to open monday db: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
lib.PebbleDB.Tuesday.Name = "tuesday"
|
||||
lib.PebbleDB.Tuesday.DB, err = pebble.Open(lib.Config.DataDir+"/friday_db/"+lib.PebbleDB.Tuesday.Name, &options)
|
||||
if err != nil {
|
||||
log.Errorf("Unable to open tuesday db: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
lib.PebbleDB.Wednesday.Name = "wednesday"
|
||||
lib.PebbleDB.Wednesday.DB, err = pebble.Open(lib.Config.DataDir+"/friday_db/"+lib.PebbleDB.Wednesday.Name, &options)
|
||||
if err != nil {
|
||||
log.Errorf("Unable to open wednesday db: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
lib.PebbleDB.Thursday.Name = "thursday"
|
||||
lib.PebbleDB.Thursday.DB, err = pebble.Open(lib.Config.DataDir+"/friday_db/"+lib.PebbleDB.Thursday.Name, &options)
|
||||
if err != nil {
|
||||
log.Errorf("Unable to open thursday db: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
lib.PebbleDB.Friday.Name = "friday"
|
||||
lib.PebbleDB.Friday.DB, err = pebble.Open(lib.Config.DataDir+"/friday_db/"+lib.PebbleDB.Friday.Name, &options)
|
||||
if err != nil {
|
||||
log.Errorf("Unable to open friday db: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
lib.PebbleDB.Saturday.Name = "saturday"
|
||||
lib.PebbleDB.Saturday.DB, err = pebble.Open(lib.Config.DataDir+"/friday_db/"+lib.PebbleDB.Saturday.Name, &options)
|
||||
if err != nil {
|
||||
log.Errorf("Unable to open saturday db: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
lib.PebbleDB.Sunday.Name = "sunday"
|
||||
lib.PebbleDB.Sunday.DB, err = pebble.Open(lib.Config.DataDir+"/friday_db/"+lib.PebbleDB.Sunday.Name, &options)
|
||||
if err != nil {
|
||||
log.Errorf("Unable to open sunday db: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
lib.PebbleDB.Count.Name = "count_db"
|
||||
lib.PebbleDB.Count.DB, err = pebble.Open(lib.Config.DataDir+"/"+lib.PebbleDB.Count.Name, &options)
|
||||
if err != nil {
|
||||
log.Errorf("Unable to open count_db: %s\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
file := lib.Config.DataDir + "/friday_src/friday.txt"
|
||||
bytesRead, err := os.ReadFile(file)
|
||||
|
||||
if err != nil {
|
||||
log.Errorf("Unable to read %s: %s\n", file, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
fileContent := string(bytesRead)
|
||||
|
||||
// Для каждой базюльки нам нужен отдельный счётчик
|
||||
var counter = []int{0, 0, 0, 0, 0, 0, 0}
|
||||
|
||||
re := regexp.MustCompile("(\n\r|\r\n|\n|\r)")
|
||||
|
||||
for _, line := range re.Split(fileContent, -1) {
|
||||
data := strings.Split(line, " || ")
|
||||
|
||||
if data[0] == "" || data[1] == "" {
|
||||
continue
|
||||
}
|
||||
|
||||
for _, day := range strings.Split(data[1], "") {
|
||||
dayNum, err := strconv.Atoi(day)
|
||||
|
||||
if err != nil {
|
||||
log.Errorf("Unable to seed phrase to db phrase is: %s, error is: %s\n", data[0], err)
|
||||
continue
|
||||
}
|
||||
|
||||
if dayNum > 7 || dayNum < 1 {
|
||||
log.Errorf("Unable to seed phrase to db phrase is: %s, daynum must be in range 1..7\n", data[0])
|
||||
continue
|
||||
}
|
||||
|
||||
dayNum -= 1
|
||||
database := fmt.Sprintf("friday_db/%s", lib.Dow[dayNum])
|
||||
counter[dayNum] += 1
|
||||
key := fmt.Sprintf("%d", counter[dayNum])
|
||||
value := strings.Trim(data[0], "\n\r\t ")
|
||||
|
||||
switch dayNum {
|
||||
case 0:
|
||||
if err := lib.StoreKV(lib.PebbleDB.Monday.DB, lib.PebbleDB.Monday.Name, key, value, true); err != nil {
|
||||
log.Errorf("Unable to store key %s with value %s in %s: %s", key, value, database, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
case 1:
|
||||
if err := lib.StoreKV(lib.PebbleDB.Tuesday.DB, lib.PebbleDB.Tuesday.Name, key, value, true); err != nil {
|
||||
log.Errorf("Unable to store key %s with value %s in %s: %s", key, value, database, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
case 2:
|
||||
if err := lib.StoreKV(lib.PebbleDB.Wednesday.DB, lib.PebbleDB.Wednesday.Name, key, value, true); err != nil {
|
||||
log.Errorf("Unable to store key %s with value %s in %s: %s", key, value, database, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
case 3:
|
||||
if err := lib.StoreKV(lib.PebbleDB.Thursday.DB, lib.PebbleDB.Thursday.Name, key, value, true); err != nil {
|
||||
log.Errorf("Unable to store key %s with value %s in %s: %s", key, value, database, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
case 4:
|
||||
if err := lib.StoreKV(lib.PebbleDB.Friday.DB, lib.PebbleDB.Friday.Name, key, value, true); err != nil {
|
||||
log.Errorf("Unable to store key %s with value %s in %s: %s", key, value, database, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
case 5:
|
||||
if err := lib.StoreKV(lib.PebbleDB.Saturday.DB, lib.PebbleDB.Saturday.Name, key, value, true); err != nil {
|
||||
log.Errorf("Unable to store key %s with value %s in %s: %s", key, value, database, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
case 6:
|
||||
if err := lib.StoreKV(lib.PebbleDB.Sunday.DB, lib.PebbleDB.Sunday.Name, key, value, true); err != nil {
|
||||
log.Errorf("Unable to store key %s with value %s in %s: %s", key, value, database, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Не забудем позакрывать все БД к лешему.
|
||||
if err = lib.PebbleDB.Monday.DB.Flush(); err != nil {
|
||||
log.Errorf("Unable to flush %s: %s", lib.PebbleDB.Monday.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if err = lib.PebbleDB.Monday.DB.Close(); err != nil {
|
||||
log.Errorf("Unable to close %s: %s", lib.PebbleDB.Monday.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if err = lib.PebbleDB.Tuesday.DB.Flush(); err != nil {
|
||||
log.Errorf("Unable to flush %s: %s", lib.PebbleDB.Tuesday.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if err = lib.PebbleDB.Tuesday.DB.Close(); err != nil {
|
||||
log.Errorf("Unable to close %s: %s", lib.PebbleDB.Tuesday.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if err = lib.PebbleDB.Wednesday.DB.Flush(); err != nil {
|
||||
log.Errorf("Unable to flush %s: %s", lib.PebbleDB.Wednesday.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if err = lib.PebbleDB.Wednesday.DB.Close(); err != nil {
|
||||
log.Errorf("Unable to close %s: %s", lib.PebbleDB.Wednesday.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if err = lib.PebbleDB.Thursday.DB.Flush(); err != nil {
|
||||
log.Errorf("Unable to flush %s: %s", lib.PebbleDB.Thursday.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if err = lib.PebbleDB.Thursday.DB.Close(); err != nil {
|
||||
log.Errorf("Unable to close %s: %s", lib.PebbleDB.Thursday.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if err = lib.PebbleDB.Friday.DB.Flush(); err != nil {
|
||||
log.Errorf("Unable to flush %s: %s", lib.PebbleDB.Friday.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if err = lib.PebbleDB.Friday.DB.Close(); err != nil {
|
||||
log.Errorf("Unable to close %s: %s", lib.PebbleDB.Friday.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if err = lib.PebbleDB.Saturday.DB.Flush(); err != nil {
|
||||
log.Errorf("Unable to flush %s: %s", lib.PebbleDB.Saturday.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if err = lib.PebbleDB.Saturday.DB.Close(); err != nil {
|
||||
log.Errorf("Unable to close %s: %s", lib.PebbleDB.Saturday.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if err = lib.PebbleDB.Sunday.DB.Flush(); err != nil {
|
||||
log.Errorf("Unable to flush %s: %s", lib.PebbleDB.Sunday.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if err = lib.PebbleDB.Sunday.DB.Close(); err != nil {
|
||||
log.Errorf("Unable to close %s: %s", lib.PebbleDB.Sunday.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if err = lib.PebbleDB.Count.DB.Flush(); err != nil {
|
||||
log.Errorf("Unable to flush %s: %s", lib.PebbleDB.Count.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if err = lib.PebbleDB.Count.DB.Close(); err != nil {
|
||||
log.Errorf("Unable to close %s: %s", lib.PebbleDB.Count.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
for i, amount := range counter {
|
||||
log.Printf("Seeded %d phrases in friday module %s database.\n", amount, lib.Dow[i])
|
||||
}
|
||||
}
|
||||
|
||||
/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */
|
||||
110
cmd/seed-proverb/main.go
Normal file
110
cmd/seed-proverb/main.go
Normal file
@@ -0,0 +1,110 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"aleesa-phrases-go/internal/lib"
|
||||
|
||||
"github.com/cockroachdb/pebble"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
func main() {
|
||||
lib.Config = lib.ReadConfig()
|
||||
file := lib.Config.DataDir + "/proverb_src/proverb.txt"
|
||||
|
||||
fh, err := os.Open(file)
|
||||
|
||||
if err != nil {
|
||||
log.Errorf("Unable to open file %s: %s\n", file, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
defer func(fh *os.File) {
|
||||
err := fh.Close()
|
||||
|
||||
if err != nil {
|
||||
log.Errorf("Unable to close %s cleanly: %s", file, err)
|
||||
}
|
||||
}(fh)
|
||||
|
||||
reader := bufio.NewReader(fh)
|
||||
|
||||
// Откроем все наши БД
|
||||
var options pebble.Options
|
||||
// По дефолту ограничение ставится на мегабайты данных, а не на количество файлов, поэтому с дефолтными настройками
|
||||
// порождается огромное количество файлов. Умолчальное ограничение на количество файлов - 500 штук, что нас не
|
||||
// устраивает, поэтому немного снизим эту цифру до более приемлемых значений
|
||||
options.L0CompactionFileThreshold = 8
|
||||
|
||||
lib.PebbleDB.Proverb.Name = "proverb_db"
|
||||
lib.PebbleDB.Proverb.DB, err = pebble.Open(lib.Config.DataDir+"/"+lib.PebbleDB.Proverb.Name, &options)
|
||||
if err != nil {
|
||||
log.Errorf("Unable to open %s: %s", lib.PebbleDB.Proverb.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
lib.PebbleDB.Count.Name = "count_db"
|
||||
lib.PebbleDB.Count.DB, err = pebble.Open(lib.Config.DataDir+"/"+lib.PebbleDB.Count.Name, &options)
|
||||
if err != nil {
|
||||
log.Errorf("Unable to open %s: %s", lib.PebbleDB.Count.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
for {
|
||||
lib.Counter += 1
|
||||
line, err := reader.ReadString('\n')
|
||||
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
key := fmt.Sprintf("%d", lib.Counter)
|
||||
value := strings.Trim(line, "\n\r\t ")
|
||||
|
||||
if err := lib.StoreKV(lib.PebbleDB.Proverb.DB, lib.PebbleDB.Proverb.Name, key, value, true); err != nil {
|
||||
log.Errorf("Unable to store key %s with value %s in proverb_db: %s", key, value, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
break
|
||||
}
|
||||
|
||||
log.Errorf("Unable to read string from %s: %s\n", file, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
key := fmt.Sprintf("%d", lib.Counter)
|
||||
value := strings.Trim(line, "\n\r\t ")
|
||||
|
||||
if err := lib.StoreKV(lib.PebbleDB.Proverb.DB, lib.PebbleDB.Proverb.Name, key, value, true); err != nil {
|
||||
log.Errorf("Unable to store key %s with value %s in proverb_db: %s", key, value, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
if err = lib.PebbleDB.Proverb.DB.Flush(); err != nil {
|
||||
log.Errorf("Unable to flush %s: %s", lib.PebbleDB.Proverb.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if err = lib.PebbleDB.Proverb.DB.Close(); err != nil {
|
||||
log.Errorf("Unable to close %s: %s", lib.PebbleDB.Proverb.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if err = lib.PebbleDB.Count.DB.Flush(); err != nil {
|
||||
log.Errorf("Unable to flush %s: %s", lib.PebbleDB.Count.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if err = lib.PebbleDB.Count.DB.Close(); err != nil {
|
||||
log.Errorf("Unable to close %s: %s", lib.PebbleDB.Count.Name, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
log.Printf("Seeded %d proverbs in database.\n", lib.Counter)
|
||||
}
|
||||
|
||||
/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */
|
||||
Reference in New Issue
Block a user