mirror of
https://github.com/Dvorinka/Containr.git
synced 2026-06-03 20:12:58 +00:00
60 lines
1.3 KiB
Go
60 lines
1.3 KiB
Go
package database
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"fmt"
|
|
"time"
|
|
|
|
_ "github.com/lib/pq"
|
|
)
|
|
|
|
type DB struct {
|
|
*sql.DB
|
|
}
|
|
|
|
type DBConfig struct {
|
|
MaxOpenConns int
|
|
MaxIdleConns int
|
|
ConnMaxLifetime time.Duration
|
|
ConnMaxIdleTime time.Duration
|
|
}
|
|
|
|
func NewConnection(databaseURL string) (*DB, error) {
|
|
return NewConnectionWithConfig(databaseURL, DBConfig{
|
|
MaxOpenConns: 25,
|
|
MaxIdleConns: 25,
|
|
ConnMaxLifetime: 5 * time.Minute,
|
|
ConnMaxIdleTime: 5 * time.Minute,
|
|
})
|
|
}
|
|
|
|
func NewConnectionWithConfig(databaseURL string, config DBConfig) (*DB, error) {
|
|
db, err := sql.Open("postgres", databaseURL)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("unable to open database: %w", err)
|
|
}
|
|
|
|
// Configure connection pool
|
|
db.SetMaxOpenConns(config.MaxOpenConns)
|
|
db.SetMaxIdleConns(config.MaxIdleConns)
|
|
db.SetConnMaxLifetime(config.ConnMaxLifetime)
|
|
db.SetConnMaxIdleTime(config.ConnMaxIdleTime)
|
|
|
|
// Test the connection
|
|
if err := db.PingContext(context.Background()); err != nil {
|
|
return nil, fmt.Errorf("unable to ping database: %w", err)
|
|
}
|
|
|
|
return &DB{DB: db}, nil
|
|
}
|
|
|
|
func (db *DB) Health(ctx context.Context) error {
|
|
return db.PingContext(ctx)
|
|
}
|
|
|
|
// Stats returns connection pool statistics for monitoring
|
|
func (db *DB) Stats() sql.DBStats {
|
|
return db.Stats()
|
|
}
|