Files
ReSendit/internal/db/db.go

125 lines
2.3 KiB
Go

package db
import (
"fmt"
"os"
"path/filepath"
"ResendIt/internal/logger"
"gorm.io/driver/mysql"
"gorm.io/driver/postgres"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
func Connect() (*gorm.DB, error) {
dbType := os.Getenv("DB_TYPE")
if dbType == "" {
dbType = "sqlite"
}
dsn := os.Getenv("DATABASE_URL")
if dbType == "sqlite" && dsn == "" {
dsn = "./data/database.db"
}
logger.Log.Info().
Str("type", "db_connect").
Str("db_type", dbType).
Msg("Connecting to database")
var db *gorm.DB
var err error
switch dbType {
case "sqlite":
db, err = connectSQLite(dsn)
case "postgres":
db, err = connectPostgres(dsn)
case "mysql":
db, err = connectMySQL(dsn)
default:
return nil, fmt.Errorf("unsupported DB_TYPE: %s", dbType)
}
if err != nil {
logger.Log.Error().
Str("type", "db_connect").
Str("db_type", dbType).
Err(err).
Msg("Failed to connect to database")
return nil, err
}
logger.Log.Info().
Str("type", "db_connect").
Str("db_type", dbType).
Msg("Database connected successfully")
return db, nil
}
func connectSQLite(filePath string) (*gorm.DB, error) {
if filePath == "" {
filePath = "./data.db"
}
dir := filepath.Dir(filePath)
if err := os.MkdirAll(dir, 0755); err != nil {
return nil, fmt.Errorf("failed to create directory %s: %w", dir, err)
}
db, err := gorm.Open(sqlite.Open(filePath), &gorm.Config{})
if err != nil {
return nil, fmt.Errorf("failed to open SQLite database: %w", err)
}
sqlDB, err := db.DB()
if err == nil {
sqlDB.SetMaxIdleConns(10)
sqlDB.SetMaxOpenConns(100)
}
return db, nil
}
func connectPostgres(dsn string) (*gorm.DB, error) {
if dsn == "" {
return nil, fmt.Errorf("DATABASE_URL is required for postgres")
}
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
return nil, fmt.Errorf("failed to connect to Postgres: %w", err)
}
sqlDB, err := db.DB()
if err == nil {
sqlDB.SetMaxIdleConns(10)
sqlDB.SetMaxOpenConns(100)
}
return db, nil
}
func connectMySQL(dsn string) (*gorm.DB, error) {
if dsn == "" {
return nil, fmt.Errorf("DATABASE_URL is required for mysql")
}
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
return nil, fmt.Errorf("failed to connect to MySQL: %w", err)
}
sqlDB, err := db.DB()
if err == nil {
sqlDB.SetMaxIdleConns(10)
sqlDB.SetMaxOpenConns(100)
}
return db, nil
}