diff --git a/pgadmin/dlg/dlgEventTrigger.cpp b/pgadmin/dlg/dlgEventTrigger.cpp new file mode 100644 index 0000000..56bf2dc --- /dev/null +++ b/pgadmin/dlg/dlgEventTrigger.cpp @@ -0,0 +1,265 @@ +////////////////////////////////////////////////////////////////////////// +// +// pgAdmin III - PostgreSQL Tools +// +// Copyright (C) 2002 - 2013, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +// dlgEventTrigger.cpp - PostgreSQL Trigger Property +// +////////////////////////////////////////////////////////////////////////// + +// wxWindows headers +#include + +// App headers +#include "pgAdmin3.h" +#include "utils/misc.h" +#include "frm/frmMain.h" +#include "utils/pgDefs.h" + +#include "dlg/dlgEventTrigger.h" +#include "schema/pgEventTrigger.h" +#include "ctl/ctlSeclabelPanel.h" + +// pointer to controls +#define chkEnable CTRL_CHECKBOX("chkEnable") +#define rdbEnableStatus CTRL_RADIOBOX("rdbEnableStatus") +#define cbFunction CTRL_COMBOBOX2("cbFunction") +#define rdbEvents CTRL_RADIOBOX("rdbEvents") +#define txtWhen CTRL_TEXT("txtWhen") +#define cbOwner CTRL_COMBOBOX2("cbOwner") + +BEGIN_EVENT_TABLE(dlgEventTrigger, dlgProperty) + EVT_CHECKBOX(XRCID("chkEnable"), dlgEventTrigger::OnChangeEnable) + EVT_RADIOBOX(XRCID("rdbEnableStatus"), dlgProperty::OnChange) + EVT_COMBOBOX(XRCID("cbFunction"), dlgProperty::OnChange) + EVT_RADIOBOX(XRCID("rdbEvents"), dlgProperty::OnChange) + EVT_TEXT(XRCID("txtWhen"), dlgProperty::OnChange) +END_EVENT_TABLE(); + +dlgEventTrigger::dlgEventTrigger(pgaFactory *factory, frmMain *frame, pgEventTrigger *node, pgObject *parent) + : dlgProperty(factory, frame, wxT("dlgEventTrigger")) +{ + seclabelPage = new ctlSeclabelPanel(nbNotebook); + eventTrigger = node; +} + +dlgProperty *pgEventTriggerFactory::CreateDialog(frmMain *frame, pgObject *node, pgObject *parent) +{ + return new dlgEventTrigger(this, frame, (pgEventTrigger *)node, parent); +} + + +wxString dlgEventTrigger::GetSql() +{ + + wxString sql = wxEmptyString; + wxString name = GetName(); + + if (eventTrigger) + { + if (!GetName().IsEmpty() && GetName() != eventTrigger->GetName()) + sql = wxT("ALTER EVENT TRIGGER ") + eventTrigger->GetQuotedFullIdentifier() + wxT("\nRENAME TO ") + qtIdent(GetName()) + wxT(";\n\n"); + + if (!cbOwner->GetValue().IsEmpty() && cbOwner->GetValue() != eventTrigger->GetOwner()) + sql += wxT("ALTER EVENT TRIGGER ") + eventTrigger->GetQuotedFullIdentifier() + wxT("\nOWNER TO ") + cbOwner->GetValue() + wxT(";\n\n"); + + if (rdbEnableStatus->GetSelection() != 0 && chkEnable->GetValue()) + sql += wxT("ALTER EVENT TRIGGER ") + qtIdent(name) + ((rdbEnableStatus->GetSelection() == 1) ? wxT(" ENABLE REPLICA ;\n\n") : wxT(" ENABLE ALWAYS ;\n\n")); + + else if (!chkEnable->GetValue()) + sql += wxT("ALTER EVENT TRIGGER ") + qtIdent(name) + wxT(" DISABLE ;\n\n"); + + } + + if (!eventTrigger || + ( + cbFunction->GetValue() != (eventTrigger->GetFunction()) || + rdbEvents->GetStringSelection().Lower() != (eventTrigger->GetEventName().Lower()) || + txtWhen->GetValue() != (eventTrigger->GetWhen()) + ) + ) + { + if (eventTrigger) + sql = wxT("DROP EVENT TRIGGER IF EXISTS ") + ((eventTrigger) ? qtIdent(eventTrigger->GetName()) : qtIdent(GetName())) + wxT(";\n\n"); + + sql += wxT("CREATE EVENT TRIGGER ") + qtIdent(name) + wxT(" ON "); + + if (rdbEvents->GetSelection() == 0) + sql += wxT(" DDL_COMMAND_START "); + else if (rdbEvents->GetSelection() == 1) + sql += wxT(" DDL_COMMAND_END "); + else + sql += wxT(" SQL_DROP "); + + if (!txtWhen->IsEmpty()) + sql += wxT("\nWHEN TAG IN (") + txtWhen->GetValue() + wxT(")"); + + if (!cbFunction->GetValue().IsEmpty()) + sql += wxT("\nEXECUTE PROCEDURE ") + (cbFunction->GetValue()) + wxT("();\n\n"); + + if (rdbEnableStatus->GetSelection() != 0 && chkEnable->GetValue()) + sql += wxT("ALTER EVENT TRIGGER ") + qtIdent(name) + ((rdbEnableStatus->GetSelection() == 1) ? wxT(" ENABLE REPLICA ;\n\n") : wxT(" ENABLE ALWAYS ;\n\n")); + + else if (!chkEnable->GetValue()) + sql += wxT("ALTER EVENT TRIGGER ") + qtIdent(name) + wxT(" DISABLE ;\n\n"); + + if (!eventTrigger && !cbOwner->GetValue().IsEmpty()) + sql += wxT("ALTER EVENT TRIGGER ") + qtIdent(GetName()) + wxT("\nOWNER TO ") + cbOwner->GetValue() + wxT(";\n\n"); + + } + + AppendComment(sql, wxT("EVENT TRIGGER ") + qtIdent(GetName()), eventTrigger); + + if (seclabelPage) + sql += seclabelPage->GetSqlForSecLabels(wxT("EVENT TRIGGER"), qtIdent(name)); + + return sql; +} + +pgObject *dlgEventTrigger::CreateObject(pgCollection *pgcol) +{ + pgObject *obj = eventTriggerFactory.CreateObjects(pgcol, 0, + wxT(" \n AND e.evtname = ") + qtDbString(GetName())); + return obj; +} + +pgObject *dlgEventTrigger::GetObject() +{ + return eventTrigger; +} + +int dlgEventTrigger::Go(bool modal) +{ + // cbFunction->Append(wxEmptyString); + + seclabelPage->SetConnection(connection); + seclabelPage->SetObject(eventTrigger); + this->Connect(EVT_SECLABELPANEL_CHANGE, wxCommandEventHandler(dlgEventTrigger::OnChange)); + + if (eventTrigger) + { + // Edit mode + chkEnable->SetValue(eventTrigger->GetEnabled()); + + if (eventTrigger->GetEnableStatus() == wxT("enabled")) + rdbEnableStatus->SetSelection(0); + + else if(eventTrigger->GetEnableStatus() == wxT("replica")) + rdbEnableStatus->SetSelection(1); + + else if(eventTrigger->GetEnableStatus() == wxT("always")) + rdbEnableStatus->SetSelection(2); + + else + rdbEnableStatus->Disable(); + + if(eventTrigger->GetEventName() == wxT("ddl_command_start")) + rdbEvents->SetSelection(0); + + else if(eventTrigger->GetEventName() == wxT("ddl_command_end")) + rdbEvents->SetSelection(1); + + else + rdbEvents->SetSelection(2); + + cbFunction->SetValue(eventTrigger->GetFunction()); + cbOwner->SetValue(eventTrigger->GetOwner()); + (!eventTrigger->GetWhen().IsEmpty()) ? txtWhen->SetValue(eventTrigger->GetWhen()) : txtWhen->SetValue(wxEmptyString); + } + + else + { + // Create mode + chkEnable->SetValue(true); + rdbEnableStatus->Disable(); + } + + pgSet *funcSet = connection->ExecuteSet( + wxT("SELECT quote_ident(nspname) || '.' || quote_ident(proname)\n") + wxT(" FROM pg_proc p, pg_namespace n, pg_language l\n") + wxT(" WHERE p.pronamespace = n.oid AND p.prolang = l.oid AND p.pronargs = 0 AND l.lanname != 'sql' AND prorettype::regtype::text = 'event_trigger'\n") + wxT(" ORDER BY nspname ASC, proname ASC ")); + if (funcSet) + { + while (!funcSet->Eof()) + { + cbFunction->Append(funcSet->GetVal(0)); + funcSet->MoveNext(); + } + delete funcSet; + } + + pgSet *userSet = connection->ExecuteSet( + wxT("SELECT usename ") + wxT("FROM pg_user ") + wxT("WHERE usesuper IS TRUE")); + if (userSet) + { + while (!userSet->Eof()) + { + cbOwner->Append(userSet->GetVal(0)); + userSet->MoveNext(); + } + delete userSet; + } + + + return dlgProperty::Go(modal); +} + +void dlgEventTrigger::CheckChange() +{ + + bool enable = true; + + wxString function = cbFunction->GetValue(); + wxString name = GetName(); + wxString owner = cbOwner->GetValue(); + + (chkEnable->GetValue()) ? rdbEnableStatus->Enable() : rdbEnableStatus->Disable(); + + CheckValid(enable, !name.IsEmpty(), _("Please specify event trigger name.")); + CheckValid(enable, !owner.IsEmpty(), _("Please specify owner of event trigger.")); + CheckValid(enable, !function.IsEmpty(), _("Please specify event trigger function.")); + + if (eventTrigger) + { + EnableOK(enable && + (txtComment->GetValue() != eventTrigger->GetComment() || + txtName->GetValue() != eventTrigger->GetName() || + txtWhen->GetValue() != eventTrigger->GetWhen() || + chkEnable->GetValue() != eventTrigger->GetEnabled() || + rdbEvents->GetStringSelection().Lower() != eventTrigger->GetEventName().Lower() || + rdbEnableStatus->GetStringSelection().Lower() != eventTrigger->GetEnableStatus().Lower() || + !function.IsEmpty()|| + !owner.IsEmpty() + ) + ); + } + else + { + EnableOK(enable); + } + + +} + +bool dlgEventTrigger::IsUpToDate() +{ + if (eventTrigger && !eventTrigger->IsUpToDate()) + return false; + else + return true; +} + +void dlgEventTrigger::OnChange(wxCommandEvent &ev) +{ + CheckChange(); +} + +void dlgEventTrigger::OnChangeEnable(wxCommandEvent &ev) +{ + CheckChange(); +} diff --git a/pgadmin/dlg/dlgFunction.cpp b/pgadmin/dlg/dlgFunction.cpp index e018bb6..55c3d14 100644 --- a/pgadmin/dlg/dlgFunction.cpp +++ b/pgadmin/dlg/dlgFunction.cpp @@ -115,6 +115,11 @@ dlgProperty *pgFunctionFactory::CreateDialog(frmMain *frame, pgObject *node, pgO if (parent->GetMetaType() == PGM_TRIGGER) sch = parent->GetSchema(); + // Event triggers are at database level. So, we do not have a schema for an event trigger. + + else if(parent->GetMetaType() == PGM_EVENTTRIGGER) + sch = 0; + else sch = (pgSchema *)parent; @@ -402,7 +407,7 @@ int dlgFunction::Go(bool modal) { wxString restrict; // create mode - restrict = wxT("(typtype IN ('b', 'c', 'd', 'e', 'p', 'r') AND typname NOT IN ('any', 'trigger', 'language_handler'))"); + restrict = wxT("(typtype IN ('b', 'c', 'd', 'e', 'p', 'r') AND typname NOT IN ('any', 'trigger', 'language_handler', 'event_trigger'))"); if (!settings->GetShowSystemObjects()) restrict += wxT(" AND nspname NOT LIKE E'pg\\\\_toast%' AND nspname NOT LIKE E'pg\\\\_temp%'"); @@ -424,11 +429,15 @@ int dlgFunction::Go(bool modal) if (factory == &triggerFunctionFactory) { cbReturntype->Append(wxT("trigger")); + + if (connection->BackendMinimumVersion(9, 3)) + cbReturntype->Append(wxT("event_trigger")); + cbReturntype->SetSelection(0); - cbReturntype->Disable(); lstArguments->Disable(); cbDatatype->Disable(); txtArgName->Disable(); + txtArgDefVal->Disable(); sel = cbLanguage->FindString(wxT("c")); } else if (isProcedure) @@ -900,12 +909,19 @@ wxString dlgFunction::GetSql() { if (isProcedure && GetArgs().IsEmpty()) { - sql += schema->GetQuotedPrefix() + qtIdent(GetName()); + sql += schema->GetQuotedPrefix() + qtIdent(cbSchema->GetValue()) + wxT(".") + qtIdent(GetName()); } else { - sql += schema->GetQuotedPrefix() + qtIdent(GetName()) - + wxT("(") + GetArgs() + wxT(")"); + // While creating trigger functions from the Event trigger, we may get the schema as null. + // Since, Event triggers are at database level. + + if (schema) + sql += schema->GetQuotedPrefix() + qtIdent(cbSchema->GetValue()) + wxT(".") + qtIdent(GetName()) + + wxT("(") + GetArgs() + wxT(")"); + else + sql += qtIdent(cbSchema->GetValue()) + wxT(".") + qtIdent(GetName()) + + wxT("(") + GetArgs() + wxT(")"); } if (!isProcedure) @@ -978,8 +994,14 @@ wxString dlgFunction::GetSql() if (function && !isProcedure) { - name = schema->GetQuotedPrefix() + qtIdent(name) - + wxT("(") + GetArgs(false, true) + wxT(")"); + if (schema) + name = schema->GetQuotedPrefix() + qtIdent(name) + + wxT("(") + GetArgs(false, true) + wxT(")"); + // Event triggers do not have it's schema definition. Hence, getting the schema from the trigger function. + + else + name = function->GetSchema()->GetQuotedPrefix() + qtIdent(name) + + wxT("(") + GetArgs(false, true) + wxT(")"); AppendOwnerChange(sql, wxT("FUNCTION ") + name); AppendSchemaChange(sql, wxT("FUNCTION ") + name); diff --git a/pgadmin/dlg/dlgProperty.cpp b/pgadmin/dlg/dlgProperty.cpp index 36fd75c..48eec80 100644 --- a/pgadmin/dlg/dlgProperty.cpp +++ b/pgadmin/dlg/dlgProperty.cpp @@ -41,6 +41,7 @@ #include "dlg/dlgCheck.h" #include "dlg/dlgRule.h" #include "dlg/dlgTrigger.h" +#include "dlg/dlgEventTrigger.h" #include "agent/dlgJob.h" #include "agent/dlgStep.h" #include "agent/dlgSchedule.h" @@ -58,7 +59,7 @@ #include "schema/pgTrigger.h" #include "schema/pgGroup.h" #include "schema/pgUser.h" - +#include "schema/pgEventTrigger.h" void dataType::SetOid(OID id) { @@ -1125,6 +1126,7 @@ void dlgProperty::InitDialog(frmMain *frame, pgObject *node) case PGM_PRIMARYKEY: case PGM_UNIQUE: case PGM_TRIGGER: + case PGM_EVENTTRIGGER: case PGM_RULE: // Rules are technically table objects! Yeuch case EDB_PACKAGEFUNCTION: case EDB_PACKAGEVARIABLE: diff --git a/pgadmin/dlg/module.mk b/pgadmin/dlg/module.mk index f4255ec..144a210 100644 --- a/pgadmin/dlg/module.mk +++ b/pgadmin/dlg/module.mk @@ -21,6 +21,7 @@ pgadmin3_SOURCES += \ dlg/dlgConversion.cpp \ dlg/dlgDatabase.cpp \ dlg/dlgDomain.cpp \ + dlg/dlgEventTrigger.cpp \ dlg/dlgExtension.cpp \ dlg/dlgEditGridOptions.cpp \ dlg/dlgFindReplace.cpp \ diff --git a/pgadmin/frm/frmMain.cpp b/pgadmin/frm/frmMain.cpp index 86b3e6e..dfc4263 100644 --- a/pgadmin/frm/frmMain.cpp +++ b/pgadmin/frm/frmMain.cpp @@ -84,6 +84,7 @@ #include "schema/pgForeignKey.h" #include "schema/pgCheck.h" #include "schema/pgDomain.h" +#include "schema/pgEventTrigger.h" #if defined(HAVE_OPENSSL_CRYPTO) || defined(HAVE_GCRYPT) #include "utils/sshTunnel.h" @@ -309,6 +310,7 @@ void frmMain::CreateMenus() new executePgstatindexFactory(menuFactories, viewMenu, 0); new enabledisableRuleFactory(menuFactories, toolsMenu, 0); new enabledisableTriggerFactory(menuFactories, toolsMenu, 0); + new enabledisableEventTriggerFactory(menuFactories, toolsMenu, 0); new disableAllTriggersFactory(menuFactories, toolsMenu, 0); new enableAllTriggersFactory(menuFactories, toolsMenu, 0); new validateForeignKeyFactory(menuFactories, toolsMenu, 0); diff --git a/pgadmin/include/dlg/dlgEventTrigger.h b/pgadmin/include/dlg/dlgEventTrigger.h new file mode 100644 index 0000000..948c26b --- /dev/null +++ b/pgadmin/include/dlg/dlgEventTrigger.h @@ -0,0 +1,47 @@ +////////////////////////////////////////////////////////////////////////// +// +// pgAdmin III - PostgreSQL Tools +// +// Copyright (C) 2002 - 2013, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +// dlgEventTrigger.h - Event trigger property +// +////////////////////////////////////////////////////////////////////////// + + +#ifndef __DLG_EVENTTRIGGERPROP +#define __DLG_EVENTTRIGGERPROP + +#include "dlg/dlgProperty.h" +#include "ctl/ctlSeclabelPanel.h" + +class pgEventTrigger; + +class dlgEventTrigger : public dlgProperty +{ +public: + dlgEventTrigger(pgaFactory *factory, frmMain *frame, pgEventTrigger *evntrig, pgObject *parent); + int Go(bool modal); + + void CheckChange(); + wxString GetSql(); + pgObject *CreateObject(pgCollection *collection); + pgObject *GetObject(); + bool CanDropCascaded() { return true; } + +private: + pgEventTrigger *eventTrigger; + ctlSeclabelPanel *seclabelPage; + void OnChange(wxCommandEvent &ev); + void OnChangeEnable(wxCommandEvent &ev); + virtual bool IsUpToDate(); + +#ifdef __WXMAC__ + void OnChangeSize(wxSizeEvent &ev); +#endif + DECLARE_EVENT_TABLE() +}; + + +#endif \ No newline at end of file diff --git a/pgadmin/include/dlg/module.mk b/pgadmin/include/dlg/module.mk index d7d8870..08dd0ac 100644 --- a/pgadmin/include/dlg/module.mk +++ b/pgadmin/include/dlg/module.mk @@ -21,6 +21,7 @@ pgadmin3_SOURCES += \ include/dlg/dlgConversion.h \ include/dlg/dlgDatabase.h \ include/dlg/dlgDomain.h \ + include/dlg/dlgEventTrigger.h \ include/dlg/dlgExtension.h \ include/dlg/dlgEditGridOptions.h \ include/dlg/dlgFindReplace.h \ diff --git a/pgadmin/include/schema/module.mk b/pgadmin/include/schema/module.mk index 8c68314..a8440c0 100644 --- a/pgadmin/include/schema/module.mk +++ b/pgadmin/include/schema/module.mk @@ -27,6 +27,7 @@ pgadmin3_SOURCES += \ include/schema/pgDatabase.h \ include/schema/pgDatatype.h \ include/schema/pgDomain.h \ + include/schema/pgEventTrigger.h \ include/schema/pgExtension.h \ include/schema/pgForeignDataWrapper.h \ include/schema/pgForeignKey.h \ diff --git a/pgadmin/include/schema/pgEventTrigger.h b/pgadmin/include/schema/pgEventTrigger.h new file mode 100644 index 0000000..76d774c --- /dev/null +++ b/pgadmin/include/schema/pgEventTrigger.h @@ -0,0 +1,153 @@ +////////////////////////////////////////////////////////////////////////// +// +// pgAdmin III - PostgreSQL Tools +// +// Copyright (C) 2002 - 2013, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +// pgEventTrigger.h PostgreSQL Event Trigger +// +////////////////////////////////////////////////////////////////////////// + +#ifndef PGEVENTTRIGGER_H +#define PGEVENTTRIGGER_H + +#include "pgDatabase.h" + +class pgCollection; +class pgFunction; + +class pgEventTriggerFactory : public pgDatabaseObjFactory +{ +public: + pgEventTriggerFactory(); + virtual dlgProperty *CreateDialog(frmMain *frame, pgObject *node, pgObject *parent); + virtual pgObject *CreateObjects(pgCollection *obj, ctlTree *browser, const wxString &restr = wxEmptyString); + virtual pgCollection *CreateCollection(pgObject *obj); + virtual ~pgEventTriggerFactory() {}; + + int GetClosedIconId() + { + return closedId; + } + +protected: + int closedId; +}; + +extern pgEventTriggerFactory eventTriggerFactory; + +class pgEventTrigger : public pgDatabaseObject +{ +public: + pgEventTrigger(const wxString &newName = wxT("")); + ~pgEventTrigger(); + wxString GetTranslatedMessage(int kindOfMessage) const; + void ShowTreeDetail(ctlTree *browser, frmMain *form = 0, ctlListView *properties = 0, ctlSQLBox *sqlPane = 0); + bool DropObject(wxFrame *frame, ctlTree *browser, bool cascaded); + bool IsUpToDate(); + wxString GetSql(ctlTree *browser); + pgObject *Refresh(ctlTree *browser, const wxTreeItemId item); + + int GetIconId(); + + wxString GetFunction() const + { + return function; + } + void iSetFunction(const wxString &s) + { + function = s ; + } + wxString GetWhen() const + { + return when; + } + void iSetWhen(const wxString &s) + { + when = s; + } + OID GetFunctionOid() const + { + return functionOid; + } + void iSetFunctionOid(const OID d) + { + functionOid = d; + } + OID GetSchemaOid() const + { + return schemaOid; + } + void iSetSchemaOid(const OID d) + { + schemaOid = d; + } + wxString GetSource() const + { + return source; + } + void iSetSource(const wxString &s) + { + source = s; + } + wxString GetLanguage() const + { + return language; + } + void iSetLanguage(const wxString &s) + { + language = s; + } + wxString GetEventName() const + { + return eventName; + } + wxString GetEnableStatus() const + { + return enableStatus; + } + void iSetEnableStatus(const wxString &s) + { + enableStatus = s; + } + void iSetEventName(const wxString &s) + { + eventName = s; + } + + bool GetEnabled() const + { + return enabled; + } + void iSetEnabled(const bool b) + { + enabled = b; + } + void SetEnabled(ctlTree *browser, const bool b); + void SetDirty(); + +private: + wxString function, when, language, source, eventName, enableStatus; + OID functionOid, schemaOid; + bool enabled; + pgFunction *eventTriggerFunction; +}; + +class pgEventTriggerCollection : public pgDatabaseObjCollection +{ +public: + pgEventTriggerCollection(pgaFactory *factory, pgDatabase *db); + wxString GetTranslatedMessage(int kindOfMessage) const; +}; + +class enabledisableEventTriggerFactory : public contextActionFactory +{ +public: + enabledisableEventTriggerFactory(menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar); + wxWindow *StartDialog(frmMain *form, pgObject *obj); + bool CheckEnable(pgObject *obj); + bool CheckChecked(pgObject *obj); +}; + +#endif \ No newline at end of file diff --git a/pgadmin/include/utils/misc.h b/pgadmin/include/utils/misc.h index 51a1102..370457e 100644 --- a/pgadmin/include/utils/misc.h +++ b/pgadmin/include/utils/misc.h @@ -248,7 +248,9 @@ enum SLM_SUBSCRIPTION, SLM_TABLE, - PGM_LANGUAGE + PGM_LANGUAGE, + PGM_EVENTTRIGGER + }; diff --git a/pgadmin/pgAdmin3.vcxproj b/pgadmin/pgAdmin3.vcxproj index 2b5566d..83c45d9 100644 --- a/pgadmin/pgAdmin3.vcxproj +++ b/pgadmin/pgAdmin3.vcxproj @@ -828,6 +828,7 @@ + @@ -2190,6 +2191,7 @@ + @@ -2660,6 +2662,7 @@ + @@ -2868,6 +2871,7 @@ + @@ -2954,6 +2958,7 @@ + diff --git a/pgadmin/pgAdmin3.vcxproj.filters b/pgadmin/pgAdmin3.vcxproj.filters index 1fc4929..ba3bc8e 100644 --- a/pgadmin/pgAdmin3.vcxproj.filters +++ b/pgadmin/pgAdmin3.vcxproj.filters @@ -394,6 +394,9 @@ dlg + + dlg + dlg @@ -655,6 +658,9 @@ schema + + schema + schema @@ -1865,6 +1871,9 @@ ui + + ui + ui @@ -2429,6 +2438,9 @@ include\dlg + + include\dlg + include\dlg @@ -2687,6 +2699,9 @@ include\schema + + include\schema + include\schema diff --git a/pgadmin/schema/module.mk b/pgadmin/schema/module.mk index 9ad3005..cd4f790 100644 --- a/pgadmin/schema/module.mk +++ b/pgadmin/schema/module.mk @@ -27,6 +27,7 @@ pgadmin3_SOURCES += \ schema/pgDatabase.cpp \ schema/pgDatatype.cpp \ schema/pgDomain.cpp \ + schema/pgEventTrigger.cpp \ schema/pgExtension.cpp \ schema/pgForeignDataWrapper.cpp \ schema/pgForeignKey.cpp \ diff --git a/pgadmin/schema/pgDatabase.cpp b/pgadmin/schema/pgDatabase.cpp index 88ec2c4..8f8f12e 100644 --- a/pgadmin/schema/pgDatabase.cpp +++ b/pgadmin/schema/pgDatabase.cpp @@ -23,6 +23,7 @@ #include "schema/pgForeignDataWrapper.h" #include "schema/pgLanguage.h" #include "schema/pgSchema.h" +#include "schema/pgEventTrigger.h" #include "slony/slCluster.h" #include "frm/frmHint.h" #include "frm/frmReport.h" @@ -628,6 +629,8 @@ void pgDatabase::ShowTreeDetail(ctlTree *browser, frmMain *form, ctlListView *pr browser->AppendCollection(this, synonymFactory); if (settings->GetDisplayOption(_("Schemas"))) browser->AppendCollection(this, schemaFactory); + if (connection()->BackendMinimumVersion(9, 3) && settings->GetDisplayOption(_("Event Triggers"))) + browser->AppendCollection(this, eventTriggerFactory); if (settings->GetDisplayOption(_("Slony-I Clusters"))) browser->AppendCollection(this, slClusterFactory); diff --git a/pgadmin/schema/pgEventTrigger.cpp b/pgadmin/schema/pgEventTrigger.cpp new file mode 100644 index 0000000..d92d861 --- /dev/null +++ b/pgadmin/schema/pgEventTrigger.cpp @@ -0,0 +1,347 @@ +////////////////////////////////////////////////////////////////////////// +// +// pgAdmin III - PostgreSQL Tools +// +// Copyright (C) 2002 - 2013, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +// pgEventTrigger.cpp - EventTrigger class +// +////////////////////////////////////////////////////////////////////////// + +// wxWindows headers +#include + +// App headers +#include "pgAdmin3.h" +#include "frm/frmMain.h" +#include "utils/misc.h" +#include "schema/pgEventTrigger.h" +#include "schema/pgFunction.h" +#include "schema/pgSchema.h" + +pgEventTrigger::pgEventTrigger(const wxString &newName) + :pgDatabaseObject(eventTriggerFactory, newName) +{ + eventTriggerFunction = 0; +} + +pgEventTrigger::~pgEventTrigger() +{ + if (!expandedKids && eventTriggerFunction) + { + // eventTriggerFunction wasn't appended to tree, so we need to delete it manually. + delete eventTriggerFunction; + } +} + +pgCollection *pgEventTriggerFactory::CreateCollection(pgObject *obj) +{ + return new pgEventTriggerCollection(GetCollectionFactory(), (pgDatabase *)obj); +} + + +pgObject *pgEventTriggerFactory::CreateObjects(pgCollection *collection, ctlTree *browser, const wxString &restriction) +{ + wxString sql; + pgEventTrigger *eventTrigger = 0; + + sql = wxT("SELECT e.oid, e.xmin, e.evtname AS name, e.evtevent AS eventname, pg_catalog.pg_get_userbyid(e.evtowner) AS eventowner, ") + wxT(" CASE e.evtenabled WHEN 'O' THEN 'enabled' WHEN 'R' THEN 'replica' WHEN 'A' THEN 'always' WHEN 'D' THEN 'disabled' END AS enabled, ") + wxT(" e.evtfoid AS eventfuncoid, e.evtfoid::regproc AS eventfunname, array_to_string(array(select quote_literal(x) from unnest(evttags) as t(x)), ', ') AS when, ") + wxT(" pg_catalog.obj_description(e.oid, 'pg_event_trigger') AS comment, ") + wxT(" p.prosrc AS source, p.pronamespace AS schemaoid, l.lanname AS language") + wxT(" FROM pg_event_trigger e\n") + wxT(" LEFT OUTER JOIN pg_proc p ON p.oid=e.evtfoid\n") + wxT(" LEFT OUTER JOIN pg_language l ON l.oid=p.prolang\n") + wxT(" WHERE 1=1 "); + + if (!restriction.IsEmpty()) + sql += restriction + wxT("\n"); + sql += wxT(" ORDER BY e.evtname "); + + pgSet *eventTriggers = collection->GetDatabase()->ExecuteSet(sql); + + if (eventTriggers) + { + while (!eventTriggers->Eof()) + { + eventTrigger = new pgEventTrigger(eventTriggers->GetVal(wxT("name"))); + eventTrigger->iSetDatabase(collection->GetDatabase()); + eventTrigger->iSetOid(eventTriggers->GetOid(wxT("oid"))); + eventTrigger->iSetXid(eventTriggers->GetOid(wxT("xmin"))); + eventTrigger->iSetOwner(eventTriggers->GetVal(wxT("eventowner"))); + eventTrigger->iSetFunctionOid(eventTriggers->GetOid(wxT("eventfuncoid"))); + eventTrigger->iSetLanguage(eventTriggers->GetVal(wxT("language"))); + eventTrigger->iSetSource(eventTriggers->GetVal(wxT("source"))); + eventTrigger->iSetEventName(eventTriggers->GetVal(wxT("eventname"))); + eventTrigger->iSetFunction(eventTriggers->GetVal(wxT("eventfunname"))); + (eventTriggers->GetVal(wxT("enabled")) == wxT("disabled")) ? eventTrigger->iSetEnabled(false), eventTrigger->iSetEnableStatus(wxT("disabled")) + : eventTrigger->iSetEnabled(true), eventTrigger->iSetEnableStatus(eventTriggers->GetVal(wxT("enabled"))); + eventTrigger->iSetComment(eventTriggers->GetVal(wxT("comment"))); + eventTrigger->iSetWhen(eventTriggers->GetVal(wxT("when"))); + eventTrigger->iSetSchemaOid(eventTriggers->GetOid(wxT("schemaoid"))); + + if (browser) + { + browser->AppendObject(collection, eventTrigger); + eventTriggers->MoveNext(); + } + else + break; + } + + delete eventTriggers; + } + return eventTrigger; +} + +pgObject *pgEventTrigger::Refresh(ctlTree *browser, const wxTreeItemId item) +{ + pgObject *eventTrigger = 0; + pgCollection *coll = browser->GetParentCollection(item); + + if (coll) + { + wxString restr = wxT(" \n AND e.evtname = ") + qtDbString(GetName()); + eventTrigger = eventTriggerFactory.CreateObjects(coll, 0, restr); + } + return eventTrigger; +} + +void pgEventTrigger::ShowTreeDetail(ctlTree *browser, frmMain *form, ctlListView *properties, ctlSQLBox *sqlPane) +{ + if (!expandedKids && GetLanguage() != wxT("edbspl") && GetLanguage() != wxT("sql")) + { + if (browser) + { + // if no browser present, function will not be appended to tree + expandedKids = true; + } + + if (eventTriggerFunction) + delete eventTriggerFunction; + + wxString restr = wxT(" WHERE nsp.oid= ") + NumToStr(GetSchemaOid()) + wxT("::oid\n"); + pgObject *evntTrgSchema; + evntTrgSchema = schemaFactory.CreateObjects((pgCollection *)browser->GetObject(browser->GetSelection()), 0, restr); + // append function here + eventTriggerFunction = functionFactory.AppendFunctions(this, (pgSchema *)evntTrgSchema, browser, wxT(" WHERE pr.oid = ") + NumToStr(functionOid) + wxT("::oid\n")); + if (eventTriggerFunction) + { + iSetFunction(eventTriggerFunction->GetQuotedFullIdentifier()); + } + } + + if (properties) + { + CreateListColumns(properties); + + properties->AppendItem(_("Name"), GetName()); + properties->AppendItem(_("OID"), GetOid()); + properties->AppendItem(_("Event"), GetEventName()); + properties->AppendItem(_("Function"), GetFunction()); + properties->AppendItem(_("When?"), GetWhen()); + properties->AppendItem(_("Enabled?"), GetEnabled() ? wxT("Yes") : wxT("No")); + properties->AppendItem(_("Comment"), firstLineOnly(GetComment())); + } + +} + +void pgEventTrigger::SetDirty() +{ + if (expandedKids) + eventTriggerFunction = 0; + pgObject::SetDirty(); +} + +wxString pgEventTrigger::GetSql(ctlTree *browser) +{ + if (sql.IsNull() && (this->eventTriggerFunction)) + { + sql = wxT("-- Event Trigger: ") + qtIdent(GetName()) + wxT(" on database ") + + qtIdent(((pgCollection *)browser->GetObject(browser->GetSelection()))->GetDatabase()->GetName()) + wxT("\n\n") + + wxT("-- DROP EVENT TRIGGER ") + qtIdent(GetName()) + wxT(";\n\n"); + + sql += wxT("CREATE EVENT TRIGGER ") + qtIdent(GetName()) + wxT(" ON ") + + GetEventName() + (GetWhen().IsEmpty() ? wxT("") : (wxT(" WHEN TAG IN (") + GetWhen() + wxT(")\n\n"))); + + // Event trigger backend function don't accept any arguments. + // Hence, it's not required to get/set empty arguments. + + sql += wxT(" EXECUTE PROCEDURE ") + eventTriggerFunction->GetQuotedFullIdentifier() + wxT("();\n\n"); + + if (!GetEnabled()) + { + sql += wxT("ALTER EVENT TRIGGER ") + qtIdent(GetName()) + wxT(" DISABLE;\n"); + } + + if (!GetComment().IsEmpty()) + sql += wxT("COMMENT ON EVENT TRIGGER ") + qtIdent(GetName()) + wxT(" IS ") + qtDbString(GetComment()) + wxT(";\n"); + } + return sql; +} + +wxString pgEventTrigger::GetTranslatedMessage(int kindOfMessage) const +{ + wxString message = wxEmptyString; + + switch (kindOfMessage) + { + case RETRIEVINGDETAILS: + message = _("Retrieving details on event trigger"); + message += wxT(" ") + GetName(); + break; + case REFRESHINGDETAILS: + message = _("Refreshing event trigger"); + message += wxT(" ") + GetName(); + break; + case DROPCASCADETITLE: + message = _("Drop event trigger cascaded?"); + break; + case DROPTITLE: + message = _("Drop event trigger?"); + break; + case DROPINCLUDINGDEPS: + message = wxString::Format(_("Are you sure you wish to drop event trigger \"%s\" including all objects that depend on it?"), + GetFullIdentifier().c_str()); + break; + case DROPEXCLUDINGDEPS: + message = wxString::Format(_("Are you sure you wish to drop event trigger \"%s\"?"), + GetFullIdentifier().c_str()); + break; + case PROPERTIESREPORT: + message = _("Event trigger properties report"); + message += wxT(" - ") + GetName(); + break; + case DDLREPORT: + message = _("Event trigger DDL report"); + message += wxT(" - ") + GetName(); + break; + case DDL: + message = _("Event trigger DDL"); + break; + } + return message; +} + +int pgEventTrigger::GetIconId() +{ + if (GetEnabled()) + return eventTriggerFactory.GetIconId(); + else + return eventTriggerFactory.GetClosedIconId(); +} + + +wxString pgEventTriggerCollection::GetTranslatedMessage(int kindOfMessage) const +{ + wxString message = wxEmptyString; + + switch (kindOfMessage) + { + case RETRIEVINGDETAILS: + message = _("Retrieving details on event triggers"); + break; + case REFRESHINGDETAILS: + message = _("Refreshing event triggers"); + break; + case OBJECTSLISTREPORT: + message = _("Event triggers list report"); + break; + } + return message; +} + +bool pgEventTrigger::DropObject(wxFrame *frame, ctlTree *browser, bool cascaded) +{ + wxString sql = wxT("DROP EVENT TRIGGER ") + qtIdent(GetName()); + if (cascaded) + sql += wxT(" CASCADE"); + sql += wxT(" ;"); + return GetDatabase()->ExecuteVoid(sql); +} + +void pgEventTrigger::SetEnabled(ctlTree *browser, const bool b) +{ + if (qtIdent(GetName()).Len() > 0 && ((enabled && !b) || (!enabled && b))) + { + wxString sql = wxT("ALTER EVENT TRIGGER ") + qtIdent(GetName()) ; + if (enabled && !b) + sql += wxT(" DISABLE"); + else if (!enabled && b) + sql += wxT(" ENABLE"); + GetDatabase()->ExecuteVoid(sql); + } + enabled = b; + UpdateIcon(browser); +} + +bool pgEventTrigger::IsUpToDate() +{ + wxString sql = wxT("SELECT xmin FROM pg_event_trigger WHERE oid = ") + this->GetOidStr(); + if (!this->GetDatabase()->GetConnection() || this->GetDatabase()->ExecuteScalar(sql) != NumToStr(GetXid())) + return false; + else + return true; +} + +///////////////////////////// + +pgEventTriggerCollection::pgEventTriggerCollection(pgaFactory *factory, pgDatabase *db) + : pgDatabaseObjCollection(factory, db) +{ + +} + + +/////////////////////////////////////////////////// + +#include "images/trigger.pngc" +#include "images/triggerbad.pngc" +#include "images/triggers.pngc" + +pgEventTriggerFactory::pgEventTriggerFactory() + : pgDatabaseObjFactory(__("Event Trigger"), __("New Event Trigger..."), __("Create a new Event Trigger."), trigger_png_img) +{ + metaType = PGM_EVENTTRIGGER; + closedId = addIcon(triggerbad_png_img); +} + +pgEventTriggerFactory eventTriggerFactory; +static pgaCollectionFactory cf(&eventTriggerFactory, __("Event Triggers"), triggers_png_img); + +enabledisableEventTriggerFactory::enabledisableEventTriggerFactory(menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar) : contextActionFactory(list) +{ + mnu->Append(id, _("Event trigger enabled?"), _("Enable or disable selected event trigger."), wxITEM_CHECK); +} + +wxWindow *enabledisableEventTriggerFactory::StartDialog(frmMain *form, pgObject *obj) +{ + ((pgEventTrigger *)obj)->SetEnabled(form->GetBrowser(), !((pgEventTrigger *)obj)->GetEnabled()); + ((pgEventTrigger *)obj)->SetDirty(); + + wxTreeItemId item = form->GetBrowser()->GetSelection(); + if (obj == form->GetBrowser()->GetObject(item)) + { + form->GetBrowser()->DeleteChildren(item); + obj->ShowTreeDetail(form->GetBrowser(), 0, form->GetProperties()); + form->GetSqlPane()->SetReadOnly(false); + form->GetSqlPane()->SetText(((pgEventTrigger *)obj)->GetSql(form->GetBrowser())); + form->GetSqlPane()->SetReadOnly(true); + } + form->GetMenuFactories()->CheckMenu(obj, form->GetMenuBar(), (ctlMenuToolbar *)form->GetToolBar()); + + return 0; +} + +bool enabledisableEventTriggerFactory::CheckEnable(pgObject *obj) +{ + return obj && obj->IsCreatedBy(eventTriggerFactory) && obj->CanEdit() + && ((pgEventTrigger *)obj)->GetConnection()->BackendMinimumVersion(9, 3); +} + +bool enabledisableEventTriggerFactory::CheckChecked(pgObject *obj) +{ + return obj && obj->IsCreatedBy(eventTriggerFactory) && ((pgEventTrigger *)obj)->GetEnabled(); +} \ No newline at end of file diff --git a/pgadmin/schema/pgFunction.cpp b/pgadmin/schema/pgFunction.cpp index 7f34c98..bfbaee8 100644 --- a/pgadmin/schema/pgFunction.cpp +++ b/pgadmin/schema/pgFunction.cpp @@ -697,7 +697,7 @@ pgFunction *pgFunctionFactory::AppendFunctions(pgObject *obj, pgSchema *schema, // Create the new object if (isProcedure) function = new pgProcedure(schema, functions->GetVal(wxT("proname"))); - else if (typname == wxT("\"trigger\"") || typname == wxT("trigger")) + else if (typname == wxT("\"trigger\"") || typname == wxT("trigger") || typname == wxT("event_trigger")) function = new pgTriggerFunction(schema, functions->GetVal(wxT("proname"))); else function = new pgFunction(schema, functions->GetVal(wxT("proname"))); @@ -1033,7 +1033,7 @@ pgObject *pgFunctionFactory::CreateObjects(pgCollection *collection, ctlTree *br { wxString funcRestriction = wxT( " WHERE proisagg = FALSE AND pronamespace = ") + NumToStr(collection->GetSchema()->GetOid()) - + wxT("::oid\n AND typname <> 'trigger'\n"); + + wxT("::oid\n AND typname NOT IN ('trigger', 'event_trigger') \n"); if (collection->GetConnection()->EdbMinimumVersion(8, 1)) funcRestriction += wxT(" AND NOT (lanname = 'edbspl' AND protype = '1')\n"); @@ -1054,8 +1054,15 @@ pgObject *pgTriggerFunctionFactory::CreateObjects(pgCollection *collection, ctlT { wxString funcRestriction = wxT( " WHERE proisagg = FALSE AND pronamespace = ") + NumToStr(collection->GetSchema()->GetOid()) - + wxT("::oid\n AND typname = 'trigger'\n") - + wxT(" AND lanname != 'edbspl'\n"); + + wxT("::oid\n"); + if(collection->GetConnection()->BackendMinimumVersion(9, 3)) + { + funcRestriction += wxT("AND (typname IN ('trigger', 'event_trigger') \nAND lanname NOT IN ('edbspl', 'sql', 'internal'))"); + } + else + { + funcRestriction += wxT("AND (typname = 'trigger'\n AND lanname != 'edbspl')"); + } // Get the Functions return AppendFunctions(collection, collection->GetSchema(), browser, funcRestriction); diff --git a/pgadmin/schema/pgObject.cpp b/pgadmin/schema/pgObject.cpp index 5af08e1..de5b69a 100644 --- a/pgadmin/schema/pgObject.cpp +++ b/pgadmin/schema/pgObject.cpp @@ -260,7 +260,7 @@ void pgObject::ShowDependency(pgDatabase *db, ctlListView *list, const wxString wxT(" AND ") + clsorder + wxT(" IN (\n") wxT(" SELECT oid FROM pg_class\n") wxT(" WHERE relname IN ('pg_class', 'pg_constraint', 'pg_conversion', 'pg_language', 'pg_proc',\n") - wxT(" 'pg_rewrite', 'pg_namespace', 'pg_trigger', 'pg_type', 'pg_attrdef'))\n") + wxT(" 'pg_rewrite', 'pg_namespace', 'pg_trigger', 'pg_type', 'pg_attrdef', 'pg_event_trigger'))\n") wxT(" ORDER BY ") + clsorder + wxT(", cl.relkind")); if (set) @@ -682,7 +682,7 @@ void pgObject::ShowDependents(frmMain *form, ctlListView *referencedBy, const wx wxT(" LEFT JOIN pg_class clrw ON clrw.oid=rw.ev_class\n") wxT(" LEFT JOIN pg_namespace nsrw ON clrw.relnamespace=nsrw.oid\n") wxT(" LEFT JOIN pg_language la ON dep.objid=la.oid\n") - wxT(" LEFT JOIN pg_namespace ns ON dep.objid=ns.oid\n") + wxT(" LEFT JOIN pg_namespace ns ON dep.objid=ns.oid\n") wxT(" LEFT JOIN pg_attrdef ad ON ad.oid=dep.objid\n") + where, wxT("classid")); diff --git a/pgadmin/ui/dlgEventTrigger.xrc b/pgadmin/ui/dlgEventTrigger.xrc new file mode 100644 index 0000000..201156f --- /dev/null +++ b/pgadmin/ui/dlgEventTrigger.xrc @@ -0,0 +1,229 @@ + + + + 300,265d + + + 1 + 0 + 0 + + + 320,240d + + + + 2 + 5 + 5 + 1 + 3 + + + + + wxTOP|wxLEFT|wxRIGHT|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 4 + + + + wxTOP|wxLEFT|wxRIGHT|wxEXPAND|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 4 + + + + + + wxTOP|wxLEFT|wxRIGHT|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 4 + + + + wxTOP|wxLEFT|wxRIGHT|wxEXPAND|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 4 + + + + + + wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 5 + + + + + + + + wxTOP|wxLEFT|wxRIGHT|wxEXPAND|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 5 + + + + + + + wxTOP|wxLEFT|wxRIGHT|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 4 + + + + 405,313 + + + wxTOP|wxLEFT|wxRIGHT|wxEXPAND|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 4 + + + + + + + + + 2 + 5 + 5 + 1 + 4 + + + + + wxTOP|wxLEFT|wxRIGHT|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 4 + + + + 1 + + wxTOP|wxLEFT|wxRIGHT|wxEXPAND|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 4 + + + + + + wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 5 + + + + + + + ENABLE + REPLICA + ALWAYS + + 210,38 + + + wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 5 + + + + + + + wxTOP|wxLEFT|wxRIGHT|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 4 + + + + + + + wxTOP|wxLEFT|wxRIGHT|wxEXPAND|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 4 + + + + + + wxTOP|wxLEFT|wxRIGHT|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 4 + + + + + + DDL_COMMAND_START + DDL_COMMAND_END + SQL_DROP + + 333,38 + + + wxALL|wxEXPAND|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 5 + + + + + + + wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 4 + + + + -1,-1 + 374,187 + + + wxALL|wxEXPAND|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL + 4 + + + + + + + wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 3 + + + + 4 + 1 + + + + + wxALL|wxEXPAND|wxALIGN_LEFT|wxALIGN_TOP + 3 + + + wxALIGN_LEFT|wxALIGN_TOP + 0,0d + + + + + 1 + + wxALL|wxEXPAND|wxALIGN_LEFT|wxALIGN_TOP + 3 + + + + + + wxALL|wxEXPAND|wxALIGN_LEFT|wxALIGN_TOP + 3 + + + wxTOP|wxLEFT|wxRIGHT|wxEXPAND|wxALIGN_LEFT|wxALIGN_TOP + + + + + + wxEXPAND|wxALIGN_CENTRE + 3 + + + + diff --git a/pgadmin/ui/module.mk b/pgadmin/ui/module.mk index d8c5cf5..3b07858 100644 --- a/pgadmin/ui/module.mk +++ b/pgadmin/ui/module.mk @@ -26,6 +26,7 @@ TMP_ui += \ ui/dlgDatabase.xrc \ ui/dlgDirectDbg.xrc \ ui/dlgDomain.xrc \ + ui/dlgEventTrigger.xrc \ ui/dlgExtension.xrc \ ui/dlgEditGridOptions.xrc \ ui/dlgExtTable.xrc \ diff --git a/pgadmin/utils/sysSettings.cpp b/pgadmin/utils/sysSettings.cpp index a511602..c6206f1 100644 --- a/pgadmin/utils/sysSettings.cpp +++ b/pgadmin/utils/sysSettings.cpp @@ -173,6 +173,8 @@ bool sysSettings::GetDisplayOption(const wxString &objtype, bool GetDefault) engtype = wxT("Views"); else if (objtype == _("External Tables")) engtype = wxT("External Tables"); + else if (objtype == _("Event Triggers")) + engtype = wxT("Event Triggers"); // If we just want the default, return it. if (GetDefault) @@ -200,6 +202,7 @@ void sysSettings::SetDisplayOption(const wxString &objtype, bool display) else if (objtype == _("User Mappings")) engtype = wxT("User mappings"); else if (objtype == _("Foreign Tables")) engtype = wxT("Foreign Tables"); else if (objtype == _("Languages")) engtype = wxT("Languages"); + else if (objtype == _("Event Triggers")) engtype = wxT("Event Triggers"); else if (objtype == _("Extensions")) engtype = wxT("Extensions"); else if (objtype == _("Synonyms")) engtype = wxT("Synonyms"); else if (objtype == _("Schemas")) engtype = wxT("Schemas");