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
