Hi, $SUBJECT says it all.
Any comments before applying? :) -- Guillaume http://www.postgresql.fr http://dalibo.com
>From 00e19f616500a6bb5d029acf076d361b89274dc0 Mon Sep 17 00:00:00 2001 From: Guillaume Lelarge <[email protected]> Date: Sun, 27 Mar 2011 14:39:55 +0200 Subject: [PATCH] Support for ALTER TABLE ADD UNIQUE/PKEY USING INDEX This patch adds a combobox with all the table'index. Choosing one allows the user to add an index constraint with a name and an index. --- pgadmin/dlg/dlgIndexConstraint.cpp | 112 +++++++++++++++++++++++------- pgadmin/include/dlg/dlgIndexConstraint.h | 2 + pgadmin/ui/dlgIndexConstraint.xrc | 19 +++++- 3 files changed, 105 insertions(+), 28 deletions(-) diff --git a/pgadmin/dlg/dlgIndexConstraint.cpp b/pgadmin/dlg/dlgIndexConstraint.cpp index b71582f..8e7a528 100644 --- a/pgadmin/dlg/dlgIndexConstraint.cpp +++ b/pgadmin/dlg/dlgIndexConstraint.cpp @@ -24,6 +24,7 @@ #define cbTablespace CTRL_COMBOBOX("cbTablespace") +#define cbIndex CTRL_COMBOBOX("cbIndex") #define cbType CTRL_COMBOBOX("cbType") #define txtFillFactor CTRL_TEXT("txtFillFactor") #define txtWhere CTRL_TEXT("txtWhere") @@ -42,6 +43,7 @@ BEGIN_EVENT_TABLE(dlgIndexConstraint, dlgIndexBase) #ifdef __WXMAC__ EVT_SIZE( dlgIndexConstraint::OnChangeSize) #endif + EVT_COMBOBOX(XRCID("cbIndex"), dlgIndexConstraint::OnChangeIndex) EVT_COMBOBOX(XRCID("cbType"), dlgIndexConstraint::OnSelectType) EVT_COMBOBOX(XRCID("cbColumns"), dlgIndexConstraint::OnSelectComboCol) END_EVENT_TABLE(); @@ -108,9 +110,14 @@ int dlgIndexConstraint::Go(bool modal) PrepareTablespace(cbTablespace); - if (wxString(factory->GetTypeName()).Upper() != wxT("EXCLUDE")) + if (wxString(factory->GetTypeName()).Upper() == wxT("EXCLUDE")) + { + cbIndex->Disable(); + } + else { - cbType->Disable(); + cbIndex->Enable(connection->BackendMinimumVersion(9, 1)); + cbType->Disable(); txtWhere->Disable(); cbOpClass->Disable(); chkDesc->Disable(); @@ -248,6 +255,20 @@ int dlgIndexConstraint::Go(bool modal) cbClusterSet = 0; } + // Add the indexes + cbIndex->Append(wxT("")); + set = connection->ExecuteSet( + wxT("SELECT relname FROM pg_class, pg_index WHERE pg_class.oid=indexrelid AND indrelid=") + table->GetOidStr()); + if (set) + { + while (!set->Eof()) + { + cbIndex->Append(set->GetVal(0)); + set->MoveNext(); + } + delete set; + } + // Add the default tablespace cbTablespace->Insert(_("<default tablespace>"), 0, (void *)0); cbTablespace->SetSelection(0); @@ -394,6 +415,29 @@ void dlgIndexConstraint::OnSelectComboCol(wxCommandEvent &ev) } +void dlgIndexConstraint::OnChangeIndex(wxCommandEvent &ev) +{ + bool indexselected = cbIndex->GetCurrentSelection() > 0; + bool btreeindex = cbType->GetValue() == wxT("btree") || cbType->GetValue() == wxEmptyString; + bool excludeconstraint = wxString(factory->GetTypeName()).Upper() == wxT("EXCLUDE"); + + cbTablespace->Enable(!indexselected && connection->BackendMinimumVersion(8, 0)); + cbType->Enable(!indexselected && excludeconstraint); + txtFillFactor->Enable(!indexselected && connection->BackendMinimumVersion(8, 2)); + txtWhere->Enable(!indexselected && excludeconstraint); + chkDeferrable->Enable(!indexselected && connection->BackendMinimumVersion(9, 0)); + chkDeferred->Enable(!indexselected && connection->BackendMinimumVersion(9, 0)); + cbOpClass->Enable(!indexselected && excludeconstraint && btreeindex); + chkDesc->Enable(!indexselected && excludeconstraint && btreeindex); + rdbNullsFirst->Enable(!indexselected && excludeconstraint && btreeindex); + rdbNullsLast->Enable(!indexselected && excludeconstraint && btreeindex); + cbOperator->Enable(!indexselected && excludeconstraint); + cbColumns->Enable(!indexselected); + btnAddCol->Enable(!indexselected); + btnRemoveCol->Enable(!indexselected); +} + + void dlgIndexConstraint::OnSelectType(wxCommandEvent &ev) { // The column options available change depending on the @@ -447,33 +491,49 @@ void dlgIndexConstraint::OnSelectType(wxCommandEvent &ev) } -wxString dlgIndexConstraint::GetDefinition() +void dlgIndexConstraint::CheckChange() { - wxString sql = wxEmptyString; - - if (cbType->GetCurrentSelection() > 0) - AppendIfFilled(sql, wxT(" USING "), cbType->GetValue()); - - sql += wxT("(") + GetColumns() + wxT(")"); - - if (txtFillFactor) - { - if (connection->BackendMinimumVersion(8, 2) && txtFillFactor->GetValue().Length() > 0) - sql += wxT("\n WITH (FILLFACTOR=") + txtFillFactor->GetValue() + wxT(")"); - } - - if (cbTablespace->GetOIDKey() > 0) - sql += wxT(" USING INDEX TABLESPACE ") + qtIdent(cbTablespace->GetValue()); + if (cbIndex->GetCurrentSelection() > 0) + EnableOK(true); + else + dlgIndexBase::CheckChange(); +} - if (chkDeferrable->GetValue()) - { - sql += wxT(" DEFERRABLE"); - if (chkDeferred->GetValue()) - sql += wxT(" INITIALLY DEFERRED"); - } - if (txtWhere->GetValue().Length() > 0) - sql += wxT(" WHERE (") + txtWhere->GetValue() + wxT(")"); +wxString dlgIndexConstraint::GetDefinition() +{ + wxString sql = wxEmptyString; + + if (cbIndex->GetCurrentSelection() > 0) + { + sql += wxT(" USING INDEX ") + qtIdent(cbIndex->GetValue()); + } + else + { + if (cbType->GetCurrentSelection() > 0) + AppendIfFilled(sql, wxT(" USING "), cbType->GetValue()); + + sql += wxT("(") + GetColumns() + wxT(")"); + + if (txtFillFactor) + { + if (connection->BackendMinimumVersion(8, 2) && txtFillFactor->GetValue().Length() > 0) + sql += wxT("\n WITH (FILLFACTOR=") + txtFillFactor->GetValue() + wxT(")"); + } + + if (cbTablespace->GetOIDKey() > 0) + sql += wxT(" USING INDEX TABLESPACE ") + qtIdent(cbTablespace->GetValue()); + + if (chkDeferrable->GetValue()) + { + sql += wxT(" DEFERRABLE"); + if (chkDeferred->GetValue()) + sql += wxT(" INITIALLY DEFERRED"); + } + + if (txtWhere->GetValue().Length() > 0) + sql += wxT(" WHERE (") + txtWhere->GetValue() + wxT(")"); + } return sql; } diff --git a/pgadmin/include/dlg/dlgIndexConstraint.h b/pgadmin/include/dlg/dlgIndexConstraint.h index b8a1924..6eccf98 100644 --- a/pgadmin/include/dlg/dlgIndexConstraint.h +++ b/pgadmin/include/dlg/dlgIndexConstraint.h @@ -34,6 +34,7 @@ public: int Go(bool modal); + void CheckChange(); wxString GetDefinition(); wxString GetColumns(); wxString GetSql(); @@ -51,6 +52,7 @@ private: void OnRemoveCol(wxCommandEvent &ev); void OnSelectType(wxCommandEvent &ev); void OnSelectComboCol(wxCommandEvent &ev); + void OnChangeIndex(wxCommandEvent &ev); wxString m_previousType; diff --git a/pgadmin/ui/dlgIndexConstraint.xrc b/pgadmin/ui/dlgIndexConstraint.xrc index 5298953..6f58287 100644 --- a/pgadmin/ui/dlgIndexConstraint.xrc +++ b/pgadmin/ui/dlgIndexConstraint.xrc @@ -17,10 +17,10 @@ <object class="wxPanel" name="pnlProperties"> <object class="wxFlexGridSizer"> <cols>2</cols> - <rows>9</rows> + <rows>10</rows> <vgap>5</vgap> <hgap>5</hgap> - <growablerows>6,7</growablerows> + <growablerows>7,8</growablerows> <growablecols>1</growablecols> <object class="sizeritem"> <object class="wxStaticText" name="stName"> @@ -51,6 +51,21 @@ <border>4</border> </object> <object class="sizeritem"> + <object class="wxStaticText" name="stIndex"> + <label>Index</label> + </object> + <flag>wxALIGN_CENTRE_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag> + <border>4</border> + </object> + <object class="sizeritem"> + <object class="wxComboBox" name="cbIndex"> + <style>wxCB_READONLY|wxCB_DROPDOWN</style> + <content/> + </object> + <flag>wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag> + <border>4</border> + </object> + <object class="sizeritem"> <object class="wxStaticText" name="stType"> <label>Access method</label> </object> -- 1.7.1
-- Sent via pgadmin-hackers mailing list ([email protected]) To make changes to your subscription: http://www.postgresql.org/mailpref/pgadmin-hackers
