Private
Public Access
1
0
Files
u-desk/internal/storage/sqlite.go
绝尘 ee4b1f5ac1 修复:审查发现的高优先问题(竞态/初始化/碰撞)
- app.go: profileSvc移入App struct,用a.mu保护
- sqlite.go: InitFast加sync.Once防并发双重初始化
- client.go: Manager.Connect加sync.Mutex防竞态泄漏SSH
- service.go: 临时文件用os.CreateTemp防时间戳碰撞
- connection-manager: 密码缺失时不再塞入假WailsTransport
2026-05-04 15:40:04 +08:00

71 lines
1.4 KiB
Go

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{}); e != nil {
initErr = e
return
}
globalDB = db
})
if initErr != nil {
return nil, initErr
}
return globalDB, nil
}
func GetDB() *gorm.DB {
return globalDB
}