fix: 修复写队列 busy 恢复、关闭安全、备份与配置构建问题

This commit is contained in:
Nixevol
2026-09-30 16:21:05 +08:00
parent 4059a1576b
commit 57c2f70678
23 changed files with 825 additions and 101 deletions
+28 -5
View File
@@ -8,7 +8,13 @@ import (
"time"
)
const settingAdminPasswordHash = "admin_password_hash"
const (
settingAdminPasswordHash = "admin_password_hash"
adminPasswordSQL = `
INSERT INTO settings(key, value, updated_at) VALUES(?, ?, ?)
ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = excluded.updated_at
`
)
// HasAdminPassword 检查 settings 中是否已有管理员密码哈希。
func HasAdminPassword(ctx context.Context, db *sql.DB) (bool, error) {
@@ -26,13 +32,30 @@ func HasAdminPassword(ctx context.Context, db *sql.DB) (bool, error) {
// SetAdminPasswordHash 写入或覆盖管理员密码哈希。
func SetAdminPasswordHash(ctx context.Context, db *sql.DB, phc string) error {
now := time.Now().UnixMilli()
_, err := db.ExecContext(ctx, `
INSERT INTO settings(key, value, updated_at) VALUES(?, ?, ?)
ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = excluded.updated_at
`, settingAdminPasswordHash, phc, now)
_, err := db.ExecContext(ctx, adminPasswordSQL, settingAdminPasswordHash, phc, now)
return err
}
func setAdminPasswordHashTx(tx *sql.Tx, phc string) error {
now := time.Now().UnixMilli()
_, err := tx.Exec(adminPasswordSQL, settingAdminPasswordHash, phc, now)
return err
}
// ResetAdminPassword 更新管理员密码哈希并清空全部管理会话。
func (d *DB) ResetAdminPassword(ctx context.Context, phc string) error {
if d == nil || d.Queue == nil {
return fmt.Errorf("store: not open")
}
return d.Queue.Do(ctx, func(tx *sql.Tx) error {
if err := setAdminPasswordHashTx(tx, phc); err != nil {
return err
}
_, err := tx.Exec(`DELETE FROM admin_sessions`)
return err
})
}
// VacuumInto 对打开的写连接执行 VACUUM INTO(可用于运行中备份)。
func VacuumInto(ctx context.Context, db *sql.DB, outPath string) error {
if outPath == "" {