package database import ( "fmt" "log/slog" "net/url" _ "github.com/lib/pq" "github.com/spf13/viper" "xorm.io/xorm" "xorm.io/xorm/log" "xorm.io/xorm/names" ) var engine *xorm.Engine func Connect() (*xorm.Engine, error) { if engine != nil { return engine, nil } dburl := url.URL{ Scheme: "postgres", User: url.UserPassword(viper.GetString("db.user"), viper.GetString("db.password")), Host: fmt.Sprintf("%s:%d", viper.GetString("db.host"), viper.GetInt("db.port")), Path: fmt.Sprintf("/%s", viper.GetString("db.database")), } engi, err := xorm.NewEngine("postgres", dburl.String()) if err != nil { slog.Error("Could not connect to DB", "url", dburl.Redacted(), "error", err) return nil, err } engi.SetMapper(names.LintGonicMapper) err = engi.Sync(new(User), new(File)) if err != nil { slog.Error("Error syncing DB schema", "error", err) } if viper.GetBool("db.debug") { engi.SetLogLevel(log.LOG_DEBUG) engi.ShowSQL(true) } engine = engi return engi, nil } func Ping() error { err := engine.DB().Ping() if err != nil { slog.Error("Error connecting to DB", "error", err) return err } else { slog.Info("DB: Pong") return nil } }