-
-
Notifications
You must be signed in to change notification settings - Fork 4
/
db.go
90 lines (78 loc) · 2.01 KB
/
db.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package db
import (
"fmt"
"os"
"strconv"
"time"
"gorm.io/driver/mysql"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"gorm.io/gorm/schema"
)
type Database interface {
Connect() error
Ping() bool
RunMigrations()
Find(interface{}, ...interface{}) error
Save(interface{}) error
}
func (db *FederationDB) Find(data interface{}, conds ...interface{}) error {
db.tx = db.DB.Find(data, conds)
return db.tx.Error
}
func (db *FederationDB) Ping() bool {
return db.DB.Exec("SELECT 1").Error == nil
}
type FederationDB struct {
*gorm.DB
tx *gorm.DB
}
func NewDatabase() Database {
return &FederationDB{}
}
func (d *FederationDB) Save(data interface{}) error {
db := d.DB.Save(data)
return db.Error
}
func (d *FederationDB) Connect() error {
var database *gorm.DB
var err error
if os.Getenv("DB_TYPE") == "postgres" {
database, err = gorm.Open(postgres.Open(os.Getenv("DB_DSN")), &gorm.Config{
NamingStrategy: schema.NamingStrategy{
TablePrefix: fmt.Sprintf("%s.", os.Getenv("DB_SCHEMA")), // schema name
SingularTable: false,
},
})
} else {
database, err = gorm.Open(mysql.Open(os.Getenv("DB_DSN")), &gorm.Config{})
}
if err != nil {
return err
}
// Get generic database object sql.DB to use its functions
sqlDB, err := database.DB()
if err != nil {
return err
}
// SetMaxIdleConns sets the maximum number of connections in the idle connection pool.
maxIdleCons, err := strconv.Atoi(os.Getenv("DB_MAX_IDLE_CONNS"))
if err != nil {
maxIdleCons = 10
}
sqlDB.SetMaxIdleConns(maxIdleCons)
// SetMaxOpenConns sets the maximum number of open connections to the database.
maxOpenCons, err := strconv.Atoi(os.Getenv("DB_MAX_OPEN_CONNS"))
if err != nil {
maxOpenCons = 100
}
sqlDB.SetMaxOpenConns(maxOpenCons)
// SetConnMaxLifetime sets the maximum amount of time a connection may be reused.
maxConnLifetime, err := time.ParseDuration(os.Getenv("DB_MAX_CONN_LIFETIME"))
if err != nil {
maxConnLifetime = 60
}
sqlDB.SetConnMaxLifetime(maxConnLifetime * time.Minute)
d.DB = database
return nil
}