Skip to content

Commit

Permalink
feat: 增加MySQL引擎支持
Browse files Browse the repository at this point in the history
  • Loading branch information
bugtower100 committed Dec 26, 2024
1 parent be0d69c commit ec1dddf
Show file tree
Hide file tree
Showing 7 changed files with 285 additions and 131 deletions.
8 changes: 4 additions & 4 deletions .env
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# DB_TYPE=mysql
# DB_DSN="mysql://user:password@tcp(localhost:3306)/dbname"
# DB_DSN="root:root@tcp(127.0.0.1:3306)/nokoti?charset=utf8mb4&parseTime=True&loc=Local"

DB_TYPE=postgres
DB_DSN="postgres://postgres:pinenut666@localhost:5432/nokoti?sslmode=disable"
# DB_TYPE=postgres
# DB_DSN="postgres://postgres:pinenut666@localhost:5432/nokoti?sslmode=disable"
# SQLITE IS DIFFERENT
# DB_TYPE=sqlite
DB_TYPE=sqlite
# DATA_DIR="./data/default"
3 changes: 1 addition & 2 deletions dice/model/database/mysql.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ import (

func MySQLDBInit(dsn string) (*gorm.DB, error) {
// 构建 MySQL DSN (Data Source Name)
// dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", user, password, host, dbName)

// 使用 GORM 连接 MySQL
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
Expand All @@ -28,6 +26,7 @@ func MySQLDBInit(dsn string) (*gorm.DB, error) {
if err != nil {
return nil, err
}
// 存疑,MYSQL是否需要使用缓存
cacheDB, err := cache.GetBuntCacheDB(db)
if err != nil {
return nil, err
Expand Down
122 changes: 74 additions & 48 deletions dice/model/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,92 +2,118 @@ package model

import (
"os"
"sync"

"gorm.io/gorm"

log "sealdice-core/utils/kratos"
)

func DatabaseInit() (dataDB *gorm.DB, logsDB *gorm.DB, err error) {
var (
engine DatabaseOperator
once sync.Once
engineError error

Check failure on line 15 in dice/model/db.go

View workflow job for this annotation

GitHub Actions / Test & Lint

the variable name `engineError` should conform to the `errXxx` format (errname)
)

// initEngine 初始化数据库引擎,仅执行一次
func initEngine() {
dbType := os.Getenv("DB_TYPE")
var engine DatabaseOperator
switch dbType {
case SQLITE:
log.Info("当前选择使用: SQLITE数据库")
engine = &SQLiteEngine{}
case MYSQL:
// TODO
log.Warn("当前配置默认使用: SQLITE数据库")
engine = &SQLiteEngine{}
log.Info("当前选择使用: MYSQL数据库")
engine = &MYSQLEngine{}
case POSTGRESQL:
log.Info("当前选择使用: POSTGRESQL数据库")
engine = &PGSQLEngine{}
default:

log.Warn("当前配置默认使用: SQLITE数据库")
log.Warn("未配置数据库类型,默认使用: SQLITE数据库")
engine = &SQLiteEngine{}
}
err = engine.Init()

engineError = engine.Init()
if engineError != nil {
log.Error("数据库引擎初始化失败:", engineError)
}
}

// getEngine 获取数据库引擎,确保只初始化一次
func getEngine() (DatabaseOperator, error) {
once.Do(initEngine)
return engine, engineError
}

// DatabaseInit 初始化数据和日志数据库
func DatabaseInit() (dataDB *gorm.DB, logsDB *gorm.DB, err error) {
engine, err = getEngine()
if err != nil {
return nil, nil, err
}

dataDB, err = engine.DataDBInit()
if err != nil {
return nil, nil, err
}

logsDB, err = engine.LogDBInit()
if err != nil {
return nil, nil, err
}
// TODO: 将这段逻辑挪移到Migrator上
var ids []uint64
var logItemSums []struct {
LogID uint64
Count int64
}
logsDB.Model(&LogInfo{}).Where("size IS NULL").Pluck("id", &ids)
if len(ids) > 0 {
// 根据 LogInfo 表中的 IDs 查找对应的 LogOneItem 记录
err = logsDB.Model(&LogOneItem{}).
Where("log_id IN ?", ids).
Group("log_id").
Select("log_id, COUNT(*) AS count"). // 如果需要求和其他字段,可以使用 Sum
Scan(&logItemSums).Error
if err != nil {
// 错误处理
log.Infof("Error querying LogOneItem: %v", err)
return nil, nil, err
}

// 2. 更新 LogInfo 表的 Size 字段
for _, sum := range logItemSums {
// 将求和结果更新到对应的 LogInfo 的 Size 字段
err = logsDB.Model(&LogInfo{}).
Where("id = ?", sum.LogID).
UpdateColumn("size", sum.Count).Error // 或者是 sum.Time 等,如果要是其他字段的求和
if err != nil {
// 错误处理
log.Errorf("Error updating LogInfo: %v", err)
return nil, nil, err
}
}
}
return dataDB, logsDB, nil
}

// DBCheck 检查数据库状态
func DBCheck() {
dbType := os.Getenv("DB_TYPE")
var engine DatabaseOperator
switch dbType {
case SQLITE:
log.Info("当前选择使用:SQLITE数据库")
engine = &SQLiteEngine{}
case MYSQL:
// TODO
log.Warn("当前配置:MYSQL未能实现,默认使用: SQLITE数据库")
engine = &SQLiteEngine{}
case POSTGRESQL:
log.Info("当前选择使用:PGSQL 数据库")
engine = &PGSQLEngine{}
default:
log.Warn("当前配置默认使用: SQLITE数据库")
engine = &SQLiteEngine{}
}
err := engine.Init()
dbEngine, err := getEngine()
if err != nil {
log.Error("数据库引擎获取失败:", err)
return
}
engine.DBCheck()

dbEngine.DBCheck()
}

// CensorDBInit 初始化敏感词数据库
func CensorDBInit() (censorDB *gorm.DB, err error) {
dbType := os.Getenv("DB_TYPE")
var engine DatabaseOperator
switch dbType {
case SQLITE:
engine = &SQLiteEngine{}
case MYSQL:
// TODO
log.Warn("当前配置默认使用: SQLITE数据库")
engine = &SQLiteEngine{}
case POSTGRESQL:
engine = &PGSQLEngine{}
default:
log.Warn("当前配置默认使用: SQLITE数据库")
engine = &SQLiteEngine{}
}
err = engine.Init()
censorEngine, err := getEngine()
if err != nil {
return nil, err
}
init, err := engine.CensorDBInit()
if err != nil {
return nil, err
}
return init, nil

return censorEngine.CensorDBInit()
}
43 changes: 0 additions & 43 deletions dice/model/db_utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@ import (
"database/sql/driver"
"errors"
"fmt"
"os"
"path/filepath"
"runtime"
"strings"
"sync"

Expand Down Expand Up @@ -46,46 +43,6 @@ func (j BYTE) Value() (driver.Value, error) {
return []byte(j), nil
}

// DBCacheDelete 删除SQLite数据库缓存文件
// TODO: 判断缓存是否应该被删除
func DBCacheDelete() bool {
dataDir := "./data/default"

tryDelete := func(fn string) bool {
fnPath, _ := filepath.Abs(filepath.Join(dataDir, fn))
if _, err := os.Stat(fnPath); err != nil {
// 文件不在了,就当作删除成功
return true
}
return os.Remove(fnPath) == nil
}

// 非 Windows 系统不删除缓存
if runtime.GOOS != "windows" {
return true
}
ok := true
if ok {
ok = tryDelete("data.db-shm")
}
if ok {
ok = tryDelete("data.db-wal")
}
if ok {
ok = tryDelete("data-logs.db-shm")
}
if ok {
ok = tryDelete("data-logs.db-wal")
}
if ok {
ok = tryDelete("data-censor.db-shm")
}
if ok {
ok = tryDelete("data-censor.db-wal")
}
return ok
}

// DBVacuum 整理数据库
func DBVacuum() {
done := make(chan interface{}, 1)
Expand Down
Loading

0 comments on commit ec1dddf

Please sign in to comment.