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 @@
+ - 2004-01-27 AP Reworked schema prefixing
- 2004-01-25 AP support of pg_xxx_size if available
- 2004-01-21 AP Improved disconnect handling
- 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()