Completed
Push — main ( 3a80b2...74ebe2 )
by Yume
15s queued 13s
created

infrastructures.ConnectDB   A

Complexity

Conditions 3

Size

Total Lines 50
Code Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 22
nop 0
dl 0
loc 50
rs 9.352
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
// DBConn is the database connection object
17
var DBConn *gorm.DB
18
19
// GetDBConn returns the database connection object
20
func GetDBConn() *gorm.DB {
21
	return DBConn
22
}
23
24
// getDSN returns the database connection string
25
// see: utils/env.go
26
func getDSN(env *env.Env) string {
27
	var dsn string
28
29
	// Get database configuration from environment variables
30
	if config.IsDevelopment() {
31
		dsn = env.GetEnv("DEBUG_DB_DSN")
32
	} else {
33
		dsn = env.GetEnv("DB_DSN")
34
	}
35
	return dsn
36
}
37
38
// ConnectDB creates a connection to database
39
//
40
// see: utils/config.go and utils/env.go for more details
41
func ConnectDB() error {
42
	newLogger := logger.New(
43
		log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
44
		logger.Config{
45
			LogLevel:                  logger.Silent, // Log level
46
			IgnoreRecordNotFoundError: true,          // Ignore ErrRecordNotFound error for logger
47
			Colorful:                  true,          // Disable color
48
		},
49
	)
50
51
	dsn := getDSN(config.EnvHelper)
52
53
	// Open connection
54
	conn, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
55
		Logger:                                   newLogger, // Logger
56
		SkipDefaultTransaction:                   true,      // Skip default transaction
57
		DisableForeignKeyConstraintWhenMigrating: true,      // Disable foreign key constraint when migrating (planetscale recommends this)
58
	})
59
	if err != nil {
60
		return errors.Wrap(err, "failed to connect to database")
61
	}
62
63
	sqlDB, err := conn.DB() // Get sql.DB object from gorm.DB
64
	if err != nil {
65
		return errors.Wrap(err, "failed to get sql.DB object")
66
	}
67
	sqlDB.SetMaxIdleConns(config.SQLMaxIdleConns) // Set max idle connections
68
	sqlDB.SetMaxOpenConns(config.SQLMaxOpenConns) // Set max open connections
69
	sqlDB.SetConnMaxLifetime(time.Second)         // Set max connection lifetime
70
71
	/*
72
		if err = conn.Use(prometheus.New(prometheus.Config{
73
			DBName:          "db1",                                // `DBName` as metrics label
74
			RefreshInterval: config.GormPrometheusRefreshInterval, // refresh metrics interval (default 15 seconds)
75
			StartServer:     false,                                // start http server to expose metrics
76
			MetricsCollector: []prometheus.MetricsCollector{
77
				&prometheus.MySQL{VariableNames: []string{"Threads_running"}},
78
			},
79
		})); err != nil {
80
			return err
81
		}
82
83
84
			if err = conn.Use(tracing.NewPlugin(tracing.WithoutMetrics())); err != nil {
85
				return err
86
			} */
87
88
	DBConn = conn
89
90
	return nil
91
}
92
93
// DisconnectDB closes the database connection
94
func DisconnectDB() error {
95
	sqlDB, err := GetDBConn().DB() // Get sql.DB object from gorm.DB
96
	if err != nil {
97
		return errors.Wrap(err, "failed to get sql.DB object")
98
	}
99
	if err = sqlDB.Close(); err != nil {
100
		return errors.Wrap(err, "failed to close database connection")
101
	}
102
103
	return nil
104
}
105