Passed
Push — main ( 7e619e...36c76a )
by Yume
01:54
created

infrastructures.*DBConnSingleton.DisconnectDB   A

Complexity

Conditions 3

Size

Total Lines 10
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

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