// Package store 只负责数据库连接(Open / Close / DB)与迁移(Migrate / MigrateEvent)。 // // 这里没有仓储代码:真正的读写都在 internal/httpapi 的各 repo*.go 里。 package store import ( "database/sql" "fmt" "os" "path/filepath" _ "modernc.org/sqlite" ) // Store 持有系统库(data/system.db)的连接。 type Store struct { db *sql.DB } // Open 打开(必要时创建)数据目录下的 system.db。 func Open(dataDir string) (*Store, error) { if err := os.MkdirAll(dataDir, 0o755); err != nil { return nil, fmt.Errorf("创建数据目录 %s: %w", dataDir, err) } path := filepath.Join(dataDir, "system.db") dsn := "file:" + path + "?_pragma=journal_mode(WAL)" + "&_pragma=foreign_keys(1)" + "&_pragma=busy_timeout(5000)" db, err := sql.Open("sqlite", dsn) if err != nil { return nil, fmt.Errorf("打开数据库 %s: %w", path, err) } // SQLite 只允许单个写者,连接数收紧到 1 最省心。 db.SetMaxOpenConns(1) if err := db.Ping(); err != nil { _ = db.Close() return nil, fmt.Errorf("连接数据库 %s: %w", path, err) } return &Store{db: db}, nil } // Close 关闭数据库连接。 func (s *Store) Close() error { return s.db.Close() } // DB 暴露底层连接,供仓储层使用。 func (s *Store) DB() *sql.DB { return s.db }