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

Reply via email to