infrastructures.getDSN   A
last analyzed

Complexity

Conditions 2

Size

Total Lines 10
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 7
nop 1
dl 0
loc 10
rs 10
c 0
b 0
f 0
1
package infrastructures
2
3
import (
4
	"log"
5
	"os"
6
	"time"
7
8
	"github.com/memnix/memnix-rest/config"
9
	"github.com/memnix/memnix-rest/pkg/env"
10
	"github.com/pkg/errors"
11
	"gorm.io/driver/mysql"
12
	"gorm.io/gorm"
13
	"gorm.io/gorm/logger"
14
)
15
16
var DBConn *gorm.DB
17
18
// GetDBConn returns the database connection object
19
func GetDBConn() *gorm.DB {
20
	return DBConn
21
}
22
23
// getDSN returns the database connection string
24
// see: utils/env.go
25
func getDSN(env *env.Env) string {
26
	var dsn string
27
28
	// Get database configuration from environment variables
29
	if env.GetEnv("APP_ENV") == "dev" {
30
		dsn = env.GetEnv("DEBUG_DB_DSN")
31
	} else {
32
		dsn = env.GetEnv("DB_DSN")
33
	}
34
	return dsn
35
}
36
37
// ConnectDB creates a connection to database
38
//
39
// see: utils/config.go and utils/env.go for more details
40
func ConnectDB() error {
41
	newLogger := logger.New(
42
		log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
43
		logger.Config{
44
			LogLevel:                  logger.Error, // Log level
45
			IgnoreRecordNotFoundError: true,         // Ignore ErrRecordNotFound error for logger
46
			Colorful:                  true,         // Disable color
47
		},
48
	)
49
50
	dsn := getDSN(config.EnvHelper)
51
52
	// Open connection
53
	conn, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
54
		Logger:                                   newLogger, // Logger
55
		SkipDefaultTransaction:                   true,      // Skip default transaction
56
		DisableForeignKeyConstraintWhenMigrating: true,      // Disable foreign key constraint when migrating (planetscale recommends this)
57
	})
58
	if err != nil {
59
		return errors.Wrap(err, "failed to connect to database")
60
	}
61
62
	sqlDB, err := conn.DB() // Get sql.DB object from gorm.DB
63
	if err != nil {
64
		return errors.Wrap(err, "failed to get sql.DB object")
65
	}
66
	sqlDB.SetMaxIdleConns(config.SQLMaxIdleConns) // Set max idle connections
67
	sqlDB.SetMaxOpenConns(config.SQLMaxOpenConns) // Set max open connections
68
	sqlDB.SetConnMaxLifetime(time.Hour)           // Set max connection lifetime
69
70
	DBConn = conn
71
72
	return nil
73
}
74
75
func DisconnectDB() error {
76
	sqlDB, err := GetDBConn().DB() // Get sql.DB object from gorm.DB
77
	if err != nil {
78
		return errors.Wrap(err, "failed to get sql.DB object")
79
	}
80
	if err = sqlDB.Close(); err != nil {
81
		return errors.Wrap(err, "failed to close database connection")
82
	}
83
84
	return nil
85
}
86