Private
Public Access
1
0
Files
u-desk/internal/storage/sqlite.go

75 lines
1.9 KiB
Go
Raw Permalink 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 '%:'")
globalDB = db
})
if initErr != nil {
return nil, initErr
}
return globalDB, nil
}
func GetDB() *gorm.DB {
return globalDB
}