86 lines
1.5 KiB
Go
86 lines
1.5 KiB
Go
package db
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"time"
|
|
|
|
"gorm.io/driver/postgres"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
var (
|
|
DB *gorm.DB
|
|
)
|
|
|
|
// --------------------
|
|
// DATABASE CONNECTION
|
|
// --------------------
|
|
|
|
func Connect() {
|
|
dsn := fmt.Sprintf(
|
|
"host=%s user=%s password=%s dbname=%s port=%s sslmode=disable TimeZone=Asia/Kolkata",
|
|
mustEnv("DB_HOST"),
|
|
mustEnv("DB_USER"),
|
|
mustEnv("DB_PASSWORD"),
|
|
mustEnv("DB_NAME"),
|
|
getEnv("DB_PORT", "5433"),
|
|
)
|
|
|
|
var err error
|
|
DB, err = gorm.Open(postgres.Open(dsn), &gorm.Config{})
|
|
if err != nil {
|
|
log.Fatal("❌ Could not connect to database:", err)
|
|
}
|
|
|
|
setupDB(DB)
|
|
fmt.Println("✅ Database connected")
|
|
}
|
|
|
|
func setupDB(database *gorm.DB) {
|
|
sqlDB, err := database.DB()
|
|
if err != nil {
|
|
log.Fatal("❌ Failed to get DB from GORM:", err)
|
|
}
|
|
sqlDB.SetMaxIdleConns(100)
|
|
sqlDB.SetMaxOpenConns(1000)
|
|
sqlDB.SetConnMaxLifetime(time.Minute * 5)
|
|
}
|
|
|
|
// --------------------
|
|
// DATABASE SHUTDOWN
|
|
// --------------------
|
|
|
|
func CloseDB() {
|
|
if DB == nil {
|
|
return
|
|
}
|
|
sqlDB, err := DB.DB()
|
|
if err != nil {
|
|
log.Println("Error retrieving sql.DB:", err)
|
|
return
|
|
}
|
|
fmt.Println("Connection closed Successfully")
|
|
sqlDB.Close()
|
|
}
|
|
|
|
// --------------------
|
|
// ENV HELPERS
|
|
// --------------------
|
|
|
|
func mustEnv(key string) string {
|
|
val := os.Getenv(key)
|
|
if val == "" {
|
|
log.Fatalf("Missing required env variable: %s", key)
|
|
}
|
|
return val
|
|
}
|
|
|
|
func getEnv(key, fallback string) string {
|
|
if val := os.Getenv(key); val != "" {
|
|
return val
|
|
}
|
|
return fallback
|
|
}
|