88 lines
1.9 KiB
Go
88 lines
1.9 KiB
Go
package client
|
||
|
||
import (
|
||
"Blog/bootstrap"
|
||
"os"
|
||
"sync"
|
||
|
||
"github.com/glebarez/sqlite"
|
||
"github.com/sirupsen/logrus"
|
||
"gorm.io/gorm"
|
||
)
|
||
|
||
var fileGorm *DB
|
||
var blogGorm *DB
|
||
var gormInitMutex *sync.Mutex = &sync.Mutex{}
|
||
|
||
type DB struct {
|
||
*gorm.DB
|
||
Mutex *sync.RWMutex
|
||
}
|
||
|
||
// sqlite无法同时多个线程写入,需要上锁保护,读操作无需考虑
|
||
func (db *DB) WGorm(txFunc func(tx *gorm.DB) error) error {
|
||
db.Mutex.Lock()
|
||
err := db.Transaction(txFunc)
|
||
db.Mutex.Unlock()
|
||
return err
|
||
}
|
||
|
||
func BlogGormClient() *DB {
|
||
//为空就初始化
|
||
if blogGorm == nil {
|
||
gormInitMutex.Lock()
|
||
if blogGorm == nil {
|
||
path := bootstrap.Config.Database.Sqlite.BlogPath
|
||
logrus.Info("数据库文件位置:", path)
|
||
_, err := os.Stat(path)
|
||
if err != nil || os.IsNotExist(err) {
|
||
panic("SQLite数据库文件不存在!")
|
||
}
|
||
|
||
orm, err := gorm.Open(sqlite.Open(path), &gorm.Config{})
|
||
if err != nil {
|
||
panic("BlogGorm初始化异常!" + err.Error())
|
||
}
|
||
// orm.Exec("PRAGMA journal_mode=WAL;")
|
||
|
||
blogGorm = &DB{
|
||
DB: orm,
|
||
Mutex: &sync.RWMutex{},
|
||
}
|
||
logrus.Info("SQLite连接成功,BlogGorm初始化完成")
|
||
}
|
||
gormInitMutex.Unlock()
|
||
}
|
||
return blogGorm
|
||
}
|
||
|
||
func FileGormClient() *DB {
|
||
//为空就初始化
|
||
if fileGorm == nil {
|
||
gormInitMutex.Lock()
|
||
if fileGorm == nil {
|
||
path := bootstrap.Config.Database.Sqlite.FilePath
|
||
logrus.Info("数据库文件位置:", path)
|
||
// path := "./sqlite.db"
|
||
_, err := os.Stat(path)
|
||
if err != nil || os.IsNotExist(err) {
|
||
panic("sqlite数据库文件不存在!")
|
||
}
|
||
|
||
orm, err := gorm.Open(sqlite.Open(path), &gorm.Config{})
|
||
if err != nil {
|
||
panic("Gorm初始化异常!" + err.Error())
|
||
}
|
||
// orm.Exec("PRAGMA journal_mode=WAL;")
|
||
|
||
fileGorm = &DB{
|
||
DB: orm,
|
||
Mutex: &sync.RWMutex{},
|
||
}
|
||
logrus.Info("SQLite连接成功,FileGorm初始化完成")
|
||
}
|
||
gormInitMutex.Unlock()
|
||
}
|
||
return fileGorm
|
||
}
|