Log Message: ----------- support of pg_xxx_size if available Modified Files: -------------- pgadmin3: CHANGELOG.txt (r1.117 -> r1.118) pgadmin3/src/db: pgConn.cpp (r1.49 -> r1.50) pgadmin3/src/include: pgConn.h (r1.25 -> r1.26) pgIndex.h (r1.23 -> r1.24) pgTablespace.h (r1.2 -> r1.3) pgadmin3/src/schema: pgCollection.cpp (r1.34 -> r1.35) pgDatabase.cpp (r1.59 -> r1.60) pgIndex.cpp (r1.32 -> r1.33) pgObject.cpp (r1.71 -> r1.72) pgTable.cpp (r1.54 -> r1.55) pgTablespace.cpp (r1.6 -> r1.7) pgadmin3/src/ui: frmStatus.cpp (r1.34 -> r1.35)
Added Files: ----------- pgadmin3/src/include: features.h (r1.1)
Index: CHANGELOG.txt =================================================================== RCS file: /projects/pgadmin3/CHANGELOG.txt,v retrieving revision 1.117 retrieving revision 1.118 diff -LCHANGELOG.txt -LCHANGELOG.txt -u -w -r1.117 -r1.118 --- CHANGELOG.txt +++ CHANGELOG.txt @@ -16,6 +16,7 @@ </ul> <br> <ul> + <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 <li>2004-01-21 AP Update ServerStatus to pg_logdir_ls Index: pgConn.cpp =================================================================== RCS file: /projects/pgadmin3/src/db/pgConn.cpp,v retrieving revision 1.49 retrieving revision 1.50 diff -Lsrc/db/pgConn.cpp -Lsrc/db/pgConn.cpp -u -w -r1.49 -r1.50 --- src/db/pgConn.cpp +++ src/db/pgConn.cpp @@ -16,6 +16,7 @@ // PostgreSQL headers #include <libpq-fe.h> +#include "features.h" // Network headers #ifdef __WXMSW__ @@ -426,3 +427,31 @@ } return majorVersion > major || (majorVersion == major && minorVersion >= minor); } + + +bool pgConn::HasFeature(int featureNo) +{ + if (!features[FEATURE_INITIALIZED]) + { + features[FEATURE_INITIALIZED] = true; + + features[FEATURE_SIZE] = + !ExecuteScalar( + wxT("SELECT proname FROM pg_proc\n") + wxT(" WHERE proname = 'pg_tablespace_size'") + wxT( " AND proargtypes[0] = 26")) + .IsEmpty(); + features[FEATURE_FILEREAD] = + !ExecuteScalar( + wxT("SELECT proname FROM pg_proc\n") + wxT(" WHERE proname = 'pg_file_read'") + wxT( " AND proargtypes[0] = 25") + wxT( " AND proargtypes[1] = 20") + wxT( " AND proargtypes[2] = 20")) + .IsEmpty(); + } + + if (featureNo < 1 ||featureNo >= FEATURE_LAST) + return false; + return features[featureNo]; +} \ No newline at end of file Index: pgTablespace.h =================================================================== RCS file: /projects/pgadmin3/src/include/pgTablespace.h,v retrieving revision 1.2 retrieving revision 1.3 diff -Lsrc/include/pgTablespace.h -Lsrc/include/pgTablespace.h -u -w -r1.2 -r1.3 --- src/include/pgTablespace.h +++ src/include/pgTablespace.h @@ -22,8 +22,10 @@ int GetIcon() { return PGICON_TABLESPACE; } 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 ShowStatistics(frmMain *form, ctlListView *statistics); void ShowReferencedBy(frmMain *form, ctlListView *referencedBy, const wxString &where=wxEmptyString); + static pgObject *ReadObjects(pgCollection *collection, wxTreeCtrl *browser, const wxString &restriction=wxT("")); + static void ShowStatistics(pgCollection *collection, ctlListView *statistics); wxString GetLocation() const { return location; }; void iSetLocation(const wxString& newVal) { location = newVal; } Index: pgIndex.h =================================================================== RCS file: /projects/pgadmin3/src/include/pgIndex.h,v retrieving revision 1.23 retrieving revision 1.24 diff -Lsrc/include/pgIndex.h -Lsrc/include/pgIndex.h -u -w -r1.23 -r1.24 --- src/include/pgIndex.h +++ src/include/pgIndex.h @@ -31,6 +31,7 @@ int GetIcon() { return PGICON_INDEX; } void ShowTreeDetail(wxTreeCtrl *browser, frmMain *form=0, ctlListView *properties=0, ctlSQLBox *sqlPane=0); + void ShowStatistics(frmMain *form, ctlListView *statistics); static pgObject *ReadObjects(pgCollection *collection, wxTreeCtrl *browser, const wxString &restriction); static pgObject *ReadObjects(pgCollection *collection, wxTreeCtrl *browser); --- /dev/null +++ src/include/features.h @@ -0,0 +1,18 @@ +////////////////////////////////////////////////////////////////////////// +// +// pgAdmin III - PostgreSQL Tools +// RCS-ID: $Id: features.h,v 1.1 2004/07/25 20:33:51 andreas Exp $ +// Copyright (C) 2002 - 2004, The pgAdmin Development Team +// This software is released under the Artistic Licence +// +// features.h PostgreSQL features constants +// +////////////////////////////////////////////////////////////////////////// + +enum +{ + FEATURE_INITIALIZED=0, + FEATURE_SIZE, + FEATURE_FILEREAD, + FEATURE_LAST +}; Index: pgConn.h =================================================================== RCS file: /projects/pgadmin3/src/include/pgConn.h,v retrieving revision 1.25 retrieving revision 1.26 diff -Lsrc/include/pgConn.h -Lsrc/include/pgConn.h -u -w -r1.25 -r1.26 --- src/include/pgConn.h +++ src/include/pgConn.h @@ -55,6 +55,7 @@ void Close(); bool HasPrivilege(const wxString &objTyp, const wxString &objName, const wxString &priv); + bool HasFeature(int feature=0); bool ExecuteVoid(const wxString& sql); wxString ExecuteScalar(const wxString& sql); pgSet *ExecuteSet(const wxString& sql); @@ -86,6 +87,8 @@ private: PGconn *conn; int lastResultStatus; + bool features[32]; + int connStatus; int minorVersion, majorVersion; wxMBConv *conv; Index: pgObject.cpp =================================================================== RCS file: /projects/pgadmin3/src/schema/pgObject.cpp,v retrieving revision 1.71 retrieving revision 1.72 diff -Lsrc/schema/pgObject.cpp -Lsrc/schema/pgObject.cpp -u -w -r1.71 -r1.72 --- src/schema/pgObject.cpp +++ src/schema/pgObject.cpp @@ -820,10 +820,12 @@ if (stats) { - int col=0; - while (col++ < stats->NumCols()) + int col; + for (col=0 ; col < stats->NumCols() ; col++) + { if (!stats->ColName(col).IsEmpty()) statistics->AppendItem(stats->ColName(col), stats->GetVal(col)); + } delete stats; } } Index: pgTablespace.cpp =================================================================== RCS file: /projects/pgadmin3/src/schema/pgTablespace.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -Lsrc/schema/pgTablespace.cpp -Lsrc/schema/pgTablespace.cpp -u -w -r1.6 -r1.7 --- src/schema/pgTablespace.cpp +++ src/schema/pgTablespace.cpp @@ -16,6 +16,7 @@ // App headers #include "pgAdmin3.h" #include "misc.h" +#include "features.h" #include "pgObject.h" #include "pgTablespace.h" #include "pgCollection.h" @@ -140,6 +141,34 @@ } +void pgTablespace::ShowStatistics(frmMain *form, ctlListView *statistics) +{ + if (statistics) + { + if (GetConnection()->HasFeature(FEATURE_SIZE)) + { + wxLogInfo(wxT("Displaying statistics for %s"), GetTypeName().c_str()); + + // Add the statistics view columns + CreateListColumns(statistics, _("Statistic"), _("Value")); + + pgSet *stats = GetConnection()->ExecuteSet( + wxT("SELECT pg_size_pretty(pg_tablespace_size(") + GetOidStr() + wxT(")) AS ") + qtIdent(_("Tablespace Size"))); + + if (stats) + { + int col; + for (col=0 ; col < stats->NumCols() ; col++) + { + if (!stats->ColName(col).IsEmpty()) + statistics->AppendItem(stats->ColName(col), stats->GetVal(col)); + } + delete stats; + } + } + } +} + pgObject *pgTablespace::Refresh(wxTreeCtrl *browser, const wxTreeItemId item) { @@ -193,3 +222,35 @@ } return tablespace; } + + +void pgTablespace::ShowStatistics(pgCollection *collection, ctlListView *statistics) +{ + if (collection->GetConnection()->HasFeature(FEATURE_SIZE)) + { + wxLogInfo(wxT("Displaying statistics for tablespaces")); + + // Add the statistics view columns + statistics->ClearAll(); + statistics->AddColumn(_("Tablespace"), 100); + statistics->AddColumn(_("Size"), 60); + + pgSet *stats = collection->GetConnection()->ExecuteSet( + wxT("SELECT spcname, pg_size_pretty(pg_tablespace_size(oid)) AS size FROM pg_tablespace ORDER BY spcname")); + + if (stats) + { + long pos=0; + while (!stats->Eof()) + { + statistics->InsertItem(pos, stats->GetVal(wxT("spcname")), PGICON_STATISTICS); + statistics->SetItem(pos, 1, stats->GetVal(wxT("size"))); + stats->MoveNext(); + pos++; + } + + delete stats; + } + } +} + Index: pgCollection.cpp =================================================================== RCS file: /projects/pgadmin3/src/schema/pgCollection.cpp,v retrieving revision 1.34 retrieving revision 1.35 diff -Lsrc/schema/pgCollection.cpp -Lsrc/schema/pgCollection.cpp -u -w -r1.34 -r1.35 --- src/schema/pgCollection.cpp +++ src/schema/pgCollection.cpp @@ -298,6 +298,9 @@ case PG_TABLES: pgTable::ShowStatistics(this, statistics); break; + case PG_TABLESPACES: + pgTablespace::ShowStatistics(this, statistics); + break; default: break; } Index: pgDatabase.cpp =================================================================== RCS file: /projects/pgadmin3/src/schema/pgDatabase.cpp,v retrieving revision 1.59 retrieving revision 1.60 diff -Lsrc/schema/pgDatabase.cpp -Lsrc/schema/pgDatabase.cpp -u -w -r1.59 -r1.60 --- src/schema/pgDatabase.cpp +++ src/schema/pgDatabase.cpp @@ -15,6 +15,7 @@ // App headers #include "pgAdmin3.h" #include "misc.h" +#include "features.h" #include "pgDatabase.h" #include "pgObject.h" #include "pgServer.h" @@ -429,6 +430,15 @@ { wxLogInfo(wxT("Displaying statistics for databases on ") + collection->GetServer()->GetIdentifier()); + bool hasSize=collection->GetConnection()->HasFeature(FEATURE_SIZE); + + wxString sql=wxT("SELECT datname, numbackends, xact_commit, xact_rollback, blks_read, blks_hit"); + + if (hasSize) + sql += wxT(", pg_size_pretty(pg_database_size(datid)) as size"); + + sql += wxT("\n FROM pg_stat_database db ORDER BY datname"); + // Add the statistics view columns statistics->ClearAll(); statistics->AddColumn(_("Database"), 60); @@ -437,8 +447,10 @@ statistics->AddColumn(_("Xact Rolled Back"), 60); statistics->AddColumn(_("Blocks Read"), 60); statistics->AddColumn(_("Blocks Hit"), 60); + if (hasSize) + statistics->AddColumn(_("Size"), 60); - pgSet *stats = collection->GetServer()->ExecuteSet(wxT("SELECT datname, numbackends, xact_commit, xact_rollback, blks_read, blks_hit FROM pg_stat_database ORDER BY datname")); + pgSet *stats = collection->GetServer()->ExecuteSet(sql); if (stats) { while (!stats->Eof()) @@ -449,6 +461,9 @@ statistics->SetItem(stats->CurrentPos() - 1, 3, stats->GetVal(wxT("xact_rollback"))); statistics->SetItem(stats->CurrentPos() - 1, 4, stats->GetVal(wxT("blks_read"))); statistics->SetItem(stats->CurrentPos() - 1, 5, stats->GetVal(wxT("blks_hit"))); + if (hasSize) + statistics->SetItem(stats->CurrentPos() - 1, 6, stats->GetVal(wxT("size"))); + stats->MoveNext(); } Index: pgTable.cpp =================================================================== RCS file: /projects/pgadmin3/src/schema/pgTable.cpp,v retrieving revision 1.54 retrieving revision 1.55 diff -Lsrc/schema/pgTable.cpp -Lsrc/schema/pgTable.cpp -u -w -r1.54 -r1.55 --- src/schema/pgTable.cpp +++ src/schema/pgTable.cpp @@ -24,6 +24,7 @@ #include "pgForeignKey.h" #include "pgCheck.h" #include "sysSettings.h" +#include "features.h" pgTable::pgTable(pgSchema *newSchema, const wxString& newName) : pgSchemaObject(newSchema, PG_TABLE, newName) @@ -404,7 +405,7 @@ void pgTable::ShowStatistics(frmMain *form, ctlListView *statistics) { - DisplayStatistics(statistics, + wxString sql = wxT("SELECT seq_scan AS ") + qtIdent(_("Sequential Scans")) + wxT(", seq_tup_read AS ") + qtIdent(_("Sequential Tuples Read")) + wxT(", idx_scan AS ") + qtIdent(_("Index Scans")) + @@ -419,10 +420,17 @@ wxT(", toast_blks_read AS ") + qtIdent(_("Toast Blocks Read")) + wxT(", toast_blks_hit AS ") + qtIdent(_("Toast Blocks Hit")) + wxT(", tidx_blks_read AS ") + qtIdent(_("Toast Index Blocks Read")) + - wxT(", tidx_blks_hit AS ") + qtIdent(_("Toast Index Blocks Hit")) + wxT("\n") + wxT(", tidx_blks_hit AS ") + qtIdent(_("Toast Index Blocks Hit")); + + if (GetConnection()->HasFeature(FEATURE_SIZE)) + sql += wxT(", pg_size_pretty(pg_relation_size(stat.relid)) AS ") + qtIdent(_("Table Size")); + + sql += wxT("\n") wxT(" FROM pg_stat_all_tables stat, pg_statio_all_tables statio\n") wxT(" WHERE stat.relid = statio.relid\n") - wxT(" AND stat.relid = ") + GetOidStr()); + wxT(" AND stat.relid = ") + GetOidStr(); + + DisplayStatistics(statistics, sql); } @@ -511,15 +519,24 @@ { wxLogInfo(wxT("Displaying statistics for tables on ")+ collection->GetSchema()->GetIdentifier()); + bool hasSize=collection->GetConnection()->HasFeature(FEATURE_SIZE); + // Add the statistics view columns statistics->ClearAll(); statistics->AddColumn(_("Table"), 100); statistics->AddColumn(_("Tuples inserted"), 50); statistics->AddColumn(_("Tuples updated"), 50); statistics->AddColumn(_("Tuples deleted"), 50); + if (hasSize) + statistics->AddColumn(_("Size"), 60); + + wxString sql=wxT("SELECT relname, n_tup_ins, n_tup_upd, n_tup_del"); + if (hasSize) + sql += wxT(", pg_size_pretty(pg_relation_size(relid)) AS size"); + + sql += wxT("\n FROM pg_stat_all_tables ORDER BY relname"); - pgSet *stats = collection->GetDatabase()->ExecuteSet(wxT( - "SELECT relname, n_tup_ins, n_tup_upd, n_tup_del FROM pg_stat_all_tables ORDER BY relname")); + pgSet *stats = collection->GetDatabase()->ExecuteSet(sql); if (stats) { @@ -530,6 +547,8 @@ statistics->SetItem(pos, 1, stats->GetVal(wxT("n_tup_ins"))); statistics->SetItem(pos, 2, stats->GetVal(wxT("n_tup_upd"))); statistics->SetItem(pos, 3, stats->GetVal(wxT("n_tup_del"))); + if (hasSize) + statistics->SetItem(pos, 4, stats->GetVal(wxT("size"))); stats->MoveNext(); pos++; } Index: pgIndex.cpp =================================================================== RCS file: /projects/pgadmin3/src/schema/pgIndex.cpp,v retrieving revision 1.32 retrieving revision 1.33 diff -Lsrc/schema/pgIndex.cpp -Lsrc/schema/pgIndex.cpp -u -w -r1.32 -r1.33 --- src/schema/pgIndex.cpp +++ src/schema/pgIndex.cpp @@ -15,6 +15,7 @@ // App headers #include "pgAdmin3.h" #include "misc.h" +#include "features.h" #include "pgObject.h" #include "pgIndex.h" #include "pgIndexConstraint.h" @@ -214,6 +215,13 @@ } +void pgIndex::ShowStatistics(frmMain *form, ctlListView *statistics) +{ + if (GetConnection()->HasFeature(FEATURE_SIZE)) + DisplayStatistics(statistics, + wxT("SELECT pg_size_pretty(pg_relation_size(") + GetOidStr() + wxT(")) AS ") + qtIdent(_("Index Size"))); +} + pgObject *pgIndex::Refresh(wxTreeCtrl *browser, const wxTreeItemId item) { Index: frmStatus.cpp =================================================================== RCS file: /projects/pgadmin3/src/ui/frmStatus.cpp,v retrieving revision 1.34 retrieving revision 1.35 diff -Lsrc/ui/frmStatus.cpp -Lsrc/ui/frmStatus.cpp -u -w -r1.34 -r1.35 --- src/ui/frmStatus.cpp +++ src/ui/frmStatus.cpp @@ -19,7 +19,7 @@ // App headers #include "frmStatus.h" - +#include "features.h" // Icons #include "images/pgAdmin3.xpm" @@ -117,7 +117,7 @@ lockList->AddColumn(_("Query"), 500); } - if (connection->BackendMinimumVersion(7, 5)) + if (connection->BackendMinimumVersion(7, 5) && connection->HasFeature(FEATURE_FILEREAD)) { logFormat = connection->ExecuteScalar(wxT("SHOW log_line_prefix")); if (logFormat == wxT("unset"))
---------------------------(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