package gormdb import ( "fmt" "os" "time" "go.uber.org/zap" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" ) // GetGormDB returns a Gorm database connection. // // Parameters: // - log *zap.Logger: a logger instance // - host string: the database host // - name string: the database name // - user string: the database user // - pass string: the database password // - port string: the database port // - param string: the specific database parameters // - maxIdle int: the maximum number of idle connections // - maxOpen int: the maximum number of open connections // // Return type(s): // - *gorm.DB: the Gorm database connection // - error: an error, if any, encountered during the connection func GetMySQLDB(log *zap.Logger, host, name, user, pass, port, param string, maxIdle int, maxOpen int) (*gorm.DB, error) { //log.Infof("[GetGormDB] Connecting to 'database' %s on host %s as user '%s' (%s)", name, host, user, param) logLevel := logger.Silent if os.Getenv("LOG_LEVEL") == "info" { logLevel = logger.Info } var dsn string if param != "" { dsn = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?%s", user, pass, host, port, name, param) } else { dsn = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", user, pass, host, port, name) } db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logLevel), }) if err != nil { log.Error(fmt.Sprintf("GetGormDB:%s", err)) return db, err } log.Info(fmt.Sprintf("GetGormDB:successfully connected on host '%s' to database '%s' as user '%s' (%s)", host, name, user, param)) sqlDB, err := db.DB() sqlDB.SetMaxIdleConns(maxIdle) sqlDB.SetMaxOpenConns(maxOpen) sqlDB.SetConnMaxLifetime(time.Hour) sqlDB.SetConnMaxIdleTime(2 * time.Minute) return db, nil }