From 6de356e3408b7307b01e99b1f6b6f1e635a7766e Mon Sep 17 00:00:00 2001 From: lsv Date: Tue, 5 Oct 2021 16:23:27 +0500 Subject: [PATCH] Add bt_index_check call frmMaintenance, bug fix issues #19. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit добавлен вызов функции bt_index_check в форме обслуживания. Рассширение amcheck должно быть установлено. Исправлена ошибка #19. После изменения вывода bytea на hex формат, перестали распознаваться аргументы триггера. --- frm/frmMaintenance.cpp | 33 +++++++++++++++++++++++++++++++++ include/frm/frmMaintenance.h | 2 +- schema/pgTrigger.cpp | 4 ++-- ui/frmMaintenance.xrc | 1 + 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/frm/frmMaintenance.cpp b/frm/frmMaintenance.cpp index 2ebe5e5..a82c599 100644 --- a/frm/frmMaintenance.cpp +++ b/frm/frmMaintenance.cpp @@ -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; diff --git a/include/frm/frmMaintenance.h b/include/frm/frmMaintenance.h index 32cafba..675eefb 100644 --- a/include/frm/frmMaintenance.h +++ b/include/frm/frmMaintenance.h @@ -28,7 +28,7 @@ public: private: wxString GetHelpPage() const; void OnAction(wxCommandEvent &ev); - + wxString cmdcheck; DECLARE_EVENT_TABLE() }; diff --git a/schema/pgTrigger.cpp b/schema/pgTrigger.cpp index a381951..5018f9f 100644 --- a/schema/pgTrigger.cpp +++ b/schema/pgTrigger.cpp @@ -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()) diff --git a/ui/frmMaintenance.xrc b/ui/frmMaintenance.xrc index 78ebfe2..c92f5b4 100644 --- a/ui/frmMaintenance.xrc +++ b/ui/frmMaintenance.xrc @@ -28,6 +28,7 @@ REINDEX CLUSTER COMPRESS + AMCHECK 0