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