package database import ( "fmt" "log" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" ) // Initialize creates and configures the database connection // Uses MySQL driver with proper connection pooling and charset support func Initialize(host, port, user, password, dbname, charset string) (*gorm.DB, error) { // Configure GORM logger gormLogger := logger.Default.LogMode(logger.Info) // Build MySQL DSN (Data Source Name) // Format: user:password@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=True&loc=Local", user, password, host, port, dbname, charset) // Open MySQL database connection db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: gormLogger, }) if err != nil { return nil, fmt.Errorf("failed to connect to database: %w", err) } // Get underlying SQL DB for connection pool configuration sqlDB, err := db.DB() if err != nil { return nil, fmt.Errorf("failed to get underlying database: %w", err) } // Configure connection pool for MySQL sqlDB.SetMaxIdleConns(10) // Maximum number of idle connections sqlDB.SetMaxOpenConns(100) // Maximum number of open connections sqlDB.SetConnMaxLifetime(3600) // Maximum connection lifetime (1 hour) sqlDB.SetConnMaxIdleTime(600) // Maximum idle time (10 minutes) log.Printf("Database connected: %s@%s:%s/%s", user, host, port, dbname) return db, nil }