safesight-control/internal/storage/sqlite.go
tian 84b8b1c65a fix: remove transactions causing SQLITE_BUSY, add coding rules
- persistTask: 去掉事务,每个 Exec 原子即可
- saveAsset(profiles): 去掉事务,profile 和 units 分步保存
- CLAUDE.md: 加两条规则——不用事务除非必要;调试只加日志不改代码
2026-05-12 16:43:44 +08:00

53 lines
995 B
Go

package storage
import (
"database/sql"
"os"
"path/filepath"
_ "modernc.org/sqlite"
)
type Store struct {
db *sql.DB
}
func OpenSQLite(path string) (*Store, error) {
if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
return nil, err
}
db, err := sql.Open("sqlite", path)
if err != nil {
return nil, err
}
if err := migrate(db); err != nil {
_ = db.Close()
return nil, err
}
return &Store{db: db}, nil
}
func (s *Store) Close() error {
if s == nil || s.db == nil {
return nil
}
return s.db.Close()
}
func (s *Store) DB() *sql.DB {
if s == nil {
return nil
}
return s.db
}
func (s *Store) HasTable(name string) (bool, error) {
row := s.db.QueryRow(`SELECT COUNT(1) FROM sqlite_master WHERE type = 'table' AND name = ?`, name)
var count int
if err := row.Scan(&count); err != nil {
return false, err
}
return count > 0, nil
}