Log Message:
-----------
Speed up of column property retrieval

Modified Files:
--------------
    pgadmin3:
        CHANGELOG.txt (r1.199 -> r1.200)
    pgadmin3/src/include:
        pgColumn.h (r1.29 -> r1.30)
    pgadmin3/src/schema:
        pgColumn.cpp (r1.41 -> r1.42)
    pgadmin3/src/utils:
        sysSettings.cpp (r1.71 -> r1.72)

Index: CHANGELOG.txt
===================================================================
RCS file: /projects/pgadmin3/CHANGELOG.txt,v
retrieving revision 1.199
retrieving revision 1.200
diff -LCHANGELOG.txt -LCHANGELOG.txt -u -w -r1.199 -r1.200
--- CHANGELOG.txt
+++ CHANGELOG.txt
@@ -17,6 +17,7 @@
 </ul>
 <br>
 <ul>
+    <li>2005-04-01 AP        Speed up of column property retrieval
     <li>2005-04-01 DP  1.2.2 Fix changing of view ownership
     <li>2005-03-28 AP        FK MATCH FULL
     <li>2005-03-28 AP        Option: User defined system schemas
Index: pgColumn.h
===================================================================
RCS file: /projects/pgadmin3/src/include/pgColumn.h,v
retrieving revision 1.29
retrieving revision 1.30
diff -Lsrc/include/pgColumn.h -Lsrc/include/pgColumn.h -u -w -r1.29 -r1.30
--- src/include/pgColumn.h
+++ src/include/pgColumn.h
@@ -82,6 +82,8 @@
     void iSetSerialSequence(const wxString &s) { serialSequence=s; }
     wxString GetSerialSchema() const { return serialSchema; }
     void iSetSerialSchema(const wxString &s) { serialSchema=s; }
+    void iSetPkCols(const wxString &s) { pkCols = s; }
+    void iSetIsFK(const bool b) { isFK = b; }
 
     bool DropObject(wxFrame *frame, wxTreeCtrl *browser, bool cascaded);
     bool GetSystemObject() const { return colNumber < 0; }
@@ -94,7 +96,7 @@
 
 private:
     wxString varTypename, quotedTypename, defaultVal, tableName, 
quotedFullTable, storage, rawTypename;
-    wxString serialSequence, serialSchema;
+    wxString serialSequence, serialSchema, pkCols;
     long colNumber, length, precision, statistics, attstattarget;
     long typlen, typmod, inheritedCount;
     bool isPK, isFK, notNull, isArray;
Index: pgColumn.cpp
===================================================================
RCS file: /projects/pgadmin3/src/schema/pgColumn.cpp,v
retrieving revision 1.41
retrieving revision 1.42
diff -Lsrc/schema/pgColumn.cpp -Lsrc/schema/pgColumn.cpp -u -w -r1.41 -r1.42
--- src/schema/pgColumn.cpp
+++ src/schema/pgColumn.cpp
@@ -158,21 +158,11 @@
     if (!expandedKids)
     {
         expandedKids = true;
-        // append type here
-        // fk, pk lesen
-        pgSet *set = ExecuteSet(
-            wxT("SELECT indkey FROM pg_index\n")
-            wxT(" WHERE indrelid=") + GetTableOidStr() +
-                       wxT(" AND indisprimary"));
-        if (set)
-        {
-            wxString indkey, str;
-            while (!isPK && !set->Eof())
-            {
-                wxStringTokenizer indkey(set->GetVal(0));
+
+        wxStringTokenizer indkey(pkCols);
                 while (indkey.HasMoreTokens())
                 {
-                    str=indkey.GetNextToken();
+            wxString str=indkey.GetNextToken();
                     if (StrToLong(str) == GetColNumber())
                     {
                         isPK = true;
@@ -180,12 +170,10 @@
                     }
                 }
 
-                set->MoveNext();
-            }
-            delete set;
-        }
-
-        set=ExecuteSet(
+        if (!GetDatabase()->BackendMinimumVersion(7, 4))
+        {
+            // 7.3 misses the ANY(array) comparision
+            pgSet *set=ExecuteSet(
             wxT("SELECT conkey\n")
             wxT("  FROM pg_constraint ct\n")
             wxT("  JOIN pg_class cl on cl.oid=confrelid\n")
@@ -213,6 +201,7 @@
             delete set;
         }
     }
+    }
 
     if (properties)
     {
@@ -278,10 +267,18 @@
     if (!settings->GetShowSystemObjects())
         systemRestriction = wxT("\n   AND attnum > 0");
         
-    pgSet *columns= database->ExecuteSet(
+    wxString sql=
         wxT("SELECT att.*, def.*, CASE WHEN attndims > 0 THEN 1 ELSE 0 END AS 
isarray, CASE WHEN ty.typname = 'bpchar' THEN 'char' WHEN ty.typname = 
'_bpchar' THEN '_char' ELSE ty.typname END AS typname, tn.nspname as 
typnspname, et.typname as elemtypname,\n")
         wxT("  cl.relname, na.nspname, att.attstattarget, description, 
cs.relname AS sername, ns.nspname AS serschema,\n")
-        wxT("  (SELECT count(1) FROM pg_type t2 WHERE t2.typname=ty.typname) > 
1 AS isdup\n")
+        wxT("  (SELECT count(1) FROM pg_type t2 WHERE t2.typname=ty.typname) > 
1 AS isdup, indkey");
+
+    if (database->BackendMinimumVersion(7, 4))
+        sql += 
+            wxT(",\n")
+            wxT("  EXISTS(SELECT 1 FROM  pg_constraint WHERE 
conrelid=att.attrelid AND contype='f'")
+                        wxT(" AND att.attnum=ANY(conkey)) As isfk");
+
+    sql += wxT("\n")
         wxT("  FROM pg_attribute att\n")
         wxT("  JOIN pg_type ty ON ty.oid=atttypid\n")
         wxT("  JOIN pg_namespace tn ON tn.oid=ty.typnamespace\n")
@@ -292,11 +289,13 @@
         wxT("  LEFT OUTER JOIN pg_description des ON des.objoid=attrelid AND 
des.objsubid=attnum\n")
         wxT("  LEFT OUTER JOIN (pg_depend JOIN pg_class cs ON objid=cs.oid AND 
cs.relkind='S') ON refobjid=attrelid AND refobjsubid=attnum\n")
         wxT("  LEFT OUTER JOIN pg_namespace ns ON ns.oid=cs.relnamespace\n")
+        wxT("  LEFT OUTER JOIN pg_index pi ON pi.indrelid=attrelid AND 
indisprimary\n")
         wxT(" WHERE attrelid = ") + collection->GetOidStr()
         + restriction + systemRestriction + wxT("\n")
         wxT("   AND attisdropped IS FALSE\n")
-        wxT(" ORDER BY attnum"));
+        wxT(" ORDER BY attnum");
 
+    pgSet *columns= database->ExecuteSet(sql);
     if (columns)
     {
         while (!columns->Eof())
@@ -310,6 +309,9 @@
             column->iSetComment(columns->GetVal(wxT("description")));
             column->iSetSerialSequence(columns->GetVal(wxT("sername")));
             column->iSetSerialSchema(columns->GetVal(wxT("serschema")));
+            column->iSetPkCols(columns->GetVal(wxT("indkey")));
+            if (database->BackendMinimumVersion(7, 4))
+                column->iSetIsFK(columns->GetBool(wxT("isfk")));
 
             if (columns->GetBool(wxT("atthasdef")))
                 column->iSetDefault(columns->GetVal(wxT("adsrc")));
Index: sysSettings.cpp
===================================================================
RCS file: /projects/pgadmin3/src/utils/sysSettings.cpp,v
retrieving revision 1.71
retrieving revision 1.72
diff -Lsrc/utils/sysSettings.cpp -Lsrc/utils/sysSettings.cpp -u -w -r1.71 -r1.72
--- src/utils/sysSettings.cpp
+++ src/utils/sysSettings.cpp
@@ -33,7 +33,7 @@
 sysSettings::sysSettings(const wxString& name) : wxConfig(name)
 {
     // Tip Of The Day
-    Read(wxT("ShowTipOfTheDay"), &showTipOfTheDay, TRUE); 
+    Read(wxT("ShowTipOfTheDay"), &showTipOfTheDay, true); 
     Read(wxT("NextTipOfTheDay"), &nextTipOfTheDay, 0); 
 
     // Log
@@ -49,7 +49,7 @@
     Read(wxT("LastSSL"), &lastSSL, 0);
 
     // Show System Objects
-    Read(wxT("ShowSystemObjects"), &showSystemObjects, FALSE); 
+    Read(wxT("ShowSystemObjects"), &showSystemObjects, false); 
 
 //    Read(wxT("SqlHelpSite"), &sqlHelpSite, docPath + wxT("/en_US/pg/"));
     Read(wxT("SqlHelpSite"), &sqlHelpSite, wxT(""));
---------------------------(end of broadcast)---------------------------
TIP 9: the planner will ignore your desire to choose an index scan if your
      joining column's datatypes do not match

Reply via email to