package storage import ( "database/sql" "os" "path/filepath" _ "github.com/mattn/go-sqlite3" ) type Database struct { db *sql.DB } func InitDB() Database { const dbPath = "/root/database/license.db" // 确保目录存在 _ = os.MkdirAll(filepath.Dir(dbPath), 0700) db, _ := sql.Open("sqlite3", dbPath) db.Exec(`CREATE TABLE IF NOT EXISTS activations ( id INTEGER PRIMARY KEY AUTOINCREMENT, machine_id TEXT UNIQUE, license TEXT, activated INTEGER )`) db.Exec(`CREATE TABLE IF NOT EXISTS generations ( id INTEGER PRIMARY KEY AUTOINCREMENT, machine_id TEXT UNIQUE, license TEXT )`) /* ➊ 额外表:持久化私钥(仅一行) */ db.Exec(`CREATE TABLE IF NOT EXISTS private ( id INTEGER PRIMARY KEY, key TEXT )`) return Database{db} } func (d Database) HasActivated(machineID string) bool { row := d.db.QueryRow("SELECT activated FROM activations WHERE machine_id = ?", machineID) var activated int err := row.Scan(&activated) return err == nil && activated == 1 } func (d Database) SaveActivation(machineID string, licenseText string) { d.db.Exec("INSERT OR REPLACE INTO activations(machine_id, license, activated) VALUES (?, ?, 1)", machineID, licenseText) } func (d Database) HasGenerated(machineID string) bool { row := d.db.QueryRow("SELECT license FROM generations WHERE machine_id = ?", machineID) var license string err := row.Scan(&license) return err == nil } func (d Database) SaveGenerated(machineID string, licenseText string) { d.db.Exec("INSERT OR REPLACE INTO generations(machine_id, license) VALUES (?, ?)", machineID, licenseText) } /* ===== 新增两个工具方法 ===== */ func (d Database) GetPrivateKey() (string, bool) { row := d.db.QueryRow("SELECT key FROM private WHERE id = 1") var key string return key, row.Scan(&key) == nil } func (d Database) SavePrivateKey(key string) { d.db.Exec("INSERT OR REPLACE INTO private(id, key) VALUES (1, ?)", key) }