Files
u-desk/internal/storage/sqlite.go
T
lxy 6ea9d9ac99 修复: SFTP连接首拉不显示与传输挂起
- watcher握手期伪触发致幻影本地列表,根因修复
- 连接探测2.5s超时竞速,握手10s预算
- 30s保活自动掐死半开连接,取连接时剔除已断开
- 副本命名与进度计数抽公共,下载缓存清理去重
2026-09-15 22:26:22 +08:00

77 lines
2.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package storage
import (
"fmt"
"os"
"path/filepath"
"sync"
"time"
"u-desk/internal/common"
"u-desk/internal/storage/models"
"github.com/glebarez/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
var globalDB *gorm.DB
var initOnce sync.Once
func Init() (*gorm.DB, error) {
return InitFast()
}
func InitFast() (*gorm.DB, error) {
if globalDB != nil {
return globalDB, nil
}
var initErr error
initOnce.Do(func() {
dataDir := common.GetUserDataDir()
if e := os.MkdirAll(dataDir, 0755); e != nil {
initErr = e
return
}
dbPath := filepath.Join(dataDir, "app.db")
db, e := gorm.Open(sqlite.Open(dbPath+"?_pragma=journal_mode(WAL)&_pragma=synchronous(NORMAL)&_pragma=cache_size(-64000)&_pragma=temp_store(MEMORY)&_pragma=mmap_size(30000000000)&_pragma=page_size(4096)&_pragma=foreign_keys(1)"), &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
SkipDefaultTransaction: true,
PrepareStmt: true,
})
if e != nil {
initErr = e
return
}
sqlDB, e := db.DB()
if e != nil {
initErr = fmt.Errorf("获取底层SQL数据库失败: %v", e)
return
}
sqlDB.SetMaxOpenConns(1)
sqlDB.SetMaxIdleConns(1)
sqlDB.SetConnMaxLifetime(time.Hour)
if e := db.AutoMigrate(&models.AppConfig{}, &models.ConnectionProfile{}, &models.DownloadCache{}, &models.BgmPlaylist{}); e != nil {
initErr = e
return
}
// 数据迁移:qiniu/aliyun → oss + provider
db.Exec("UPDATE connection_profiles SET provider = type, type = 'oss' WHERE type IN ('qiniu', 'aliyun')")
// 为旧 BGM 播放列表补充 profile_id(找第一个 OSS profile)
db.Exec("UPDATE bgm_playlist SET profile_id = (SELECT CAST(id AS VARCHAR) FROM connection_profiles WHERE type = 'oss' LIMIT 1) WHERE (profile_id = '' OR profile_id IS NULL) AND path NOT LIKE '%:'")
// 清理历史版本 id 断链重复 INSERT 堆积的重复服务器配置,保留每组 id 最小的一行
db.Exec("DELETE FROM connection_profiles WHERE id NOT IN (SELECT MIN(id) FROM connection_profiles GROUP BY name, type, host, port, bucket)")
globalDB = db
})
if initErr != nil {
return nil, initErr
}
return globalDB, nil
}
func GetDB() *gorm.DB {
return globalDB
}