/
mysql.go
58 lines (48 loc) · 1.53 KB
/
mysql.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
package repositories
import (
"context"
"time"
mysqldriver "github.com/go-sql-driver/mysql"
"github.com/sirupsen/logrus"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"gorm.io/gorm/schema"
)
// Create a new database connection that can be used by repositories.
func NewDatabaseConnection(dsn string) (*gorm.DB, error) {
cfg, err := mysqldriver.ParseDSN(dsn)
if err != nil {
return nil, err
}
cfg.ParseTime = true
cfg.Loc = time.UTC
cfg.Params = map[string]string{"charset": "utf8mb4"}
dsn = cfg.FormatDSN()
return gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
NamingStrategy: schema.NamingStrategy{
SingularTable: true,
},
})
}
// Create a new database connection and perform a migration.
// Try until connection succeeds or context is done.
func NewDatabaseConnectionAndMigrate(ctx context.Context, dsn string) (db *gorm.DB, err error) {
_, ok := ctx.Deadline()
if !ok {
logrus.Warn("no deadline was set for making database connection. we will try indefinately")
}
logrus.Info("connecting to database")
for {
db, err = NewDatabaseConnection(dsn)
if err == nil {
return db, db.AutoMigrate(&AppModel{}, &CloudFeedModel{}, &CampaignModel{}, &AccountModel{}, &CloudFeedAuthModel{}, &BuildingModel{}, &PropertyModel{}, &UploadModel{}, &DeviceTypeModel{}, &DeviceModel{}, &MeasurementModel{})
}
select {
case <-time.After(time.Second): // Wait for 1 second before we loop again.
case <-ctx.Done():
return // Return with the database and error.
}
}
}