package db import ( "fmt" "repo-pattern/app/lib/cfg" "repo-pattern/app/lib/logging" "strconv" "strings" "time" "gorm.io/driver/postgres" "gorm.io/gorm" gormLogger "gorm.io/gorm/logger" ) const CONNECTION_MAX_IDLE_TIME = time.Minute * 1 const DB_CONNECTION_TIMEOUT = 5 var DBConn *gorm.DB func ConnectToDb(config *cfg.DatabaseConfig) (*gorm.DB, error) { var connectionString = strings.Join([]string{ "postgres://", config.Username, ":", config.Password, "@", config.Host, ":", config.Port, "/", config.Name, "?sslmode=disable", "&TimeZone=UTC", "&connect_timeout=", strconv.Itoa(DB_CONNECTION_TIMEOUT), }, "") var logLevel gormLogger.LogLevel if config.DebugSQL { logLevel = gormLogger.Info } else { logLevel = gormLogger.Silent } conn, err := gorm.Open(postgres.Open(connectionString), &gorm.Config{ Logger: gormLogger.Default.LogMode(logLevel), }) if err != nil { return nil, err } return conn, nil } func InitDB() *gorm.DB { var err error DBConn, err = ConnectToDb(&cfg.Config.Database) if err != nil { msg := fmt.Sprintf("Error connecting to database: %s. Terminating!", err) logging.Log.Error(msg) panic(msg) } // set connection autodisconnect after idle time db, _ := DBConn.DB() db.SetConnMaxIdleTime(CONNECTION_MAX_IDLE_TIME) return DBConn }