fix: 修复写队列 busy 恢复、关闭安全、备份与配置构建问题
This commit is contained in:
+28
-5
@@ -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 == "" {
|
||||
|
||||
Reference in New Issue
Block a user