Log Message:
-----------
display user owned objects
Modified Files:
--------------
pgadmin3/src/include:
pgObject.h (r1.56 -> r1.57)
pgUser.h (r1.20 -> r1.21)
pgadmin3/src/schema:
pgObject.cpp (r1.68 -> r1.69)
pgTablespace.cpp (r1.3 -> r1.4)
pgUser.cpp (r1.33 -> r1.34)
pgadmin3/src/ui:
frmMain.cpp (r1.94 -> r1.95)
Index: pgObject.h
===================================================================
RCS file: /projects/pgadmin3/src/include/pgObject.h,v
retrieving revision 1.56
retrieving revision 1.57
diff -Lsrc/include/pgObject.h -Lsrc/include/pgObject.h -u -w -r1.56 -r1.57
--- src/include/pgObject.h
+++ src/include/pgObject.h
@@ -177,6 +177,8 @@
void iSetServer(pgServer *s) { server=s; }
pgServer *GetServer() { return server; }
+ void FillOwned(wxTreeCtrl *browser, ctlListView *referencedBy, const
wxArrayString &dblist, const wxString &query);
+
bool CanCreate();
bool CanDrop();
bool CanEdit() { return true; }
Index: pgUser.h
===================================================================
RCS file: /projects/pgadmin3/src/include/pgUser.h,v
retrieving revision 1.20
retrieving revision 1.21
diff -Lsrc/include/pgUser.h -Lsrc/include/pgUser.h -u -w -r1.20 -r1.21
--- src/include/pgUser.h
+++ src/include/pgUser.h
@@ -51,6 +51,7 @@
int GetIcon() { return PGICON_USER; }
void ShowTreeDetail(wxTreeCtrl *browser, frmMain *form=0, ctlListView
*properties=0, ctlSQLBox *sqlPane=0);
static pgObject *ReadObjects(pgCollection *collection, wxTreeCtrl *browser, const
wxString &restriction=wxT(""));
+ void ShowReferencedBy(frmMain *form, ctlListView *referencedBy, const wxString
&where);
// virtual methods
wxString GetSql(wxTreeCtrl *browser);
Index: pgObject.cpp
===================================================================
RCS file: /projects/pgadmin3/src/schema/pgObject.cpp,v
retrieving revision 1.68
retrieving revision 1.69
diff -Lsrc/schema/pgObject.cpp -Lsrc/schema/pgObject.cpp -u -w -r1.68 -r1.69
--- src/schema/pgObject.cpp
+++ src/schema/pgObject.cpp
@@ -206,9 +206,11 @@
wxString typestr=set->GetVal(wxT("type"));
int id;
+ bool dontQuote=false;
switch (typestr.c_str()[0])
{
+ case 'c':
case 's': // we don't know these; internally handled
case 't': set->MoveNext(); continue;
@@ -228,7 +230,7 @@
id=PG_RULE;
break;
}
- case 'c':
+ case 'C':
{
switch (typestr.c_str()[1])
{
@@ -304,7 +306,7 @@
wxT(" WHEN pr.oid IS NOT NULL THEN 'p'::text\n")
wxT(" WHEN la.oid IS NOT NULL THEN 'l'::text\n")
wxT(" WHEN rw.oid IS NOT NULL THEN 'R'::text\n")
- wxT(" WHEN co.oid IS NOT NULL THEN 'c'::text || contype\n")
+ wxT(" WHEN co.oid IS NOT NULL THEN 'C'::text || contype\n")
wxT(" ELSE '' END AS type,\n")
wxT(" COALESCE(coc.relname, clrw.relname) AS ownertable,\n")
wxT(" COALESCE(cl.relname, conname, proname, tgname, typname, lanname,
rulename, ns.nspname) AS refname,\n")
@@ -346,7 +348,7 @@
wxT(" WHEN pr.oid IS NOT NULL THEN 'p'::text\n")
wxT(" WHEN la.oid IS NOT NULL THEN 'l'::text\n")
wxT(" WHEN rw.oid IS NOT NULL THEN 'R'::text\n")
- wxT(" WHEN co.oid IS NOT NULL THEN 'c'::text || contype\n")
+ wxT(" WHEN co.oid IS NOT NULL THEN 'C'::text || contype\n")
wxT(" ELSE '' END AS type,\n")
wxT(" COALESCE(coc.relname, clrw.relname) AS ownertable,\n")
wxT(" COALESCE(cl.relname, conname, proname, tgname, typname, lanname,
rulename, ns.nspname) AS refname,\n")
@@ -618,6 +620,114 @@
}
+void pgServerObject::FillOwned(wxTreeCtrl *browser, ctlListView *referencedBy, const
wxArrayString &dblist, const wxString &query)
+{
+ pgCollection *databases;
+
+ wxCookieType cookie;
+ wxTreeItemId item=browser->GetFirstChild(GetServer()->GetId(), cookie);
+ while (item)
+ {
+ databases = (pgCollection*)browser->GetItemData(item);
+ if (databases && databases->GetType() == PG_DATABASES)
+ break;
+ else
+ databases=0;
+
+ item=browser->GetNextChild(GetServer()->GetId(), cookie);
+ }
+
+ size_t i;
+ for (i=0 ; i < dblist.GetCount() ; i++)
+ {
+ wxString dbname=dblist.Item(i);
+ pgConn *conn=0;
+ pgConn *tmpConn=0;
+
+ if (GetServer()->GetDatabaseName() == dbname)
+ conn = GetServer()->GetConnection();
+ else
+ {
+ item=browser->GetFirstChild(databases->GetId(), cookie);
+ while (item)
+ {
+ pgDatabase *db=(pgDatabase*)browser->GetItemData(item);
+ if (db->GetType() == PG_DATABASE && db->GetName() == dbname)
+ {
+ if (db->GetConnected())
+ conn = db->GetConnection();
+ break;
+ }
+ item=browser->GetNextChild(databases->GetId(), cookie);
+ }
+ }
+ if (conn && conn->GetStatus() != PGCONN_OK)
+ conn=0;
+
+ if (!conn)
+ {
+ tmpConn = new pgConn(GetServer()->GetName(), dbname,
GetServer()->GetUsername(),
+ GetServer()->GetPassword(), GetServer()->GetPort(),
GetServer()->GetSSL());
+ if (tmpConn->GetStatus() == PGCONN_OK)
+ conn=tmpConn;
+ }
+
+ if (conn)
+ {
+ pgSet *set=conn->ExecuteSet(query);
+
+ if (set)
+ {
+ while (!set->Eof())
+ {
+ int id=0;
+
+ wxString relname = qtIdent(set->GetVal(wxT("nspname")));
+ if (!relname.IsEmpty())
+ relname += wxT(".");
+ relname += qtIdent(set->GetVal(wxT("relname")));
+
+ switch (set->GetVal(wxT("relkind")).c_str()[0])
+ {
+ case 'r': id=PG_TABLE; break;
+ case 'i': id=PG_INDEX;
+ relname = qtIdent(set->GetVal(wxT("indname"))) +
wxT(" ON ") + relname;
+ break;
+ case 'S': id=PG_SEQUENCE; break;
+ case 'v': id=PG_VIEW; break;
+ case 'c': // composite type handled in PG_TYPE
+ case 's': // special
+ case 't': // toast
+ break;
+ case 'n': id=PG_SCHEMA; break;
+ case 'y': id=PG_TYPE; break;
+ case 'd': id=PG_DOMAIN; break;
+ case 'C': id=PG_CONVERSION; break;
+ case 'p': id=PG_FUNCTION; break;
+ case 'T': id=PG_TRIGGERFUNCTION; break;
+ case 'o': id=PG_OPERATOR;
+ relname = set->GetVal(wxT("relname")); //
unquoted
+ break;
+ }
+
+ if (id)
+ {
+ wxString typname = typesList[id].typName;
+ int icon = typesList[id].typeIcon;
+ referencedBy->AppendItem(icon, typname, dbname, relname);
+ }
+
+ set->MoveNext();
+ }
+ delete set;
+ }
+ }
+
+ if (tmpConn)
+ delete tmpConn;
+ }
+}
+
//////////////////////////////////////////////////////////////
bool pgDatabaseObject::CanDrop()
Index: pgUser.cpp
===================================================================
RCS file: /projects/pgadmin3/src/schema/pgUser.cpp,v
retrieving revision 1.33
retrieving revision 1.34
diff -Lsrc/schema/pgUser.cpp -Lsrc/schema/pgUser.cpp -u -w -r1.33 -r1.34
--- src/schema/pgUser.cpp
+++ src/schema/pgUser.cpp
@@ -18,7 +18,8 @@
#include "pgObject.h"
#include "pgUser.h"
#include "pgCollection.h"
-
+#include "frmMain.h"
+#include "pgDefs.h"
pgUser::pgUser(const wxString& newName)
: pgServerObject(PG_USER, newName)
@@ -82,6 +83,84 @@
}
+
+void pgUser::ShowReferencedBy(frmMain *form, ctlListView *referencedBy, const
wxString &where)
+{
+ form->StartMsg(_(" Retrieving user owned objects"));
+
+ referencedBy->ClearAll();
+ referencedBy->AddColumn(_("Type"), 60);
+ referencedBy->AddColumn(_("Database"), 80);
+ referencedBy->AddColumn(_("Name"), 300);
+
+ wxString uid=NumToStr(GetUserId());
+ wxString sysoid = NumToStr(GetConnection()->GetLastSystemOID());
+
+ wxArrayString dblist;
+
+ pgSet *set=GetConnection()->ExecuteSet(
+ wxT("SELECT 'd' as type, datname, datallowconn, datdba\n")
+ wxT(" FROM pg_database db\n")
+ wxT("UNION\n")
+ wxT("SELECT 'M', spcname, null, null\n")
+ wxT(" FROM pg_tablespace where spcowner=") + uid + wxT("\n")
+ wxT(" ORDER BY 1, 2"));
+
+ if (set)
+ {
+ while (!set->Eof())
+ {
+ wxString name=set->GetVal(wxT("datname"));
+ if (set->GetVal(wxT("type")) == wxT("d"))
+ {
+ if (set->GetBool(wxT("datallowconn")))
+ dblist.Add(name);
+ if (GetUserId() == set->GetLong(wxT("datdba")))
+ referencedBy->AppendItem(PGICON_DATABASE, _("Database"), name);
+ }
+ else
+ referencedBy->AppendItem(PGICON_TABLESPACE, _("Tablespace"),
wxEmptyString, name);
+
+ set->MoveNext();
+ }
+ delete set;
+ }
+
+ FillOwned(form->GetBrowser(), referencedBy, dblist,
+ wxT("SELECT cl.relkind, COALESCE(cin.nspname, cln.nspname) as nspname,
COALESCE(ci.relname, cl.relname) as relname, ci.relname as indname\n")
+ wxT(" FROM pg_class cl\n")
+ wxT(" JOIN pg_namespace cln ON cl.relnamespace=cln.oid\n")
+ wxT(" LEFT OUTER JOIN pg_index ind ON ind.indexrelid=cl.oid\n")
+ wxT(" LEFT OUTER JOIN pg_class ci ON ind.indrelid=ci.oid\n")
+ wxT(" JOIN pg_namespace cin ON ci.relnamespace=cin.oid\n")
+ wxT(" WHERE cl.relowner = ") + uid + wxT(" AND cl.oid > ") + sysoid +
wxT("\n")
+ wxT("UNION ALL\n")
+ wxT("SELECT 'n', null, nspname, null\n")
+ wxT(" FROM pg_namespace nsp WHERE nspowner = ") + uid + wxT(" AND nsp.oid >
") + sysoid + wxT("\n")
+ wxT("UNION ALL\n")
+ wxT("SELECT CASE WHEN typtype='d' THEN 'd' ELSE 'y' END, null, typname,
null\n")
+ wxT(" FROM pg_type ty WHERE typowner = ") + uid + wxT(" AND ty.oid > ") +
sysoid + wxT("\n")
+ wxT("UNION ALL\n")
+ wxT("SELECT 'C', null, conname, null\n")
+ wxT(" FROM pg_conversion co WHERE conowner = ") + uid + wxT(" AND co.oid >
") + sysoid + wxT("\n")
+ wxT("UNION ALL\n")
+ wxT("SELECT CASE WHEN prorettype=") + NumToStr(PGOID_TYPE_TRIGGER) + wxT("
THEN 'T' ELSE 'p' END, null, proname, null\n")
+ wxT(" FROM pg_proc pr WHERE proowner = ") + uid + wxT(" AND pr.oid > ") +
sysoid + wxT("\n")
+ wxT("UNION ALL\n")
+ wxT("SELECT 'o', null, oprname || '('::text || ")
+ wxT("COALESCE(tl.typname, ''::text) || ")
+ wxT("CASE WHEN tl.oid IS NOT NULL AND tr.oid IS NOT NULL THEN
','::text END || ")
+ wxT("COALESCE(tr.typname, ''::text) || ')'::text, null\n")
+ wxT(" FROM pg_operator op\n")
+ wxT(" LEFT JOIN pg_type tl ON tl.oid=op.oprleft\n")
+ wxT(" LEFT JOIN pg_type tr ON tr.oid=op.oprright\n")
+ wxT(" WHERE oprowner = ") + uid + wxT(" AND op.oid > ") + sysoid + wxT("\n")
+ wxT(" ORDER BY 1,2,3"));
+
+ form->EndMsg();
+}
+
+
void pgUser::ShowTreeDetail(wxTreeCtrl *browser, frmMain *form, ctlListView
*properties, ctlSQLBox *sqlPane)
{
if (!expandedKids)
Index: pgTablespace.cpp
===================================================================
RCS file: /projects/pgadmin3/src/schema/pgTablespace.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -Lsrc/schema/pgTablespace.cpp -Lsrc/schema/pgTablespace.cpp -u -w -r1.3 -r1.4
--- src/schema/pgTablespace.cpp
+++ src/schema/pgTablespace.cpp
@@ -36,6 +36,8 @@
void pgTablespace::ShowReferencedBy(frmMain *form, ctlListView *referencedBy, const
wxString &where)
{
+ form->StartMsg(_(" Retrieving tablespace usage"));
+
referencedBy->ClearAll();
referencedBy->AddColumn(_("Type"), 60);
referencedBy->AddColumn(_("Database"), 80);
@@ -44,7 +46,6 @@
OID stdOid;
wxString tsoid=GetOidStr();
- form->StartMsg(_(" Retrieving tablespace usage"));
if (GetName() == wxT("default"))
{
stdOid=0;
@@ -76,59 +77,7 @@
delete set;
}
- pgCollection *databases;
-
- wxCookieType cookie;
- wxTreeItemId item=form->GetBrowser()->GetFirstChild(GetServer()->GetId(), cookie);
- while (item)
- {
- databases = (pgCollection*)form->GetBrowser()->GetItemData(item);
- if (databases && databases->GetType() == PG_DATABASES)
- break;
- else
- databases=0;
-
- item=form->GetBrowser()->GetNextChild(GetServer()->GetId(), cookie);
- }
-
- size_t i;
- for (i=0 ; i < dblist.GetCount() ; i++)
- {
- wxString dbname=dblist.Item(i);
- pgConn *conn=0;
- pgConn *tmpConn=0;
-
- if (GetServer()->GetDatabaseName() == dbname)
- conn = GetServer()->GetConnection();
- else
- {
- item=form->GetBrowser()->GetFirstChild(databases->GetId(), cookie);
- while (item)
- {
- pgDatabase *db=(pgDatabase*)form->GetBrowser()->GetItemData(item);
- if (db->GetType() == PG_DATABASE && db->GetName() == dbname)
- {
- if (db->GetConnected())
- conn = db->GetConnection();
- break;
- }
- item=form->GetBrowser()->GetNextChild(databases->GetId(), cookie);
- }
- }
- if (conn && conn->GetStatus() != PGCONN_OK)
- conn=0;
-
- if (!conn)
- {
- tmpConn = new pgConn(GetServer()->GetName(), dbname,
GetServer()->GetUsername(),
- GetServer()->GetPassword(), GetServer()->GetPort(),
GetServer()->GetSSL());
- if (tmpConn->GetStatus() == PGCONN_OK)
- conn=tmpConn;
- }
-
- if (conn)
- {
- set=conn->ExecuteSet(
+ FillOwned(form->GetBrowser(), referencedBy, dblist,
wxT("SELECT cl.relkind, COALESCE(cin.nspname, cln.nspname) as
nspname, COALESCE(ci.relname, cl.relname) as relname, ci.relname as indname\n")
wxT(" FROM pg_class cl\n")
wxT(" JOIN pg_namespace cln ON cl.relnamespace=cln.oid\n")
@@ -141,43 +90,6 @@
wxT(" FROM pg_namespace WHERE nsptablespace IN (") + tsoid +
wxT(")\n")
wxT(" ORDER BY 1,2,3"));
- if (set)
- {
- while (!set->Eof())
- {
- int id=0;
-
- wxString relname = qtIdent(set->GetVal(wxT("nspname")));
- if (!relname.IsEmpty())
- relname += wxT(".");
- relname += qtIdent(set->GetVal(wxT("relname")));
-
- switch (set->GetVal(wxT("relkind")).c_str()[0])
- {
- case 'r': id=PG_TABLE; break;
- case 's': id=PG_SEQUENCE; break;
- case 'n': id=PG_SCHEMA; break;
- case 'i': id=PG_INDEX;
- relname = qtIdent(set->GetVal(wxT("indname"))) +
wxT(" ON ") + relname;
- break;
- }
-
- if (id)
- {
- wxString typname = typesList[id].typName;
- int icon = typesList[id].typeIcon;
- referencedBy->AppendItem(icon, typname, dbname, relname);
- }
-
- set->MoveNext();
- }
- delete set;
- }
- }
-
- if (tmpConn)
- delete tmpConn;
- }
form->EndMsg();
}
@@ -251,8 +163,7 @@
pgSet *tablespaces = collection->GetServer()->ExecuteSet(
- wxT("SELECT ts.oid, spcname, spclocation, usename FROM pg_tablespace ts\n")
- wxT(" JOIN pg_user us ON us.usesysid=ts.spcowner\n")
+ wxT("SELECT ts.oid, spcname, spclocation, pg_get_userbyid(spcowner) as
spcuser FROM pg_tablespace ts\n")
+ restriction + wxT(" ORDER BY spcname"));
if (tablespaces)
@@ -263,7 +174,7 @@
tablespace = new pgTablespace(tablespaces->GetVal(wxT("spcname")));
tablespace->iSetServer(collection->GetServer());
tablespace->iSetOid(tablespaces->GetOid(wxT("oid")));
- tablespace->iSetOwner(tablespaces->GetVal(wxT("usename")));
+ tablespace->iSetOwner(tablespaces->GetVal(wxT("spcuser")));
tablespace->iSetLocation(tablespaces->GetVal(wxT("spclocation")));
Index: frmMain.cpp
===================================================================
RCS file: /projects/pgadmin3/src/ui/frmMain.cpp,v
retrieving revision 1.94
retrieving revision 1.95
diff -Lsrc/ui/frmMain.cpp -Lsrc/ui/frmMain.cpp -u -w -r1.94 -r1.95
--- src/ui/frmMain.cpp
+++ src/ui/frmMain.cpp
@@ -460,14 +460,26 @@
switch (event.GetSelection())
{
case NBP_STATISTICS:
+ {
+ statistics->Freeze();
data->ShowStatistics(this, statistics);
+ statistics->Thaw();
break;
+ }
case NBP_DEPENDSON:
+ {
+ dependsOn->Freeze();
data->ShowDependsOn(this, dependsOn);
+ dependsOn->Thaw();
break;
+ }
case NBP_REFERENCEDBY:
+ {
+ referencedBy->Freeze();
data->ShowReferencedBy(this, referencedBy);
+ referencedBy->Thaw();
break;
+ }
default:
break;
}
---------------------------(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