wmj-test/src/orm.go

67 lines
1.2 KiB
Go

package k8s_manager
import (
"fmt"
"github.com/sirupsen/logrus"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"sync"
)
var instance *gorm.DB = nil
var lock sync.Mutex
func opendb() *gorm.DB {
if instance == nil {
lock.Lock()
if instance == nil {
db_host := GetConfig().DBHost
db_user := GetConfig().DBUser
db_pass := GetConfig().DBPassword
dsn := fmt.Sprintf("%s:%s@tcp(%s:3306)/k8s?charset=utf8mb4&parseTime=True&loc=Local", db_user, db_pass, db_host)
var err error
instance, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
logrus.WithError(err).Error("Cannot open database.")
instance = nil
}
}
lock.Unlock()
}
return instance
}
func checkdb(cnt int) *gorm.DB {
ans := opendb()
if ans == nil {
return nil
}
db, err := ans.DB()
if err != nil {
logrus.WithError(err).Error("Cannot get *sql.DB.")
db = nil
}
if db != nil {
err = db.Ping()
if err != nil {
logrus.WithError(err).Errorf("Ping error %d.", cnt)
err = db.Close()
if err != nil {
logrus.WithError(err).Errorf("Close error %d.", cnt)
}
instance = nil
ans = nil
}
}
return ans
}
func DB() *gorm.DB {
ans := checkdb(1)
if ans != nil {
return ans
}
instance = nil
return checkdb(2)
}