Hi,
Here is a patch to add the support for this new 8.5 functionality. Ticket is
http://code.pgadmin.org/trac/ticket/97, commitfest item is
https://commitfest.postgresql.org/action/patch_view?id=164.
Comments?
--
Guillaume.
http://www.postgresqlfr.org
http://dalibo.com
diff --git a/pgadmin/dlg/dlgTrigger.cpp b/pgadmin/dlg/dlgTrigger.cpp
index daab06a..bb02293 100644
--- a/pgadmin/dlg/dlgTrigger.cpp
+++ b/pgadmin/dlg/dlgTrigger.cpp
@@ -34,18 +34,26 @@
#define chkDelete CTRL_CHECKBOX("chkDelete")
#define chkTruncate CTRL_CHECKBOX("chkTruncate")
#define txtBody CTRL_SQLBOX("txtBody")
+#define btnAddCol CTRL_BUTTON("btnAddCol")
+#define btnRemoveCol CTRL_BUTTON("btnRemoveCol")
+#define lstColumns CTRL_LISTVIEW("lstColumns")
-BEGIN_EVENT_TABLE(dlgTrigger, dlgProperty)
+
+BEGIN_EVENT_TABLE(dlgTrigger, dlgCollistProperty)
EVT_RADIOBOX(XRCID("rdbFires"), dlgProperty::OnChange)
EVT_CHECKBOX(XRCID("chkRow"), dlgProperty::OnChange)
EVT_CHECKBOX(XRCID("chkInsert"), dlgProperty::OnChange)
- EVT_CHECKBOX(XRCID("chkUpdate"), dlgProperty::OnChange)
+ EVT_CHECKBOX(XRCID("chkUpdate"), dlgTrigger::OnChange)
EVT_CHECKBOX(XRCID("chkDelete"), dlgProperty::OnChange)
EVT_CHECKBOX(XRCID("chkTruncate"), dlgProperty::OnChange)
EVT_TEXT(XRCID("cbFunction"), dlgTrigger::OnChangeFunc)
EVT_COMBOBOX(XRCID("cbFunction"), dlgProperty::OnChange)
EVT_TEXT(XRCID("txtArguments"), dlgProperty::OnChange)
EVT_STC_MODIFIED(XRCID("txtBody"), dlgProperty::OnChangeStc)
+ EVT_LIST_ITEM_SELECTED(XRCID("lstColumns"), dlgTrigger::OnSelectListCol)
+ EVT_COMBOBOX(XRCID("cbColumns"), dlgTrigger::OnSelectComboCol)
+ EVT_BUTTON(XRCID("btnAddCol"), dlgTrigger::OnAddCol)
+ EVT_BUTTON(XRCID("btnRemoveCol"), dlgTrigger::OnRemoveCol)
END_EVENT_TABLE();
@@ -58,7 +66,7 @@ dlgProperty *pgTriggerFactory::CreateDialog(frmMain *frame, pgObject *node, pgOb
dlgTrigger::dlgTrigger(pgaFactory *f, frmMain *frame, pgTrigger *node, pgTable *parentNode)
-: dlgProperty(f, frame, wxT("dlgTrigger"))
+: dlgCollistProperty(f, frame, wxT("dlgTrigger"), parentNode)
{
trigger=node;
table=parentNode;
@@ -66,6 +74,8 @@ dlgTrigger::dlgTrigger(pgaFactory *f, frmMain *frame, pgTrigger *node, pgTable *
txtBody->SetMarginType(1, wxSTC_MARGIN_NUMBER);
txtBody->SetMarginWidth(1, ConvertDialogToPixels(wxPoint(16, 0)).x);
+
+ lstColumns->AddColumn(_("Column name"));
}
@@ -75,6 +85,23 @@ pgObject *dlgTrigger::GetObject()
}
+wxString dlgTrigger::GetColumns()
+{
+ wxString sql;
+
+ int pos;
+ // iterate cols
+ for (pos=0 ; pos < lstColumns->GetItemCount() ; pos++)
+ {
+ if (pos)
+ sql += wxT(", ");
+
+ sql += qtIdent(lstColumns->GetItemText(pos));
+ }
+ return sql;
+}
+
+
int dlgTrigger::Go(bool modal)
{
if (trigger)
@@ -116,6 +143,12 @@ int dlgTrigger::Go(bool modal)
}
else if (!connection->BackendMinimumVersion(8, 4))
chkTruncate->Disable();
+
+ wxArrayString colsArr = trigger->GetColumnList();
+ for (int colIdx=0,colsCount=colsArr.Count(); colIdx<colsCount; colIdx++)
+ {
+ lstColumns->InsertItem(colIdx, colsArr.Item(colIdx));
+ }
}
else
{
@@ -154,10 +187,48 @@ int dlgTrigger::Go(bool modal)
}
- return dlgProperty::Go(modal);
+ cbColumns->Disable();
+ btnAddCol->Disable();
+ btnRemoveCol->Disable();
+
+ return dlgCollistProperty::Go(modal);
}
+void dlgTrigger::OnAddCol(wxCommandEvent &ev)
+{
+ wxString colName=cbColumns->GetValue();
+
+ if (!colName.IsEmpty())
+ {
+ long colIndex = lstColumns->InsertItem(lstColumns->GetItemCount(), colName);
+
+ cbColumns->Delete(cbColumns->GetCurrentSelection());
+ if (cbColumns->GetCount())
+ cbColumns->SetSelection(0);
+
+ CheckChange();
+ if (!cbColumns->GetCount())
+ btnAddCol->Disable();
+ }
+}
+
+
+void dlgTrigger::OnRemoveCol(wxCommandEvent &ev)
+{
+ long pos=lstColumns->GetSelection();
+ if (pos >= 0)
+ {
+ wxString colName=lstColumns->GetItemText(pos);
+
+ lstColumns->DeleteItem(pos);
+ cbColumns->Append(colName);
+
+ CheckChange();
+ btnRemoveCol->Disable();
+ }
+}
+
wxString dlgTrigger::GetSql()
{
wxString sql;
@@ -200,6 +271,8 @@ wxString dlgTrigger::GetSql()
if (actionCount++)
sql += wxT(" OR");
sql += wxT(" UPDATE");
+ if (lstColumns->GetItemCount() > 0)
+ sql += wxT(" OF ") + GetColumns();
}
if (chkDelete->GetValue())
{
@@ -251,6 +324,41 @@ pgObject *dlgTrigger::CreateObject(pgCollection *collection)
}
+void dlgTrigger::OnChange(wxCommandEvent &ev)
+{
+ if (chkUpdate->GetValue())
+ {
+ cbColumns->Enable();
+ }
+ else
+ {
+ if (lstColumns->GetItemCount() > 0)
+ {
+ if (wxMessageBox(_("Removing the UPDATE event will cause the column list to be cleared. Do you wish to continue?"), _("Remove UPDATE event?"), wxYES_NO) == wxNO)
+ {
+ chkUpdate->SetValue(true);
+ return;
+ }
+
+ // Move all the columns back to the combo
+ for (int pos = lstColumns->GetItemCount(); pos > 0; pos--)
+ {
+ wxString colName = lstColumns->GetItemText(pos - 1);
+
+ lstColumns->DeleteItem(pos - 1);
+ cbColumns->Append(colName);
+ }
+ }
+
+ cbColumns->Disable();
+ btnAddCol->Disable();
+ btnRemoveCol->Disable();
+ }
+
+ CheckChange();
+}
+
+
void dlgTrigger::OnChangeFunc(wxCommandEvent &ev)
{
cbFunction->GuessSelection(ev);
@@ -327,3 +435,31 @@ bool dlgTrigger::IsUpToDate()
+void dlgTrigger::OnSelectListCol(wxListEvent &ev)
+{
+ OnSelectCol();
+}
+
+void dlgTrigger::OnSelectComboCol(wxCommandEvent &ev)
+{
+ OnSelectCol();
+}
+
+void dlgTrigger::OnSelectCol()
+{
+ // Can't change the columns on an existing index.
+ if (trigger)
+ return;
+
+ if (lstColumns->GetSelection() != wxNOT_FOUND)
+ btnRemoveCol->Enable(true);
+ else
+ btnRemoveCol->Enable(false);
+
+ if (cbColumns->GetSelection() != wxNOT_FOUND && !cbColumns->GetValue().IsEmpty())
+ btnAddCol->Enable(true);
+ else
+ btnAddCol->Enable(false);
+}
+
+
diff --git a/pgadmin/include/dlg/dlgTrigger.h b/pgadmin/include/dlg/dlgTrigger.h
index 0640bda..7d1e4eb 100644
--- a/pgadmin/include/dlg/dlgTrigger.h
+++ b/pgadmin/include/dlg/dlgTrigger.h
@@ -18,7 +18,7 @@
class pgTrigger;
class pgTable;
-class dlgTrigger : public dlgProperty
+class dlgTrigger : public dlgCollistProperty
{
public:
dlgTrigger(pgaFactory *factory, frmMain *frame, pgTrigger *trg, pgTable *sch);
@@ -29,12 +29,20 @@ public:
pgObject *CreateObject(pgCollection *collection);
pgObject *GetObject();
void SetObject(pgObject *obj) { trigger = (pgTrigger*)obj; }
+ wxString GetColumns();
+
private:
pgTable *table;
pgTrigger *trigger;
+ void OnChange(wxCommandEvent &ev);
void OnChangeFunc(wxCommandEvent &ev);
+ void OnSelectComboCol(wxCommandEvent &ev);
+ void OnSelectListCol(wxListEvent &ev);
+ void OnSelectCol();
+ void OnAddCol(wxCommandEvent &ev);
+ void OnRemoveCol(wxCommandEvent &ev);
virtual bool IsUpToDate();
diff --git a/pgadmin/include/schema/pgTrigger.h b/pgadmin/include/schema/pgTrigger.h
index 8ff499d..349e347 100644
--- a/pgadmin/include/schema/pgTrigger.h
+++ b/pgadmin/include/schema/pgTrigger.h
@@ -56,6 +56,11 @@ public:
void iSetQuotedFullTable(const wxString &s) { quotedFullTable=s; }
OID GetFunctionOid() const { return functionOid; }
void iSetFunctionOid(const OID d) { functionOid=d; }
+ wxString GetQuotedColumns() const { return quotedColumns; }
+ wxString GetColumns() const { return columns; }
+ wxArrayString GetColumnList() const { return columnList; }
+ long GetColumnCount() const { return columnCount; }
+ void iSetColumnCount(const long l) { columnCount=l; }
void SetDirty();
@@ -69,8 +74,13 @@ public:
bool IsUpToDate();
+protected:
+ void ReadColumnDetails();
+
private:
- wxString function, quotedFullTable, arguments, language, source;
+ wxString function, quotedFullTable, arguments, language, source, columns, quotedColumns;
+ wxArrayString columnList;
+ long columnCount;
OID functionOid;
long triggerType;
bool enabled;
diff --git a/pgadmin/schema/pgTrigger.cpp b/pgadmin/schema/pgTrigger.cpp
index d082c64..c4a2217 100644
--- a/pgadmin/schema/pgTrigger.cpp
+++ b/pgadmin/schema/pgTrigger.cpp
@@ -96,8 +96,12 @@ wxString pgTrigger::GetSql(ctlTree *browser)
sql += wxT("CREATE TRIGGER ") + qtIdent(GetName());
sql += wxT("\n ") + GetFireWhen()
- + wxT(" ") + GetEvent()
- + wxT("\n ON ") + GetQuotedFullTable()
+ + wxT(" ") + GetEvent();
+
+ if (!GetQuotedColumns().IsEmpty())
+ sql += wxT(" OF ") + GetQuotedColumns();
+
+ sql += wxT("\n ON ") + GetQuotedFullTable()
+ wxT("\n FOR EACH ") + GetForEach();
if (GetLanguage() == wxT("edbspl"))
@@ -162,10 +166,59 @@ wxString pgTrigger::GetForEach() const
+void pgTrigger::ReadColumnDetails()
+{
+ if (!expandedKids && GetLanguage() != wxT("edbspl"))
+ {
+ expandedKids = true;
+
+ if (GetConnection()->BackendMinimumVersion(8, 5))
+ {
+ pgSet *res = ExecuteSet(
+ wxT("SELECT attname\n")
+ wxT("FROM pg_attribute,\n")
+ wxT("(SELECT tgrelid, unnest(tgattr) FROM pg_trigger\n")
+ wxT(" WHERE oid=") + GetOidStr() + wxT(") AS columns(tgrelid, colnum)\n")
+ wxT("WHERE colnum=attnum AND tgrelid=attrelid"));
+
+ // Allocate memory to store column def
+ if (res->NumRows()>0) columnList.Alloc(res->NumRows());
+
+ long i = 1;
+ columns = wxT("");
+ quotedColumns = wxT("");
+
+ while (!res->Eof())
+ {
+ if (i > 1)
+ {
+ columns += wxT(", ");
+ quotedColumns += wxT(", ");
+ }
+
+ columns += res->GetVal(wxT("attname"));
+ quotedColumns += res->GetVal(wxT("attname"));
+ columnList.Add(res->GetVal(wxT("attname")));
+
+ i++;
+ res->MoveNext();
+ }
+ }
+ else
+ {
+ columns = wxT("");
+ quotedColumns = wxT("");
+ }
+ }
+}
+
+
void pgTrigger::ShowTreeDetail(ctlTree *browser, frmMain *form, ctlListView *properties, ctlSQLBox *sqlPane)
{
if (!expandedKids && GetLanguage() != wxT("edbspl"))
{
+ ReadColumnDetails();
+
if (browser)
{
// if no browser present, function will not be appended to tree
@@ -191,6 +244,10 @@ void pgTrigger::ShowTreeDetail(ctlTree *browser, frmMain *form, ctlListView *pro
properties->AppendItem(_("OID"), GetOid());
properties->AppendItem(_("Fires"), GetFireWhen());
properties->AppendItem(_("Event"), GetEvent());
+ if (!GetQuotedColumns().IsEmpty())
+ {
+ properties->AppendItem(_("Columns"), GetColumns());
+ }
properties->AppendItem(_("For each"), GetForEach());
if (GetLanguage() != wxT("edbspl"))
properties->AppendItem(_("Function"), GetFunction() + wxT("(") + GetArguments() + wxT(")"));
diff --git a/pgadmin/ui/dlgTrigger.xrc b/pgadmin/ui/dlgTrigger.xrc
index 73e4a08..348192f 100644
--- a/pgadmin/ui/dlgTrigger.xrc
+++ b/pgadmin/ui/dlgTrigger.xrc
@@ -191,6 +191,76 @@
</object>
</object>
<object class="notebookpage">
+ <label>Columns</label>
+ <object class="wxPanel" name="pnlColumns">
+ <object class="wxFlexGridSizer">
+ <cols>1</cols>
+ <rows>3</rows>
+ <growablecols>0</growablecols>
+ <growablerows>0</growablerows>
+ <object class="sizeritem">
+ <object class="wxListCtrl" name="lstColumns">
+ <style>wxLC_REPORT|wxLC_SINGLE_SEL</style>
+ </object>
+ <flag>wxEXPAND|wxALL</flag>
+ <border>4</border>
+ </object>
+ <object class="sizeritem">
+ <object class="wxFlexGridSizer">
+ <cols>2</cols>
+ <rows>1</rows>
+ <vgap>5</vgap>
+ <hgap>5</hgap>
+ <growablecols>1</growablecols>
+ <growablerows>0</growablerows>
+ <object class="sizeritem">
+ <object class="wxStaticText" name="stColumns">
+ <label>Column</label>
+ </object>
+ <flag>wxALIGN_CENTRE_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
+ <border>4</border>
+ </object>
+ <object class="sizeritem">
+ <object class="wxComboBox" name="cbColumns">
+ <content/>
+ <style>wxCB_READONLY|wxCB_DROPDOWN</style>
+ </object>
+ <flag>wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
+ <border>4</border>
+ </object>
+ </object>
+ <flag>wxEXPAND|wxALL</flag>
+ <border>4</border>
+ </object>
+ <object class="sizeritem">
+ <object class="wxFlexGridSizer">
+ <cols>4</cols>
+ <growablecols>0</growablecols>
+ <object class="spacer">
+ <size>3,3d</size>
+ </object>
+ <object class="sizeritem">
+ <object class="wxButton" name="btnAddCol">
+ <label>Add</label>
+ </object>
+ </object>
+ <object class="spacer">
+ <size>3,3d</size>
+ </object>
+ <object class="sizeritem">
+ <object class="wxButton" name="btnRemoveCol">
+ <label>Remove</label>
+ <size>50,-1d</size>
+ </object>
+ </object>
+ </object>
+ <flag>wxEXPAND|wxALL</flag>
+ <border>4</border>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="notebookpage">
<label>Body</label>
<object class="wxPanel" name="pnlBody">
<object class="wxFlexGridSizer">
--
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers