Log Message:
-----------
Reworked schema prefixing

Modified Files:
--------------
    pgadmin3:
        CHANGELOG.txt (r1.118 -> r1.119)
    pgadmin3/src/include:
        pgDatabase.h (r1.38 -> r1.39)
        pgDatatype.h (r1.9 -> r1.10)
        pgDomain.h (r1.18 -> r1.19)
    pgadmin3/src/schema:
        pgColumn.cpp (r1.37 -> r1.38)
        pgDatabase.cpp (r1.62 -> r1.63)
        pgDatatype.cpp (r1.11 -> r1.12)
        pgDomain.cpp (r1.21 -> r1.22)
        pgType.cpp (r1.21 -> r1.22)
    pgadmin3/src/ui:
        dlgForeignKey.cpp (r1.24 -> r1.25)
        dlgFunction.cpp (r1.37 -> r1.38)

Index: CHANGELOG.txt
===================================================================
RCS file: /projects/pgadmin3/CHANGELOG.txt,v
retrieving revision 1.118
retrieving revision 1.119
diff -LCHANGELOG.txt -LCHANGELOG.txt -u -w -r1.118 -r1.119
--- CHANGELOG.txt
+++ CHANGELOG.txt
@@ -16,6 +16,7 @@
 </ul>
 <br>
 <ul>
+    <li>2004-01-27 AP        Reworked schema prefixing
     <li>2004-01-25 AP        support of pg_xxx_size if available
     <li>2004-01-21 AP        Improved disconnect handling
     <li>2004-01-21 AP        StatusBar with size handle for frmStatus, dlgFunction 
and dlgView
Index: pgDomain.h
===================================================================
RCS file: /projects/pgadmin3/src/include/pgDomain.h,v
retrieving revision 1.18
retrieving revision 1.19
diff -Lsrc/include/pgDomain.h -Lsrc/include/pgDomain.h -u -w -r1.18 -r1.19
--- src/include/pgDomain.h
+++ src/include/pgDomain.h
@@ -37,6 +37,7 @@
     void iSetBasetype(const wxString& s) { basetype = s; }
     wxString GetQuotedBasetype() const { return quotedBasetype; }
     void iSetQuotedBasetype(const wxString& s) { quotedBasetype = s; }
+    void iSetIsDup(bool b) { isDup = b; }
     long GetLength() const { return length; }
     void iSetLength(long l) { length=l; }
     long GetPrecision() const { return precision; }
@@ -66,7 +67,7 @@
     wxString basetype, quotedBasetype, defaultVal, delimiter, check;
     long length, precision, dimensions;
     long typlen, typmod;
-    bool notNull;
+    bool notNull, isDup;
     OID basetypeOid;
 };
 
Index: pgDatatype.h
===================================================================
RCS file: /projects/pgadmin3/src/include/pgDatatype.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -Lsrc/include/pgDatatype.h -Lsrc/include/pgDatatype.h -u -w -r1.9 -r1.10
--- src/include/pgDatatype.h
+++ src/include/pgDatatype.h
@@ -24,21 +24,25 @@
 class pgDatatype
 {
 public:
-    pgDatatype(const wxString &typname, long numdims=0, long typmod=-1);
+    pgDatatype(const wxString &nsp, const wxString &typname, bool isduplicate, long 
numdims=0, long typmod=-1);
     wxString Name() const { return name; };
     wxString LengthString() const { return length; }
     wxString Array() const { return array; }
     wxString FullName() const { return name + length + array; }
     wxString QuotedFullName() const { return qtIdent(name) + length + array; }
+    wxString GetSchemaPrefix(pgDatabase *db) const;
+    wxString GetQuotedSchemaPrefix(pgDatabase *db) const;
     long Length() const { return len; }
     long Precision() const { return prec; }
     static long GetTypmod(const wxString &name, const wxString &len, const wxString 
&prec);
 
 private:
+    wxString schema;
     wxString name;
     wxString length;
     wxString array;
     long len, prec;
+    bool needSchema;
 };
 
 
Index: pgDatabase.h
===================================================================
RCS file: /projects/pgadmin3/src/include/pgDatabase.h,v
retrieving revision 1.38
retrieving revision 1.39
diff -Lsrc/include/pgDatabase.h -Lsrc/include/pgDatabase.h -u -w -r1.38 -r1.39
--- src/include/pgDatabase.h
+++ src/include/pgDatabase.h
@@ -39,6 +39,7 @@
     pgSet *ExecuteSet(const wxString& sql);
     wxString ExecuteScalar(const wxString& sql);
     bool ExecuteVoid(const wxString& sql);
+    void UpdateDefaultSchema();
 
     pgConn *CreateConn() { return server->CreateConn(GetName()); }
 
@@ -84,7 +85,7 @@
     bool connected;
     bool useServerConnection;
     wxString searchPath, path, tablespace, encoding;
-    wxString prettyOption;
+    wxString prettyOption, defaultSchema;
     bool allowConnections, createPrivilege;
     long missingFKs;
     wxArrayString variables;
Index: pgType.cpp
===================================================================
RCS file: /projects/pgadmin3/src/schema/pgType.cpp,v
retrieving revision 1.21
retrieving revision 1.22
diff -Lsrc/schema/pgType.cpp -Lsrc/schema/pgType.cpp -u -w -r1.21 -r1.22
--- src/schema/pgType.cpp
+++ src/schema/pgType.cpp
@@ -78,7 +78,8 @@
         if (isComposite)
         {
             pgSet *set=ExecuteSet(
-                wxT("SELECT attname, t.typname, attndims, atttypmod, nspname\n")
+                wxT("SELECT attname, t.typname, attndims, atttypmod, nspname,\n")
+                wxT("       (SELECT COUNT(1) from pg_type t2 WHERE 
t2.typname=t.typname) > 1 AS isdup\n")
                 wxT("  FROM pg_attribute att\n")
                 wxT("  JOIN pg_type t ON t.oid=atttypid\n")
                 wxT("  JOIN pg_namespace nsp ON t.typnamespace=nsp.oid\n")
@@ -98,12 +99,13 @@
                     typesList += set->GetVal(wxT("attname")) + wxT(" ");
                     quotedTypesList += qtIdent(set->GetVal(wxT("attname"))) + wxT(" 
");
 
-                    pgDatatype dt(set->GetVal(wxT("typname")), 
set->GetLong(wxT("attndims")) > 0, set->GetLong(wxT("atttypmod")));
+                    pgDatatype dt(set->GetVal(wxT("nspname")), 
set->GetVal(wxT("typname")),
+                        set->GetBool(wxT("isdup")), set->GetLong(wxT("attndims")) > 
0, set->GetLong(wxT("atttypmod")));
 
                     wxString nspname=set->GetVal(wxT("nspname"));
 
-                    typesList += GetSchemaPrefix(nspname) + dt.FullName();
-                    quotedTypesList += GetQuotedSchemaPrefix(nspname) + 
dt.QuotedFullName();
+                    typesList += dt.GetSchemaPrefix(GetDatabase()) + dt.FullName();
+                    quotedTypesList += dt.GetQuotedSchemaPrefix(GetDatabase()) + 
dt.QuotedFullName();
 
                     set->MoveNext();
                 }
Index: pgColumn.cpp
===================================================================
RCS file: /projects/pgadmin3/src/schema/pgColumn.cpp,v
retrieving revision 1.37
retrieving revision 1.38
diff -Lsrc/schema/pgColumn.cpp -Lsrc/schema/pgColumn.cpp -u -w -r1.37 -r1.38
--- src/schema/pgColumn.cpp
+++ src/schema/pgColumn.cpp
@@ -129,7 +129,8 @@
 {
     wxString sql = GetQuotedTypename();
 
-    if ((sql == wxT("int4") || sql == wxT("int8"))
+    if ((sql == wxT("int4") || sql == wxT("int8") || 
+         sql == wxT("pg_catalog.int4") || sql == wxT("pg_catalog.int8"))
         && GetDefault() == wxT("nextval('") 
                         + schema->GetName() + wxT(".") + GetTableName() 
                         + wxT("_") + GetName() + wxT("_seq'::text)"))
@@ -278,7 +279,8 @@
         
     pgSet *columns= database->ExecuteSet(
         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("  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("  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")
@@ -322,7 +324,9 @@
             column->iSetTyplen(columns->GetLong(wxT("attlen")));
 
             long typmod=columns->GetLong(wxT("atttypmod"));
-            pgDatatype dt(columns->GetVal(wxT("typname")), 
columns->GetBool(wxT("isarray"))? 1 : 0, typmod);
+            pgDatatype dt(columns->GetVal(wxT("typnspname")), 
columns->GetVal(wxT("typname")), 
+                columns->GetBool(wxT("isdup")),
+                columns->GetBool(wxT("isarray"))? 1 : 0, typmod);
 
 
             column->iSetTypmod(typmod);
@@ -330,17 +334,8 @@
             column->iSetPrecision(dt.Precision());
             column->iSetRawTypename(dt.Name());
 
-            wxString nsp=columns->GetVal(wxT("typnspname"));
-            if (nsp == wxT("pg_catalog"))
-            {
-                column->iSetVarTypename(dt.FullName());
-                column->iSetQuotedTypename(dt.QuotedFullName());
-            }
-            else
-            {
-                column->iSetVarTypename(database->GetSchemaPrefix(nsp) + 
dt.FullName());
-                column->iSetQuotedTypename(database->GetQuotedSchemaPrefix(nsp) + 
dt.QuotedFullName());
-            }
+            column->iSetVarTypename(dt.GetSchemaPrefix(database) + dt.FullName());
+            column->iSetQuotedTypename(dt.GetQuotedSchemaPrefix(database) + 
dt.QuotedFullName());
 
             column->iSetNotNull(columns->GetBool(wxT("attnotnull")));
             
column->iSetQuotedFullTable(database->GetQuotedSchemaPrefix(columns->GetVal(wxT("nspname")))
Index: pgDomain.cpp
===================================================================
RCS file: /projects/pgadmin3/src/schema/pgDomain.cpp,v
retrieving revision 1.21
retrieving revision 1.22
diff -Lsrc/schema/pgDomain.cpp -Lsrc/schema/pgDomain.cpp -u -w -r1.21 -r1.22
--- src/schema/pgDomain.cpp
+++ src/schema/pgDomain.cpp
@@ -125,13 +125,16 @@
 {
     pgDomain *domain=0;
 
+    pgDatabase *db=collection->GetDatabase();
 
-    pgSet *domains= collection->GetDatabase()->ExecuteSet(
+    pgSet *domains= db->ExecuteSet(
         wxT("SELECT d.oid, d.typname as domname, d.typbasetype, b.typname as 
basetype, pg_get_userbyid(d.typowner) as domainowner, \n")
-        wxT("       d.typlen, d.typtypmod, d.typnotnull, d.typdefault, d.typndims, 
d.typdelim,\n")
-        wxT("       description\n")
+        wxT("       d.typlen, d.typtypmod, d.typnotnull, d.typdefault, d.typndims, 
d.typdelim, bn.nspname as basensp,\n")
+        wxT("       description, (SELECT COUNT(1) FROM pg_type t2 WHERE 
t2.typname=d.typname) > 1 AS domisdup,\n")
+        wxT("       (SELECT COUNT(1) FROM pg_type t3 WHERE t3.typname=b.typname) > 1 
AS baseisdup\n")
         wxT("  FROM pg_type d\n")
         wxT("  JOIN pg_type b ON b.oid = CASE WHEN d.typndims>0 then d.typelem ELSE 
d.typbasetype END\n")
+        wxT("  JOIN pg_namespace bn ON bn.oid=b.typnamespace\n")
         wxT("  LEFT OUTER JOIN pg_description des ON des.objoid=d.oid\n")
         wxT(" WHERE d.typtype = 'd' AND d.typnamespace = ") + 
NumToStr(collection->GetSchema()->GetOid()) + wxT("::oid\n")
         + restriction +
@@ -150,18 +153,20 @@
             domain->iSetComment(domains->GetVal(wxT("description")));
             long typmod=domains->GetLong(wxT("typtypmod"));
 
-            pgDatatype dt(domains->GetVal(wxT("basetype")), 
domains->GetLong(wxT("typndims")), typmod);
+            pgDatatype dt(domains->GetVal(wxT("basensp")), 
domains->GetVal(wxT("basetype")), 
+                domains->GetBool(wxT("baseisdup")), 
domains->GetLong(wxT("typndims")), typmod);
 
             domain->iSetTyplen(domains->GetLong(wxT("typlen")));
             domain->iSetTypmod(typmod);
             domain->iSetLength(dt.Length());
             domain->iSetPrecision(dt.Precision());
-            domain->iSetBasetype(dt.FullName());
-            domain->iSetQuotedBasetype(dt.QuotedFullName());
+            domain->iSetBasetype(dt.GetSchemaPrefix(db) + dt.FullName());
+            domain->iSetQuotedBasetype(dt.GetQuotedSchemaPrefix(db) + 
dt.QuotedFullName());
             domain->iSetDefault(domains->GetVal(wxT("typdefault")));
             domain->iSetNotNull(domains->GetBool(wxT("typnotnull")));
             domain->iSetDimensions(domains->GetLong(wxT("typndims")));
             domain->iSetDelimiter(domains->GetVal(wxT("typdelim")));
+            domain->iSetIsDup(domains->GetBool(wxT("domisdup")));
 
             if (browser)
             {
Index: pgDatabase.cpp
===================================================================
RCS file: /projects/pgadmin3/src/schema/pgDatabase.cpp,v
retrieving revision 1.62
retrieving revision 1.63
diff -Lsrc/schema/pgDatabase.cpp -Lsrc/schema/pgDatabase.cpp -u -w -r1.62 -r1.63
--- src/schema/pgDatabase.cpp
+++ src/schema/pgDatabase.cpp
@@ -90,7 +90,8 @@
         if (!exprname.IsEmpty())
             prettyOption = wxT(", true");
     
-        searchPath = connection()->ExecuteScalar(wxT("SHOW search_path"));
+        UpdateDefaultSchema();
+
         connected = true;
     }
 
@@ -160,30 +161,51 @@
 }
 
 
-wxString pgDatabase::GetSchemaPrefix(const wxString &name) const
+void pgDatabase::UpdateDefaultSchema()
 {
-    if (name.IsEmpty())
-        return name;
-
-    wxString sp=wxT("public,pg_catalog");
+    searchPath = connection()->ExecuteScalar(wxT("SHOW search_path"));
 
-#if 0
-    // this wasn't really a good idea for object creation/modification.
-    wxString sp=settings->GetSearchPath();
-    if (sp.IsEmpty())
-        sp = GetSearchPath();
-    sp += wxT(",pg_catalog");
-#endif
-    wxStringTokenizer spt(sp, wxT(","));
-    while (spt.HasMoreTokens())
+    if (!searchPath.IsEmpty())
+    {
+        wxStringTokenizer tk(searchPath, wxT(","));
+        pgSet *set=ExecuteSet(wxT("SELECT nspname, session_user=nspname AS isuser 
FROM pg_namespace"));
+        if (set)
     {
-        wxString tk=spt.GetNextToken().Strip(wxString::both);
-        if (tk == wxT("$user"))
+            while (tk.HasMoreTokens())
+            {
+                wxString str=tk.GetNextToken();
+                str.Strip(wxString::both);
+
+                if (str.IsEmpty())
             continue;
+                long row;
+                for (row=1 ; row <= set->NumRows() ; row++)
+                {
+                    set->Locate(row);
+                    defaultSchema = set->GetVal(wxT("nspname"));
+                    if (str == defaultSchema || 
+                            (str == wxT("$user") && set->GetBool(wxT("isuser"))))
+                    {
+                        delete set;
+                        return;
+                    }
+                }
+            }
+            delete set;
+        }
+    }
+    defaultSchema = wxEmptyString;
+}
+
+
+wxString pgDatabase::GetSchemaPrefix(const wxString &name) const
+{
+    if (name.IsEmpty())
+        return name;
 
-        if (tk == name)
+    if (name == wxT("pg_catalog") || name == defaultSchema)
             return wxEmptyString;
-    }
+
     return name + wxT(".");
 }
 
@@ -318,6 +340,9 @@
             properties->AppendItem(_("Tablespace"), GetTablespace());
         properties->AppendItem(_("Encoding"), GetEncoding());
 
+        if (!defaultSchema.IsEmpty())
+            properties->AppendItem(_("Default schema"), defaultSchema);
+
         size_t i;
         for (i=0 ; i < variables.GetCount() ; i++)
         {
@@ -358,6 +383,9 @@
             }
         }
     }
+
+    UpdateDefaultSchema();
+
     return this;
 }
 
Index: pgDatatype.cpp
===================================================================
RCS file: /projects/pgadmin3/src/schema/pgDatatype.cpp,v
retrieving revision 1.11
retrieving revision 1.12
diff -Lsrc/schema/pgDatatype.cpp -Lsrc/schema/pgDatatype.cpp -u -w -r1.11 -r1.12
--- src/schema/pgDatatype.cpp
+++ src/schema/pgDatatype.cpp
@@ -20,8 +20,11 @@
 #include "pgDefs.h"
 
 
-pgDatatype::pgDatatype(const wxString &typname, long numdims, long typmod)
+pgDatatype::pgDatatype(const wxString &nsp, const wxString &typname, bool isDup, long 
numdims, long typmod)
 {
+    needSchema = isDup;
+    schema = nsp;
+
     if (typname.StartsWith(wxT("_")))
     {
         if (!numdims)
@@ -69,6 +72,28 @@
 }
 
 
+
+wxString pgDatatype::GetSchemaPrefix(pgDatabase *db) const
+{
+    if (schema.IsEmpty())
+        return schema;
+
+    if (needSchema)
+        return schema + wxT(".");
+
+    return db->GetSchemaPrefix(schema);
+}
+
+
+wxString pgDatatype::GetQuotedSchemaPrefix(pgDatabase *db) const
+{
+    wxString str=GetSchemaPrefix(db);
+    if (!str.IsEmpty())
+        return qtIdent(str.Left(str.Length()-1)) + wxT(".");
+    return str;
+}
+
+
 long pgDatatype::GetTypmod(const wxString &name, const wxString &len, const wxString 
&prec)
 {
     if (len.IsEmpty())
@@ -112,7 +137,8 @@
 {
     database=db;
     set=db->GetConnection()->ExecuteSet(
-        wxT("SELECT typname, CASE WHEN typelem > 0 THEN typelem ELSE t.oid END as 
elemoid, typlen, typtype, t.oid, nspname\n")
+        wxT("SELECT typname, CASE WHEN typelem > 0 THEN typelem ELSE t.oid END as 
elemoid, typlen, typtype, t.oid, nspname,\n")
+        wxT("       (SELECT COUNT(1) FROM pg_type t2 WHERE t2.typname = t.typname) > 
1 AS isdup\n")
         wxT("  FROM pg_type t\n")
         wxT("  JOIN pg_namespace nsp ON typnamespace=nsp.oid\n")
         wxT(" WHERE ") + condition + wxT("\n")
@@ -167,7 +193,7 @@
 
 pgDatatype DatatypeReader::GetDatatype() const
 {
-    return pgDatatype(set->GetVal(wxT("typname")));
+    return pgDatatype(set->GetVal(wxT("nspname")), set->GetVal(wxT("typname")), 
set->GetBool(wxT("isdup")));
 }
 
 
@@ -185,12 +211,18 @@
 
 wxString DatatypeReader::GetSchemaPrefix() const
 {
+    if (set->GetBool(wxT("isdup")))
+        return set->GetVal(wxT("nspname")) + wxT(".");
+    else
     return database->GetSchemaPrefix(set->GetVal(wxT("nspname")));
 }
 
 
 wxString DatatypeReader::GetQuotedSchemaPrefix() const
 {
+    if (set->GetBool(wxT("isdup")))
+        return qtIdent(set->GetVal(wxT("nspname"))) + wxT(".");
+    else
     return database->GetQuotedSchemaPrefix(set->GetVal(wxT("nspname")));
 }
 
Index: dlgForeignKey.cpp
===================================================================
RCS file: /projects/pgadmin3/src/ui/dlgForeignKey.cpp,v
retrieving revision 1.24
retrieving revision 1.25
diff -Lsrc/ui/dlgForeignKey.cpp -Lsrc/ui/dlgForeignKey.cpp -u -w -r1.24 -r1.25
--- src/ui/dlgForeignKey.cpp
+++ src/ui/dlgForeignKey.cpp
@@ -190,7 +190,7 @@
     cbRefColumns->Clear();
 
     wxString tab=cbReferences->GetValue();
-    wxString nsp=wxT("public");
+    wxString nsp;
     if (tab.Find('.') >= 0)
     {
         nsp=tab.BeforeFirst('.');
Index: dlgFunction.cpp
===================================================================
RCS file: /projects/pgadmin3/src/ui/dlgFunction.cpp,v
retrieving revision 1.37
retrieving revision 1.38
diff -Lsrc/ui/dlgFunction.cpp -Lsrc/ui/dlgFunction.cpp -u -w -r1.37 -r1.38
--- src/ui/dlgFunction.cpp
+++ src/ui/dlgFunction.cpp
@@ -483,12 +483,12 @@
     name = schema->GetQuotedPrefix() + qtIdent(name) 
          + wxT("(") + GetArgs(false, true) + wxT(")");
 
-    sql  += schema->GetQuotedPrefix() + qtIdent(GetName()) 
-         + wxT("(") + GetArgs(true, true) + wxT(")");
 
     if (didChange)
     {
-        sql += wxT(" RETURNS ");
+        sql  += schema->GetQuotedPrefix() + qtIdent(GetName()) 
+             + wxT("(") + GetArgs(true, true) + wxT(")")
+               wxT(" RETURNS ");
         if (chkSetof->GetValue())
             sql += wxT("SETOF ");
         sql += cbReturntype->GetValue()
---------------------------(end of broadcast)---------------------------
TIP 5: Have you checked our extensive FAQ?

               http://www.postgresql.org/docs/faqs/FAQ.html

Reply via email to