mirror of
https://github.com/woodchen-ink/random-api-go.git
synced 2025-07-18 05:42:01 +08:00
134 lines
2.8 KiB
Go
134 lines
2.8 KiB
Go
package database
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
"random-api-go/models"
|
|
|
|
"github.com/glebarez/sqlite"
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm/logger"
|
|
)
|
|
|
|
var DB *gorm.DB
|
|
|
|
// Initialize 初始化数据库
|
|
func Initialize(dataDir string) error {
|
|
// 确保数据目录存在
|
|
if err := os.MkdirAll(dataDir, 0755); err != nil {
|
|
return fmt.Errorf("failed to create data directory: %w", err)
|
|
}
|
|
|
|
dbPath := filepath.Join(dataDir, "data.db")
|
|
|
|
// 配置GORM
|
|
config := &gorm.Config{
|
|
Logger: logger.Default.LogMode(logger.Info),
|
|
}
|
|
|
|
var err error
|
|
DB, err = gorm.Open(sqlite.Open(dbPath), config)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to open database: %w", err)
|
|
}
|
|
|
|
// 获取底层的sql.DB来设置连接池参数
|
|
sqlDB, err := DB.DB()
|
|
if err != nil {
|
|
return fmt.Errorf("failed to get underlying sql.DB: %w", err)
|
|
}
|
|
|
|
// 设置连接池参数
|
|
sqlDB.SetMaxOpenConns(1) // SQLite建议单连接
|
|
sqlDB.SetMaxIdleConns(1)
|
|
sqlDB.SetConnMaxLifetime(time.Hour)
|
|
|
|
// 自动迁移数据库结构
|
|
if err := autoMigrate(); err != nil {
|
|
return fmt.Errorf("failed to migrate database: %w", err)
|
|
}
|
|
|
|
log.Printf("Database initialized successfully at %s", dbPath)
|
|
return nil
|
|
}
|
|
|
|
// autoMigrate 自动迁移数据库结构
|
|
func autoMigrate() error {
|
|
return DB.AutoMigrate(
|
|
&models.APIEndpoint{},
|
|
&models.DataSource{},
|
|
&models.URLReplaceRule{},
|
|
&models.CachedURL{},
|
|
&models.Config{},
|
|
)
|
|
}
|
|
|
|
// Close 关闭数据库连接
|
|
func Close() error {
|
|
if DB != nil {
|
|
sqlDB, err := DB.DB()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return sqlDB.Close()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// CleanExpiredCache 清理过期缓存
|
|
func CleanExpiredCache() error {
|
|
return DB.Where("expires_at < ?", time.Now()).Delete(&models.CachedURL{}).Error
|
|
}
|
|
|
|
// GetConfig 获取配置值
|
|
func GetConfig(key string, defaultValue string) string {
|
|
var config models.Config
|
|
if err := DB.Where("key = ?", key).First(&config).Error; err != nil {
|
|
if err == gorm.ErrRecordNotFound {
|
|
return defaultValue
|
|
}
|
|
log.Printf("Failed to get config %s: %v", key, err)
|
|
return defaultValue
|
|
}
|
|
return config.Value
|
|
}
|
|
|
|
// SetConfig 设置配置值
|
|
func SetConfig(key, value, configType string) error {
|
|
var config models.Config
|
|
err := DB.Where("key = ?", key).First(&config).Error
|
|
|
|
if err == gorm.ErrRecordNotFound {
|
|
// 创建新配置
|
|
config = models.Config{
|
|
Key: key,
|
|
Value: value,
|
|
Type: configType,
|
|
}
|
|
return DB.Create(&config).Error
|
|
} else if err != nil {
|
|
return err
|
|
}
|
|
|
|
// 更新现有配置
|
|
config.Value = value
|
|
config.Type = configType
|
|
return DB.Save(&config).Error
|
|
}
|
|
|
|
// ListConfigs 列出所有配置
|
|
func ListConfigs() ([]models.Config, error) {
|
|
var configs []models.Config
|
|
err := DB.Order("key").Find(&configs).Error
|
|
return configs, err
|
|
}
|
|
|
|
// DeleteConfig 删除配置
|
|
func DeleteConfig(key string) error {
|
|
return DB.Where("key = ?", key).Delete(&models.Config{}).Error
|
|
}
|