From 4b9af590c1915490cf3ddf4e80c83b00bf81cb13 Mon Sep 17 00:00:00 2001
From: gabrielle <gorthx@gmail.com>
Date: Sat, 20 Apr 2013 21:04:16 -0700
Subject: [PATCH] Add check for valid index

---
 pgadmin/dd/ddmodel/ddDBReverseEnginering.cpp |    4 ++--
 pgadmin/dlg/dlgIndex.cpp                     |    2 ++
 pgadmin/include/schema/pgIndex.h             |   10 +++++++++-
 pgadmin/schema/pgIndex.cpp                   |    4 +++-
 pgadmin/schema/pgIndexConstraint.cpp         |    1 +
 5 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/pgadmin/dd/ddmodel/ddDBReverseEnginering.cpp b/pgadmin/dd/ddmodel/ddDBReverseEnginering.cpp
index b3d0977..0942bac 100644
--- a/pgadmin/dd/ddmodel/ddDBReverseEnginering.cpp
+++ b/pgadmin/dd/ddmodel/ddDBReverseEnginering.cpp
@@ -357,7 +357,7 @@ bool ddImportDBUtils::setUniqueConstraints(pgConn *connection, ddStubTable *tabl
 		projoin =   wxT("  LEFT OUTER JOIN pg_proc pr ON pr.oid=indproc\n")
 		            wxT("  LEFT OUTER JOIN pg_namespace pn ON pn.oid=pr.pronamespace\n");
 	}
-	query = wxT("SELECT DISTINCT ON(cls.relname) cls.oid, cls.relname as idxname, indrelid, indkey, indisclustered, indisunique, indisprimary, n.nspname,\n")
+	query = wxT("SELECT DISTINCT ON(cls.relname) cls.oid, cls.relname as idxname, indrelid, indkey, indisclustered, indisvalid, indisunique, indisprimary, n.nspname,\n")
 	        wxT("       ") + proname + wxT("tab.relname as tabname, indclass, con.oid AS conoid, CASE contype WHEN 'p' THEN desp.description WHEN 'u' THEN desp.description WHEN 'x' THEN desp.description ELSE des.description END AS description,\n")
 	        wxT("       pg_get_expr(indpred, indrelid") + prettyOption + wxT(") as indconstraint, contype, condeferrable, condeferred, amname\n");
 	if (connection->BackendMinimumVersion(8, 2))
@@ -447,7 +447,7 @@ bool ddImportDBUtils::setPkName(pgConn *connection, ddStubTable *table)
 		projoin =   wxT("  LEFT OUTER JOIN pg_proc pr ON pr.oid=indproc\n")
 		            wxT("  LEFT OUTER JOIN pg_namespace pn ON pn.oid=pr.pronamespace\n");
 	}
-	query = wxT("SELECT DISTINCT ON(cls.relname) cls.oid, cls.relname as idxname, indrelid, indkey, indisclustered, indisunique, indisprimary, n.nspname,\n")
+	query = wxT("SELECT DISTINCT ON(cls.relname) cls.oid, cls.relname as idxname, indrelid, indkey, indisclustered, indisvalid, indisunique, indisprimary, n.nspname,\n")
 	        wxT("       ") + proname + wxT("tab.relname as tabname, indclass, con.oid AS conoid, CASE contype WHEN 'p' THEN desp.description WHEN 'u' THEN desp.description WHEN 'x' THEN desp.description ELSE des.description END AS description,\n")
 	        wxT("       pg_get_expr(indpred, indrelid") + prettyOption + wxT(") as indconstraint, contype, condeferrable, condeferred, amname\n");
 	if (connection->BackendMinimumVersion(8, 2))
diff --git a/pgadmin/dlg/dlgIndex.cpp b/pgadmin/dlg/dlgIndex.cpp
index 2f84783..871dc9f 100644
--- a/pgadmin/dlg/dlgIndex.cpp
+++ b/pgadmin/dlg/dlgIndex.cpp
@@ -26,6 +26,7 @@
 #define cbType          CTRL_COMBOBOX("cbType")
 #define chkUnique       CTRL_CHECKBOX("chkUnique")
 #define chkClustered    CTRL_CHECKBOX("chkClustered")
+#define chkValid        CTRL_CHECKBOX("chkValid")
 #define chkConcurrent   CTRL_CHECKBOX("chkConcurrent")
 #define txtWhere        CTRL_TEXT("txtWhere")
 #define txtFillFactor   CTRL_TEXT("txtFillFactor")
@@ -387,6 +388,7 @@ int dlgIndex::Go(bool modal)
 		cbType->Append(index->GetIndexType());
 		chkUnique->SetValue(index->GetIsUnique());
 		chkClustered->SetValue(index->GetIsClustered());
+		chkValid->SetValue(index->GetIsValid());
 		txtWhere->SetValue(index->GetConstraint());
 		cbType->SetSelection(0);
 		cbType->Disable();
diff --git a/pgadmin/include/schema/pgIndex.h b/pgadmin/include/schema/pgIndex.h
index ae55400..7db8852 100644
--- a/pgadmin/include/schema/pgIndex.h
+++ b/pgadmin/include/schema/pgIndex.h
@@ -125,6 +125,14 @@ public:
 	{
 		isClustered = b;
 	}
+	bool GetIsValid() const
+	{
+		return isValid;
+	}
+	void iSetIsValid(const bool b)
+	{
+		isValid = b;
+	}
 	wxString GetIdxTable() const
 	{
 		return idxTable;
@@ -280,7 +288,7 @@ private:
 	wxString procName, procNamespace, procArgs, procArgTypeList, typedColumns, quotedTypedColumns, operatorClasses, operatorClassList;
 	long columnCount;
 	wxArrayString columnList, ordersArray, nullsArray, opclassesArray, collationsArray;
-	bool isUnique, isPrimary, isExclude, isClustered;
+	bool isUnique, isPrimary, isExclude, isClustered, isValid;
 	bool deferrable, deferred, showExtendedStatistics;
 	OID relTableOid, tablespaceOid;
 	wxString fillFactor;
diff --git a/pgadmin/schema/pgIndex.cpp b/pgadmin/schema/pgIndex.cpp
index a40d5bc..450d504 100644
--- a/pgadmin/schema/pgIndex.cpp
+++ b/pgadmin/schema/pgIndex.cpp
@@ -399,6 +399,7 @@ void pgIndexBase::ShowTreeDetail(ctlTree *browser, frmMain *form, ctlListView *p
 		properties->AppendYesNoItem(_("Unique?"), GetIsUnique());
 		properties->AppendYesNoItem(_("Primary?"), GetIsPrimary());
 		properties->AppendYesNoItem(_("Clustered?"), GetIsClustered());
+		properties->AppendYesNoItem(_("Valid?"), GetIsValid());
 		properties->AppendItem(_("Access method"), GetIndexType());
 		properties->AppendItem(_("Constraint"), GetConstraint());
 		properties->AppendYesNoItem(_("System index?"), GetSystemObject());
@@ -539,7 +540,7 @@ pgObject *pgIndexBaseFactory::CreateObjects(pgCollection *coll, ctlTree *browser
 		projoin =   wxT("  LEFT OUTER JOIN pg_proc pr ON pr.oid=indproc\n")
 		            wxT("  LEFT OUTER JOIN pg_namespace pn ON pn.oid=pr.pronamespace\n");
 	}
-	query = wxT("SELECT DISTINCT ON(cls.relname) cls.oid, cls.relname as idxname, indrelid, indkey, indisclustered, indisunique, indisprimary, n.nspname,\n")
+	query = wxT("SELECT DISTINCT ON(cls.relname) cls.oid, cls.relname as idxname, indrelid, indkey, indisclustered, indisvalid, indisunique, indisprimary, n.nspname,\n")
 	        wxT("       ") + proname + wxT("tab.relname as tabname, indclass, con.oid AS conoid, CASE contype WHEN 'p' THEN desp.description WHEN 'u' THEN desp.description WHEN 'x' THEN desp.description ELSE des.description END AS description,\n")
 	        wxT("       pg_get_expr(indpred, indrelid") + collection->GetDatabase()->GetPrettyOption() + wxT(") as indconstraint, contype, condeferrable, condeferred, amname\n");
 	if (collection->GetConnection()->BackendMinimumVersion(8, 2))
@@ -587,6 +588,7 @@ pgObject *pgIndexBaseFactory::CreateObjects(pgCollection *coll, ctlTree *browser
 
 			index->iSetOid(indexes->GetOid(wxT("oid")));
 			index->iSetIsClustered(indexes->GetBool(wxT("indisclustered")));
+			index->iSetIsValid(indexes->GetBool(wxT("indisvalid")));
 			index->iSetIsUnique(indexes->GetBool(wxT("indisunique")));
 			index->iSetIsPrimary(indexes->GetBool(wxT("indisprimary")));
 			index->iSetIsExclude(*(indexes->GetCharPtr(wxT("contype"))) == 'x');
diff --git a/pgadmin/schema/pgIndexConstraint.cpp b/pgadmin/schema/pgIndexConstraint.cpp
index 368ee54..2f03232 100644
--- a/pgadmin/schema/pgIndexConstraint.cpp
+++ b/pgadmin/schema/pgIndexConstraint.cpp
@@ -189,6 +189,7 @@ void pgIndexConstraint::ShowTreeDetail(ctlTree *browser, frmMain *form, ctlListV
 		properties->AppendYesNoItem(_("Unique?"), GetIsUnique());
 		properties->AppendYesNoItem(_("Primary?"), GetIsPrimary());
 		properties->AppendYesNoItem(_("Clustered?"), GetIsClustered());
+		properties->AppendYesNoItem(_("Valid?"), GetIsValid());
 		properties->AppendItem(_("Access method"), GetIndexType());
 		properties->AppendItem(_("Constraint"), GetConstraint());
 		properties->AppendYesNoItem(_("System index?"), GetSystemObject());
-- 
1.7.9.5

