插件卸载清配置:删除配置项定义与插件配置表

- ConfigRegistry.RemovePlugin(name):删除 defs 中 plugin.<name>.* 配置项定义
  (该插件 RegisterDef 注册的全部配置项)+ DROP 插件配置表 config_<name>
  (含用户设置值);ListPlugins 基于 config_% 表枚举,卸载后插件配置区
  在 WebUI/Settings API 中完全消失
- Registry.RemovePlugin 在 RemoveDisabledPlugin 基础上追加 RemovePlugin 调用;
  语义与 onRemove 回调(清数据文件)互补:删除 = 数据文件 + 配置 + 注册全清,
  disable/重载不清配置
This commit is contained in:
root
2026-08-02 13:43:01 +08:00
parent a965a74d27
commit b19eeca0cf
2 changed files with 19 additions and 0 deletions

View File

@ -74,6 +74,24 @@ func (r *ConfigRegistry) RemoveDisabledPlugin(name string) error {
return err return err
} }
// RemovePlugin 卸载插件时清理其全部配置痕迹:删除配置项定义
// defs 中 plugin.<name>.*,即该插件 RegisterDef 注册的配置项)并删除
// 插件配置表config_<name>,含用户设置值)。卸载后该插件配置区完全消失;
// 与插件自身的 onRemove 回调(清理数据文件)配合完成删除清理。
func (r *ConfigRegistry) RemovePlugin(name string) error {
r.mu.Lock()
defer r.mu.Unlock()
prefix := "plugin." + name + "."
for k := range r.defs {
if strings.HasPrefix(k, prefix) {
delete(r.defs, k)
}
}
table := r.pluginTableName(name)
_, err := r.db.Exec(fmt.Sprintf(`DROP TABLE IF EXISTS %s`, table))
return err
}
type DisabledPluginInfo struct { type DisabledPluginInfo struct {
Name string `json:"name"` Name string `json:"name"`
DisabledAt string `json:"disabled_at"` DisabledAt string `json:"disabled_at"`

View File

@ -615,6 +615,7 @@ func (r *Registry) RemovePlugin(name string) error {
} }
if r.cfgReg != nil { if r.cfgReg != nil {
r.cfgReg.RemoveDisabledPlugin(name) r.cfgReg.RemoveDisabledPlugin(name)
r.cfgReg.RemovePlugin(name)
} }
log.Printf("[plugin] removed: %s", name) log.Printf("[plugin] removed: %s", name)
return nil return nil