Files
cmbone/internal/services/store.go
T

100 lines
1.7 KiB
Go

package services
import (
"database/sql"
"os"
"path/filepath"
_ "modernc.org/sqlite"
)
const (
appConfigDirName = "cmbone"
databaseFileName = "cmbone.db"
)
type SuiStore struct {
DB *sql.DB
}
func getSafeDBPath() (string, error) {
configDir, err := os.UserConfigDir()
if err != nil {
return "", err
}
appDir := filepath.Join(configDir, appConfigDirName)
err = os.MkdirAll(appDir, 0755)
if err != nil {
return "", err
}
return filepath.Join(appDir, databaseFileName), nil
}
func NewSuiStore() (*SuiStore, error) {
dbPath, err := getSafeDBPath()
if err != nil {
return nil, err
}
db, err := sql.Open("sqlite", dbPath)
if err != nil {
return nil, err
}
err = Migrate(db)
if err != nil {
_ = db.Close()
return nil, err
}
return &SuiStore{DB: db}, nil
}
func (cs *SuiStore) Close() {
if cs != nil && cs.DB != nil {
_ = cs.DB.Close()
}
}
func (cs *SuiStore) Start() error {
// 这里可以初始化数据库或其它启动逻辑
return nil
}
func (cs *SuiStore) Stop() error {
cs.Close()
return nil
}
func Migrate(db *sql.DB) error {
_, err := db.Exec(`
CREATE TABLE IF NOT EXISTS hotkeys (
id INTEGER PRIMARY KEY AUTOINCREMENT,
keycode INTEGER NOT NULL,
modifiers INTEGER NOT NULL,
description TEXT,
target TEXT
);
CREATE TABLE IF NOT EXISTS appconfig (
id INTEGER PRIMARY KEY AUTOINCREMENT,
key TEXT UNIQUE,
type TEXT,
value TEXT,
description TEXT,
state INTEGER DEFAULT 0
);
`)
if err != nil {
return err
}
return initDefaultData(db)
}
func initDefaultData(db *sql.DB) error {
if _, err := db.Exec(defaultAppConfigSQL()); err != nil {
return err
}
if _, err := db.Exec(defaultHotkeysSQL()); err != nil {
return err
}
return nil
}