58 lines
1.1 KiB
Go
58 lines
1.1 KiB
Go
package db
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
"trustcontact/internal/config"
|
|
|
|
"gorm.io/driver/postgres"
|
|
"gorm.io/driver/sqlite"
|
|
"gorm.io/gorm"
|
|
gormlogger "gorm.io/gorm/logger"
|
|
)
|
|
|
|
func Open(cfg *config.Config) (*gorm.DB, error) {
|
|
if cfg == nil {
|
|
return nil, fmt.Errorf("config is nil")
|
|
}
|
|
|
|
gormCfg := &gorm.Config{Logger: newLogger(cfg.Env)}
|
|
|
|
switch cfg.DBDriver {
|
|
case config.DBDriverSQLite:
|
|
if err := ensureSQLiteDir(cfg.SQLitePath); err != nil {
|
|
return nil, fmt.Errorf("prepare sqlite dir: %w", err)
|
|
}
|
|
return gorm.Open(sqlite.Open(cfg.SQLitePath), gormCfg)
|
|
case config.DBDriverPostgres:
|
|
return gorm.Open(postgres.Open(cfg.PostgresDSN), gormCfg)
|
|
default:
|
|
return nil, fmt.Errorf("unsupported db driver: %s", cfg.DBDriver)
|
|
}
|
|
}
|
|
|
|
func newLogger(env string) gormlogger.Interface {
|
|
level := gormlogger.Warn
|
|
if env == config.EnvDevelop {
|
|
level = gormlogger.Info
|
|
}
|
|
|
|
return gormlogger.Default.LogMode(level)
|
|
}
|
|
|
|
func ensureSQLiteDir(sqlitePath string) error {
|
|
dir := filepath.Dir(sqlitePath)
|
|
if dir == "." || dir == "" {
|
|
return nil
|
|
}
|
|
|
|
return os.MkdirAll(dir, 0o755)
|
|
}
|
|
|
|
func nowUTC() time.Time {
|
|
return time.Now().UTC()
|
|
}
|