Files
QWQLwToo 079ee4eaeb
build-winui / winui (push) Has been cancelled
Add server components
2026-06-26 13:28:09 +08:00

116 lines
2.8 KiB
Go

package database
import (
"encoding/json"
"fmt"
"os"
"path/filepath"
"sync"
)
// DBConfigFile 数据库配置文件结构
type DBConfigFile struct {
Type string `json:"type"` // "sqlite" 或 "mysql"
Host string `json:"host"` // MySQL 主机
Port string `json:"port"` // MySQL 端口
User string `json:"user"` // MySQL 用户名
Password string `json:"password"` // MySQL 密码
Database string `json:"database"` // MySQL 数据库名
TablePrefix string `json:"table_prefix"` // 表前缀
DSN string `json:"dsn"` // SQLite 数据目录
Initialized bool `json:"initialized"` // 是否已初始化
}
var (
configFile *DBConfigFile
configFileLock sync.RWMutex
configFilePath = "data/db-config.json"
)
// LoadDBConfig 加载数据库配置
func LoadDBConfig() (*DBConfigFile, error) {
configFileLock.RLock()
if configFile != nil {
configFileLock.RUnlock()
return configFile, nil
}
configFileLock.RUnlock()
configFileLock.Lock()
defer configFileLock.Unlock()
// 双重检查
if configFile != nil {
return configFile, nil
}
// 确保目录存在
dir := filepath.Dir(configFilePath)
if err := os.MkdirAll(dir, 0755); err != nil {
return nil, fmt.Errorf("创建配置目录失败: %w", err)
}
// 读取配置文件
data, err := os.ReadFile(configFilePath)
if err != nil {
if os.IsNotExist(err) {
// 配置文件不存在,返回默认配置
configFile = &DBConfigFile{
Type: "mysql",
Host: "localhost",
Port: "3306",
User: "root",
Password: "",
Database: "software_download_center",
TablePrefix: "",
DSN: "data",
Initialized: false,
}
return configFile, nil
}
return nil, fmt.Errorf("读取配置文件失败: %w", err)
}
configFile = &DBConfigFile{}
if err := json.Unmarshal(data, configFile); err != nil {
return nil, fmt.Errorf("解析配置文件失败: %w", err)
}
return configFile, nil
}
// SaveDBConfig 保存数据库配置
func SaveDBConfig(config *DBConfigFile) error {
configFileLock.Lock()
defer configFileLock.Unlock()
// 确保目录存在
dir := filepath.Dir(configFilePath)
if err := os.MkdirAll(dir, 0755); err != nil {
return fmt.Errorf("创建配置目录失败: %w", err)
}
// 序列化配置
data, err := json.MarshalIndent(config, "", " ")
if err != nil {
return fmt.Errorf("序列化配置失败: %w", err)
}
// 写入文件
if err := os.WriteFile(configFilePath, data, 0644); err != nil {
return fmt.Errorf("写入配置文件失败: %w", err)
}
configFile = config
return nil
}
// IsDBInitialized 检查数据库是否已初始化
func IsDBInitialized() bool {
config, err := LoadDBConfig()
if err != nil {
return false
}
return config.Initialized
}