95f6df6fe0
Signed-off-by: Michael Mayer <michael@photoprism.app>
108 lines
1.9 KiB
Go
108 lines
1.9 KiB
Go
package entity
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/jinzhu/gorm"
|
|
_ "github.com/jinzhu/gorm/dialects/mysql"
|
|
_ "github.com/jinzhu/gorm/dialects/sqlite"
|
|
)
|
|
|
|
// Supported test databases.
|
|
const (
|
|
MySQL = "mysql"
|
|
SQLite3 = "sqlite3"
|
|
SQLiteTestDB = ".test.db"
|
|
SQLiteMemoryDSN = ":memory:?cache=shared"
|
|
)
|
|
|
|
// dbConn is the global gorm.DB connection provider.
|
|
var dbConn Gorm
|
|
|
|
// Gorm is a gorm.DB connection provider interface.
|
|
type Gorm interface {
|
|
Db() *gorm.DB
|
|
}
|
|
|
|
// DbConn is a gorm.DB connection provider.
|
|
type DbConn struct {
|
|
Driver string
|
|
Dsn string
|
|
|
|
once sync.Once
|
|
db *gorm.DB
|
|
}
|
|
|
|
// Db returns the gorm db connection.
|
|
func (g *DbConn) Db() *gorm.DB {
|
|
g.once.Do(g.Open)
|
|
|
|
if g.db == nil {
|
|
log.Fatal("migrate: database not connected")
|
|
}
|
|
|
|
return g.db
|
|
}
|
|
|
|
// Open creates a new gorm db connection.
|
|
func (g *DbConn) Open() {
|
|
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)
|
|
db.DB().SetMaxIdleConns(4)
|
|
db.DB().SetMaxOpenConns(256)
|
|
|
|
g.db = db
|
|
}
|
|
|
|
// Close closes the gorm db connection.
|
|
func (g *DbConn) Close() {
|
|
if g.db != nil {
|
|
if err := g.db.Close(); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
g.db = nil
|
|
}
|
|
}
|
|
|
|
// 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()
|
|
}
|
|
|
|
// SetDbProvider sets the Gorm database connection provider.
|
|
func SetDbProvider(conn Gorm) {
|
|
dbConn = conn
|
|
}
|
|
|
|
// HasDbProvider returns true if a db provider exists.
|
|
func HasDbProvider() bool {
|
|
return dbConn != nil
|
|
}
|