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

Reply via email to