package database import ( "context" "database/sql" "fmt" "time" _ "github.com/lib/pq" "github.com/atlasos/calypso/internal/common/config" ) // DB wraps sql.DB with additional methods type DB struct { *sql.DB } // NewConnection creates a new database connection func NewConnection(cfg config.DatabaseConfig) (*DB, error) { dsn := fmt.Sprintf( "host=%s port=%d user=%s password=%s dbname=%s sslmode=%s", cfg.Host, cfg.Port, cfg.User, cfg.Password, cfg.Database, cfg.SSLMode, ) db, err := sql.Open("postgres", dsn) if err != nil { return nil, fmt.Errorf("failed to open database connection: %w", err) } // Configure connection pool db.SetMaxOpenConns(cfg.MaxConnections) db.SetMaxIdleConns(cfg.MaxIdleConns) db.SetConnMaxLifetime(cfg.ConnMaxLifetime) // Test connection ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := db.PingContext(ctx); err != nil { return nil, fmt.Errorf("failed to ping database: %w", err) } return &DB{db}, nil } // Close closes the database connection func (db *DB) Close() error { return db.DB.Close() } // Ping checks the database connection func (db *DB) Ping() error { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() return db.PingContext(ctx) }