photoprism/internal/entity/db_conn.go
Michael Mayer 65e9a58979 Backend: Refactor gorm.DB connection provider in entity package
Signed-off-by: Michael Mayer <michael@photoprism.app>
2022-10-01 15:17:04 +02:00

109 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:"
)
// 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
}