|
|
package dbm
|
|
|
|
|
|
import (
|
|
|
"fmt"
|
|
|
"github.com/han-joker/moo-layout/api/moo/confm"
|
|
|
"github.com/han-joker/moo-layout/api/moo/logm"
|
|
|
"github.com/han-joker/moo-layout/api/moo/toolm"
|
|
|
"gorm.io/driver/sqlite"
|
|
|
"gorm.io/gorm"
|
|
|
)
|
|
|
|
|
|
const defaultType = "sqlite"
|
|
|
|
|
|
type DSN = string
|
|
|
|
|
|
var pool = map[DSN]*gorm.DB{}
|
|
|
|
|
|
type Option struct {
|
|
|
DSN
|
|
|
Options []gorm.Option
|
|
|
}
|
|
|
|
|
|
// New 创建对象
|
|
|
func New(options ...Option) *gorm.DB {
|
|
|
option := verifyOption(options)
|
|
|
return create(option)
|
|
|
}
|
|
|
|
|
|
// Get 存在直接返回,否则创建、存储再返回
|
|
|
func Get(options ...Option) *gorm.DB {
|
|
|
option := verifyOption(options)
|
|
|
if !Has(option.DSN) {
|
|
|
pool[option.DSN] = create(option)
|
|
|
}
|
|
|
return pool[option.DSN]
|
|
|
|
|
|
}
|
|
|
|
|
|
func verifyOption(options []Option) Option {
|
|
|
t := toolm.StringDefault(confm.Get().String("app.databaseType"), defaultType)
|
|
|
option := Option{
|
|
|
DSN: confm.Get().String(fmt.Sprintf("%s.DSN", t)),
|
|
|
Options: []gorm.Option{},
|
|
|
}
|
|
|
if len(options) > 0 {
|
|
|
if options[0].DSN != "" {
|
|
|
option.DSN = options[0].DSN
|
|
|
}
|
|
|
if options[0].Options != nil {
|
|
|
option.Options = options[0].Options
|
|
|
}
|
|
|
}
|
|
|
return option
|
|
|
}
|
|
|
|
|
|
// Has 存在返回 true,否则返回 false
|
|
|
func Has(dialector DSN) bool {
|
|
|
_, has := pool[dialector]
|
|
|
return has && pool[dialector] != nil
|
|
|
}
|
|
|
|
|
|
func create(option Option) *gorm.DB {
|
|
|
db, err := gorm.Open(sqlite.Open(option.DSN), option.Options...)
|
|
|
if err != nil {
|
|
|
logm.Get().Error(err)
|
|
|
}
|
|
|
return db
|
|
|
}
|