2020-04-30 20:07:03 +02:00
|
|
|
package entity
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"sync"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/jinzhu/gorm"
|
|
|
|
_ "github.com/jinzhu/gorm/dialects/mysql"
|
2020-05-30 14:52:47 +02:00
|
|
|
_ "github.com/jinzhu/gorm/dialects/sqlite"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Database drivers (sql dialects).
|
|
|
|
const (
|
2021-12-09 07:47:23 +01:00
|
|
|
MySQL = "mysql"
|
|
|
|
SQLite3 = "sqlite3"
|
2020-04-30 20:07:03 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
var dbProvider DbProvider
|
|
|
|
|
|
|
|
type DbProvider interface {
|
|
|
|
Db() *gorm.DB
|
|
|
|
}
|
|
|
|
|
2020-05-30 14:52:47 +02:00
|
|
|
// IsDialect returns true if the given sql dialect is used.
|
|
|
|
func IsDialect(name string) bool {
|
|
|
|
return name == Db().Dialect().GetName()
|
|
|
|
}
|
|
|
|
|
|
|
|
// DbDialect returns the sql dialect name.
|
|
|
|
func DbDialect() string {
|
|
|
|
return Db().Dialect().GetName()
|
|
|
|
}
|
|
|
|
|
2020-04-30 20:07:03 +02:00
|
|
|
// SetDbProvider sets the provider to get a gorm db connection.
|
|
|
|
func SetDbProvider(provider DbProvider) {
|
|
|
|
dbProvider = provider
|
|
|
|
}
|
|
|
|
|
2020-05-08 15:41:01 +02:00
|
|
|
// HasDbProvider returns true if a db provider exists.
|
|
|
|
func HasDbProvider() bool {
|
|
|
|
return dbProvider != nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Db returns a database connection.
|
2020-04-30 20:07:03 +02:00
|
|
|
func Db() *gorm.DB {
|
|
|
|
return dbProvider.Db()
|
|
|
|
}
|
|
|
|
|
2020-05-08 15:41:01 +02:00
|
|
|
// UnscopedDb returns an unscoped database connection.
|
|
|
|
func UnscopedDb() *gorm.DB {
|
2020-04-30 20:07:03 +02:00
|
|
|
return Db().Unscoped()
|
|
|
|
}
|
|
|
|
|
|
|
|
type Gorm struct {
|
|
|
|
Driver string
|
|
|
|
Dsn string
|
|
|
|
|
|
|
|
once sync.Once
|
|
|
|
db *gorm.DB
|
|
|
|
}
|
|
|
|
|
|
|
|
// Db returns the gorm db connection.
|
|
|
|
func (g *Gorm) Db() *gorm.DB {
|
|
|
|
g.once.Do(g.Connect)
|
|
|
|
|
|
|
|
if g.db == nil {
|
|
|
|
log.Fatal("entity: database not connected")
|
|
|
|
}
|
|
|
|
|
|
|
|
return g.db
|
|
|
|
}
|
|
|
|
|
|
|
|
// Connect creates a new gorm db connection.
|
|
|
|
func (g *Gorm) Connect() {
|
|
|
|
db, err := gorm.Open(g.Driver, g.Dsn)
|
|
|
|
|
|
|
|
if err != nil || db == nil {
|
|
|
|
for i := 1; i <= 12; i++ {
|
|
|
|
fmt.Printf("gorm.Open(%s, %s) %d\n", g.Driver, g.Dsn, i)
|
|
|
|
db, err = gorm.Open(g.Driver, g.Dsn)
|
|
|
|
|
|
|
|
if db != nil && err == nil {
|
|
|
|
break
|
|
|
|
} else {
|
|
|
|
time.Sleep(5 * time.Second)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if err != nil || db == nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
db.LogMode(false)
|
|
|
|
db.SetLogger(log)
|
2020-05-30 14:52:47 +02:00
|
|
|
db.DB().SetMaxIdleConns(4)
|
2020-05-28 15:12:18 +02:00
|
|
|
db.DB().SetMaxOpenConns(256)
|
2020-04-30 20:07:03 +02:00
|
|
|
|
|
|
|
g.db = db
|
|
|
|
}
|
|
|
|
|
|
|
|
// Close closes the gorm db connection.
|
|
|
|
func (g *Gorm) Close() {
|
|
|
|
if g.db != nil {
|
|
|
|
if err := g.db.Close(); err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
g.db = nil
|
|
|
|
}
|
|
|
|
}
|