watchyourlan/internal/gdb/start.go
2025-07-26 20:52:25 +07:00

86 lines
1.7 KiB
Go

package gdb
import (
"log"
"log/slog"
"os"
"time"
sqlite "github.com/aceberg/gorm-sqlite"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"gorm.io/gorm/schema"
"github.com/aceberg/WatchYourLAN/internal/check"
"github.com/aceberg/WatchYourLAN/internal/conf"
"github.com/aceberg/WatchYourLAN/internal/models"
)
var db *gorm.DB
var gormConf *gorm.Config
// Start working with DB
func Start() {
var tab *gorm.DB
var err error
newLogger := logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags),
logger.Config{
SlowThreshold: 5 * time.Second,
LogLevel: logger.Warn,
IgnoreRecordNotFoundError: true,
Colorful: true,
},
)
gormConf = &gorm.Config{
Logger: newLogger,
NamingStrategy: schema.NamingStrategy{
NoLowerCase: true,
// So upper case Columns could work in both PostgreSQL and SQLite
},
}
Connect()
// Migrate the schema
tab = db.Table("now")
err = tab.AutoMigrate(&models.Host{})
check.IfError(err)
tab = db.Table("history")
err = tab.AutoMigrate(&models.Host{})
check.IfError(err)
}
// Connect - choose DB and connect
func Connect() {
var err error
var pgFail bool
if conf.AppConfig.UseDB == "postgres" {
db, err = gorm.Open(postgres.Open(conf.AppConfig.PGConnect), gormConf)
if err != nil {
pgFail = true
slog.Error("PostgreSQL connection error:", "err", err)
slog.Warn("Falling back to SQLite")
} else {
slog.Info("Connected to DB: PostgreSQL")
}
}
if pgFail || conf.AppConfig.UseDB != "postgres" {
db, err = gorm.Open(sqlite.Open(conf.AppConfig.DBPath), gormConf)
if !check.IfError(err) {
slog.Info("Connected to DB: SQLite")
db.Exec("PRAGMA journal_mode = wal;")
db.Exec("PRAGMA busy_timeout = 5000;")
}
}
}