Add bt_index_check call frmMaintenance, bug fix issues #19.

добавлен вызов функции bt_index_check в форме обслуживания.
Рассширение amcheck должно быть установлено.
Исправлена ошибка #19. После изменения вывода bytea на hex формат,
перестали распознаваться аргументы триггера.
This commit is contained in:
lsv 2021-10-05 16:23:27 +05:00
parent af59b63ae7
commit 6de356e340
4 changed files with 37 additions and 3 deletions

View file

@ -65,6 +65,7 @@ frmMaintenance::frmMaintenance(frmMain *form, pgObject *obj) : ExecutionDialog(f
txtMessages->SetMaxLength(0L);
#endif
bool iscomprss = false;
wxString cmd;
if (object->GetMetaType() == PGM_INDEX || object->GetMetaType() == PGM_PRIMARYKEY || object->GetMetaType() == PGM_UNIQUE)
{
rbxAction->SetSelection(2);
@ -74,6 +75,25 @@ frmMaintenance::frmMaintenance(frmMain *form, pgObject *obj) : ExecutionDialog(f
wxString ratio = object->GetConnection()->ExecuteScalar("select left((cfs_fragmentation("+object->GetOidStr()+")*100)::text,5)::text");
iscomprss = !(ratio == "NaN");
}
wxString sql = "SELECT \
case when(SELECT max(pronargs) FROM pg_proc WHERE proname = 'bt_index_check') = 3 then\
'bt_index_check(' || c.oid || ', true,' || i.indisunique || ')'\
when(SELECT max(pronargs) FROM pg_proc WHERE proname = 'bt_index_check') = 2 then\
'bt_index_check(' || c.oid || ', true)'\
else\
''\
end\
FROM pg_index i\
JOIN pg_opclass op ON i.indclass[0] = op.oid\
JOIN pg_am am ON op.opcmethod = am.oid\
JOIN pg_class c ON i.indexrelid = c.oid\
JOIN pg_namespace n ON c.relnamespace = n.oid\
WHERE am.amname = 'btree'\
AND c.relpersistence != 't'\
AND c.relkind = 'i' AND i.indisready AND i.indisvalid and c.oid = "+object->GetOidStr();
cmd = object->GetConnection()->ExecuteScalar(sql);
cmdcheck = cmd;
}
if (object->GetMetaType() == PGM_TABLE) {
pgTable* t = (pgTable *)object;
@ -81,6 +101,7 @@ frmMaintenance::frmMaintenance(frmMain *form, pgObject *obj) : ExecutionDialog(f
}
rbxAction->Enable(4, iscomprss);
rbxAction->Enable(5, !cmd.IsEmpty());
wxCommandEvent ev;
OnAction(ev);
}
@ -138,6 +159,11 @@ void frmMaintenance::OnAction(wxCommandEvent &ev)
chkVerbose->SetValue(true);
chkVerbose->Enable(true);
}
bool isAmcheck = (rbxAction->GetSelection() == 5);
if (isAmcheck) {
}
}
@ -240,6 +266,13 @@ wxString frmMaintenance::GetSql()
}
break;
}
case 5: // amchek
{
sql = wxT("SET client_min_messages = DEBUG1;select ");
sql += cmdcheck;
//wxString strindex = object->GetConnection()->ExecuteScalar("select string_agg('cfs_gc_relation('||indexrelid::text||')',',') from pg_index i where indrelid=" + object->GetOidStr() + " and cfs_fragmentation(indexrelid) between 0.01 and 1;");
break;
}
}
return sql;

View file

@ -28,7 +28,7 @@ public:
private:
wxString GetHelpPage() const;
void OnAction(wxCommandEvent &ev);
wxString cmdcheck;
DECLARE_EVENT_TABLE()
};

View file

@ -403,7 +403,7 @@ pgObject *pgTriggerFactory::CreateObjects(pgCollection *coll, ctlTree *browser,
}
wxString trig_sql;
trig_sql = wxT("SELECT t.oid, t.xmin, t.*, relname, CASE WHEN relkind = 'r' THEN TRUE ELSE FALSE END AS parentistable, ")+ref+
trig_sql = wxT("SELECT t.oid, t.xmin, encode(t.tgargs,'escape') tgargsE, t.*, relname, CASE WHEN relkind = 'r' THEN TRUE ELSE FALSE END AS parentistable, ")+ref+
wxT(" nspname, des.description, l.lanname, p.prosrc, \n")
wxT(" COALESCE(substring(pg_get_triggerdef(t.oid), 'WHEN (.*) EXECUTE PROCEDURE'), substring(pg_get_triggerdef(t.oid), 'WHEN (.*) \\$trigger')) AS whenclause\n")
wxT(" FROM pg_trigger t\n")
@ -491,7 +491,7 @@ pgObject *pgTriggerFactory::CreateObjects(pgCollection *coll, ctlTree *browser,
trigger->iSetQuotedFullTable(collection->GetDatabase()->GetQuotedSchemaPrefix(triggers->GetVal(wxT("nspname"))) + qtIdent(triggers->GetVal(wxT("relname"))));
wxString arglist = wxEmptyString;
if (triggers->GetLong(wxT("tgnargs")) > 0)
arglist = triggers->GetVal(wxT("tgargs"));
arglist = triggers->GetVal(wxT("tgargse"));
wxString args = wxEmptyString;
while (!arglist.IsEmpty())

View file

@ -28,6 +28,7 @@
<item>REINDEX</item>
<item>CLUSTER</item>
<item>COMPRESS</item>
<item>AMCHECK</item>
</content>
<selection>0</selection>
<style>wxRA_SPECIFY_ROWS</style>