package config import ( "fmt" "log/slog" "gorm.io/driver/postgres" "gorm.io/driver/sqlite" "gorm.io/gorm" "gorm.io/gorm/logger" ) func NewDB(db Database) (*gorm.DB, error) { db_type := db.Type slog.Info("using database", "type", db_type) switch db_type { case "postgres": dsn := fmt.Sprintf( "host=%s user=%s password=%s dbname=%s port=%d sslmode=disable", db.Host, db.User, db.Password, db.Name, db.Port, ) return gorm.Open(postgres.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Info), }) case "sqlite": return gorm.Open(sqlite.Open(db.Path), &gorm.Config{ Logger: logger.Default.LogMode(logger.Info), }) default: return nil, fmt.Errorf("unknown db.type=%s", db_type) } // Configure GORM with custom settings // The logger helps with debugging SQL queries during development // if err != nil { // log.Fatal("Failed to connect to database:", err) // } // // Get the underlying SQL database connection for pool configuration // sqlDB, err := db.DB() // if err != nil { // log.Fatal("Failed to get database instance:", err) // } // // Configure connection pool settings // // MaxIdleConns: number of connections kept open when idle // sqlDB.SetMaxIdleConns(10) // // MaxOpenConns: maximum total connections to the database // sqlDB.SetMaxOpenConns(100) // // ConnMaxLifetime: how long a connection can be reused // sqlDB.SetConnMaxLifetime(time.Hour) // slog.Info("Database connected successfully") }