Hi,

This patch adds support to the new ALTER TYPE syntax in 9.1 for enums.

It's working great except one thing. If a user wants to add two labels,
we're screwed because we can't do two "ALTER TYPE ... ADD" statements in
the same query execution. Any idea how to solve this? the only way I
found would be to disallow adding two labels at once but it results on a
less interesting feature.

Comments?


-- 
Guillaume
 http://www.postgresql.fr
 http://dalibo.com
>From 089dc06c2fa20b8676136caf9140c8b31472bda5 Mon Sep 17 00:00:00 2001
From: Guillaume Lelarge <[email protected]>
Date: Fri, 29 Oct 2010 21:04:51 -0700
Subject: [PATCH] Add support for 9.1 ALTER TYPE new syntax for enum

I changed the Add button with two buttons (Add Before and Add After). The rest
of the patch is used to allow the addition of a new label to an existing enum
type if we are connected to an 9.1+ release.

Implements #269.
---
 pgadmin/dlg/dlgType.cpp       |   74 ++++++++++++++++++++++++++++++++++++----
 pgadmin/include/dlg/dlgType.h |    3 +-
 pgadmin/schema/pgType.cpp     |   13 ++++---
 pgadmin/ui/dlgType.xrc        |   13 +++++--
 4 files changed, 86 insertions(+), 17 deletions(-)

diff --git a/pgadmin/dlg/dlgType.cpp b/pgadmin/dlg/dlgType.cpp
index e9ccef6..5532488 100644
--- a/pgadmin/dlg/dlgType.cpp
+++ b/pgadmin/dlg/dlgType.cpp
@@ -46,7 +46,8 @@
 #define txtLabel                CTRL_TEXT("txtLabel")
 #define btnAddMember            CTRL_BUTTON("btnAddMember")
 #define btnRemoveMember         CTRL_BUTTON("btnRemoveMember")
-#define btnAddLabel             CTRL_BUTTON("btnAddLabel")
+#define btnAddAfterLabel        CTRL_BUTTON("btnAddAfterLabel")
+#define btnAddBeforeLabel       CTRL_BUTTON("btnAddBeforeLabel")
 #define btnRemoveLabel          CTRL_BUTTON("btnRemoveLabel")
 #define pnlDefinition           CTRL_PANEL("pnlDefinition")
 #define pnlDefinitionExtern     CTRL_PANEL("pnlDefinitionExtern")
@@ -66,7 +67,8 @@ BEGIN_EVENT_TABLE(dlgType, dlgTypeProperty)
     
     EVT_BUTTON(XRCID("btnAddMember"),               dlgType::OnMemberAdd)
     EVT_BUTTON(XRCID("btnRemoveMember"),            dlgType::OnMemberRemove)
-    EVT_BUTTON(XRCID("btnAddLabel"),                dlgType::OnLabelAdd)
+    EVT_BUTTON(XRCID("btnAddBeforeLabel"),          dlgType::OnLabelAddBefore)
+    EVT_BUTTON(XRCID("btnAddAfterLabel"),           dlgType::OnLabelAddAfter)
     EVT_BUTTON(XRCID("btnRemoveLabel"),             dlgType::OnLabelRemove)
     EVT_LIST_ITEM_SELECTED(XRCID("lstMembers"),     dlgType::OnMemberSelChange)
     EVT_LIST_ITEM_SELECTED(XRCID("lstLabels"),      dlgType::OnLabelSelChange)
@@ -180,8 +182,9 @@ int dlgType::Go(bool modal)
         btnAddMember->Disable();
         btnRemoveMember->Disable();
 
-        txtLabel->Disable();
-        btnAddLabel->Disable();
+        txtLabel->Enable(connection->BackendMinimumVersion(9, 1));
+        btnAddBeforeLabel->Enable(connection->BackendMinimumVersion(9, 1));
+        btnAddAfterLabel->Enable(connection->BackendMinimumVersion(9, 1));
         btnRemoveLabel->Disable();
 
         wxArrayString elements=type->GetTypesArray();
@@ -379,7 +382,8 @@ void dlgType::CheckChange()
     if (type)
     {
         EnableOK(txtComment->GetValue() != type->GetComment()
-            || cbOwner->GetValue() != type->GetOwner());
+            || cbOwner->GetValue() != type->GetOwner()
+            || (GetSql().Length() > 0 && connection->BackendMinimumVersion(9, 1)));
     }
     else
     {
@@ -496,7 +500,7 @@ void dlgType::OnLabelSelChange(wxListEvent &ev)
 }
 
 
-void dlgType::OnLabelAdd(wxCommandEvent &ev)
+void dlgType::OnLabelAddBefore(wxCommandEvent &ev)
 {
     wxString label=txtLabel->GetValue().Strip(wxString::both);
 
@@ -505,7 +509,31 @@ void dlgType::OnLabelAdd(wxCommandEvent &ev)
         long pos=lstLabels->FindItem(-1, label);
         if (pos < 0)
         {
-            pos = lstLabels->GetItemCount();
+            if (lstLabels->GetFirstSelected() >= 0)
+                pos = lstLabels->GetFirstSelected();
+            else
+                pos = 0;
+            lstLabels->InsertItem(pos, label, 0);
+        }
+    }
+    txtLabel->SetValue(wxEmptyString);
+    CheckChange();
+}
+
+
+void dlgType::OnLabelAddAfter(wxCommandEvent &ev)
+{
+    wxString label=txtLabel->GetValue().Strip(wxString::both);
+
+    if (!label.IsEmpty())
+    {
+        long pos=lstLabels->FindItem(-1, label);
+        if (pos < 0)
+        {
+            if (lstLabels->GetFirstSelected() >= 0)
+                pos = lstLabels->GetFirstSelected() + 1;
+            else
+                pos = lstLabels->GetItemCount();
             lstLabels->InsertItem(pos, label, 0);
         }
     }
@@ -536,12 +564,42 @@ pgObject *dlgType::CreateObject(pgCollection *collection)
 
 wxString dlgType::GetSql()
 {
-    wxString sql;
+    wxString sql,direction;
+    int existingitems_index, listitems_index, offset;
     
     if (type)
     {
         // Edit Mode
         AppendOwnerChange(sql, wxT("TYPE ") + type->GetQuotedFullIdentifier());
+        if (rdbType->GetSelection() == TYPE_ENUM && connection->BackendMinimumVersion(9, 1))
+        {
+            wxArrayString elements=type->GetLabelArray();
+            existingitems_index = 0;
+            for (listitems_index=0 ; listitems_index < lstLabels->GetItemCount() ; listitems_index++)
+            {
+                if (lstLabels->GetItemText(listitems_index) != elements.Item(existingitems_index))
+                {
+                    if (listitems_index == 0)
+                    {
+                        direction = wxT("BEFORE");
+                        offset = 0;
+                    }
+                    else
+                    {
+                        direction = wxT("AFTER");
+                        offset = -1;
+                    }
+
+                    sql += wxT("ALTER TYPE ") + type->GetQuotedFullIdentifier()
+                        +  wxT(" ADD ") + connection->qtDbString(lstLabels->GetItemText(listitems_index))
+                        +  wxT(" ") + direction + wxT(" ")
+                        + connection->qtDbString(elements.Item(existingitems_index + offset))
+                        + wxT(";\n");
+                }
+                else
+                    existingitems_index++;
+            }
+        }
     }
     else
     {
diff --git a/pgadmin/include/dlg/dlgType.h b/pgadmin/include/dlg/dlgType.h
index 843864b..11e1aba 100644
--- a/pgadmin/include/dlg/dlgType.h
+++ b/pgadmin/include/dlg/dlgType.h
@@ -36,7 +36,8 @@ private:
     void OnMemberAdd(wxCommandEvent &ev);
     void OnMemberRemove(wxCommandEvent &ev);
     void OnMemberSelChange(wxListEvent &ev);
-    void OnLabelAdd(wxCommandEvent &ev);
+    void OnLabelAddBefore(wxCommandEvent &ev);
+    void OnLabelAddAfter(wxCommandEvent &ev);
     void OnLabelRemove(wxCommandEvent &ev);
     void OnLabelSelChange(wxListEvent &ev);
     void OnSelChangeTyp(wxCommandEvent &ev);
diff --git a/pgadmin/schema/pgType.cpp b/pgadmin/schema/pgType.cpp
index abdba64..1eff28b 100644
--- a/pgadmin/schema/pgType.cpp
+++ b/pgadmin/schema/pgType.cpp
@@ -198,11 +198,14 @@ void pgType::ShowTreeDetail(ctlTree *browser, frmMain *form, ctlListView *proper
         }
         else if (GetTypeClass() == TYPE_ENUM)
         {
-            pgSet *set=ExecuteSet(
-                wxT("SELECT enumlabel\n")
-                wxT("  FROM pg_enum\n")
-                wxT(" WHERE enumtypid=") + GetOidStr() + wxT("\n")
-                wxT(" ORDER by oid"));
+            wxString query = wxT("SELECT enumlabel\n")
+                             wxT("  FROM pg_enum\n")
+                             wxT(" WHERE enumtypid=") + GetOidStr() + wxT("\n");
+            if (GetConnection()->BackendMinimumVersion(9, 1))
+                query += wxT(" ORDER by enumsortorder");
+            else
+                query += wxT(" ORDER by oid");
+            pgSet *set=ExecuteSet(query);
             if (set)
             {
                 int anzvar=0;
diff --git a/pgadmin/ui/dlgType.xrc b/pgadmin/ui/dlgType.xrc
index 3097de2..18c8bea 100644
--- a/pgadmin/ui/dlgType.xrc
+++ b/pgadmin/ui/dlgType.xrc
@@ -284,7 +284,7 @@
                       </object>
                       <object class="sizeritem">
                         <object class="wxFlexGridSizer">
-                          <cols>3</cols>
+                          <cols>4</cols>
                           <rows>1</rows>
                           <vgap>5</vgap>
                           <hgap>5</hgap>
@@ -293,8 +293,15 @@
                             <size>2,2d</size>
                           </object>
                           <object class="sizeritem">
-                            <object class="wxButton" name="btnAddLabel">
-                              <label>Add</label>
+                            <object class="wxButton" name="btnAddBeforeLabel">
+                              <label>Add before</label>
+                            </object>
+                            <flag>wxALIGN_CENTRE_VERTICAL|wxALL</flag>
+                            <border>4</border>
+                          </object>
+                          <object class="sizeritem">
+                            <object class="wxButton" name="btnAddAfterLabel">
+                              <label>Add after</label>
                             </object>
                             <flag>wxALIGN_CENTRE_VERTICAL|wxALL</flag>
                             <border>4</border>
-- 
1.7.1

-- 
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