Index: pgadmin/include/schema/gpPartition.h =================================================================== --- pgadmin/include/schema/gpPartition.h (revision 7826) +++ pgadmin/include/schema/gpPartition.h (working copy) @@ -38,6 +38,11 @@ wxMenu * GetNewMenu(); wxString GetSql(ctlTree *browser); pgObject *Refresh(ctlTree *browser, const wxTreeItemId item); + wxString GetPartitionName() { return partitionname; } + void iSetPartitionName(const wxString& pn) { partitionname = pn; } + +private: + wxString partitionname; }; Index: pgadmin/frm/frmStatus.cpp =================================================================== --- pgadmin/frm/frmStatus.cpp (revision 7826) +++ pgadmin/frm/frmStatus.cpp (working copy) @@ -602,8 +602,14 @@ logFmtPos=logFormat.Find('%', true); if (logFmtPos < 0) + logFormatKnown = true; // log_line_prefix not specified. + else if (!logFmtPos && logFormat.Mid(logFmtPos, 2) == wxT("%t") && logFormat.Length() > 2) // Timestamp at end of log_line_prefix? + { logFormatKnown = true; - else if (!logFmtPos && logFormat.Mid(logFmtPos, 2) == wxT("%t") && logFormat.Length() > 2) + logHasTimestamp = true; + logList->AddColumn(_("Timestamp"), 100); + } + else if (connection->GetIsGreenplum()) { logFormatKnown = true; logHasTimestamp = true; @@ -1495,26 +1501,82 @@ logList->AppendItem(-1, str); else { - if (str.Find(':') < 0) + if (connection->GetIsGreenplum() && connection->BackendMinimumVersion(8, 2, 13)) { - logList->InsertItem(row, wxEmptyString, -1); - logList->SetItem(row, (logHasTimestamp ? 2 : 1), str); + // Greenplum 3.3 release and later: log is in CSV format + + if (!formatted) + { + logList->InsertItem(row, wxEmptyString, -1); + logList->SetItem(row, 1, str.BeforeFirst(':')); + logList->SetItem(row, 2, str.AfterFirst(':').Mid(2)); + } + else + { + wxString ts = str.BeforeFirst(','); + if (ts.Length() < 20 || ts[0] != wxT('2') || ts[1] != wxT('0')) + { + // Log line not a timestamp... Must be a continuation of the previous line. + logList->InsertItem(row, wxEmptyString, -1); + logList->SetItem(row, 2, str); + } + else + { + logList->InsertItem(row, ts, -1); // Insert timestamp + // Find loglevel... This needs work. Better than nothing for beta 3. + wxString loglevel = str.AfterFirst('\"').BeforeFirst('\"'); + if (str.Find(wxT(",\"LOG\",")) > 0) + loglevel = wxT("LOG"); + if (str.Find(wxT(",\"NOTICE\",")) > 0) + loglevel = wxT("NOTICE"); + if (str.Find(wxT(",\"WARNING\",")) > 0) + loglevel = wxT("WARNING"); + if (str.Find(wxT(",\"ERROR\",")) > 0) + loglevel = wxT("ERROR"); + if (str.Find(wxT(",\"FATAL\",")) > 0) + loglevel = wxT("FATAL"); + if (str.Find(wxT(",\"PANIC\",")) > 0) + loglevel = wxT("PANIC"); + if (str.Find(wxT(",\"DEBUG")) > 0) + loglevel = wxT("DEBUG"); + if (loglevel[0] >= wxT('D') && loglevel[0] <= wxT('W')) + { + logList->SetItem(row, 1, loglevel); + logList->SetItem(row, 2, str.AfterFirst(',')); + } + else + logList->SetItem(row, 2, str.AfterFirst(',')); + } + } } - else + else if (connection->GetIsGreenplum()) { - wxString rest; + // Greenplum 3.2 and before. - if (logHasTimestamp) + if (str.Find(':') < 0) { + // Must be a continuation of a previous line. + logList->InsertItem(row, wxEmptyString, -1); + logList->SetItem(row, 2, str); + } + else + { + wxString rest; if (formatted) { - rest = str.Mid(logFmtPos + 22).AfterFirst(':'); - wxString ts=str.Mid(logFmtPos, str.Length()-rest.Length() - logFmtPos -1); - - int pos = ts.Find(logFormat.c_str()[logFmtPos+2], true); - logList->InsertItem(row, ts.Left(pos), -1); - logList->SetItem(row, 1, ts.Mid(pos + logFormat.Length() - logFmtPos -2)); - logList->SetItem(row, 2, rest.Mid(2)); + wxString ts = str.BeforeFirst(logFormat.c_str()[logFmtPos+2]); + if (ts.Length() < 20 || ts.Left(2) != wxT("20") || str.Find(':') < 0) + { + // No Timestamp? Must be a continuation of a previous line. + logList->InsertItem(row, wxEmptyString, -1); + logList->SetItem(row, 2, str); + } + else + { + logList->InsertItem(row, ts, -1); + rest = str.Mid(logFmtPos + ts.Length()).AfterFirst(':'); + logList->SetItem(row, 2, rest); + } } else { @@ -1523,21 +1585,56 @@ logList->SetItem(row, 2, str.AfterFirst(':').Mid(2)); } } + + } + else + { + // All Non-GPDB PostgreSQL systems. + + if (str.Find(':') < 0) + { + logList->InsertItem(row, wxEmptyString, -1); + logList->SetItem(row, (logHasTimestamp ? 2 : 1), str); + } else { - if (formatted) - rest = str.Mid(logFormat.Length()); - else - rest = str; + wxString rest; - int pos = rest.Find(':'); + if (logHasTimestamp) + { + if (formatted) + { + rest = str.Mid(logFmtPos + 22).AfterFirst(':'); + wxString ts=str.Mid(logFmtPos, str.Length()-rest.Length() - logFmtPos -1); - if (pos < 0) - logList->InsertItem(row, rest, -1); + int pos = ts.Find(logFormat.c_str()[logFmtPos+2], true); + logList->InsertItem(row, ts.Left(pos), -1); + logList->SetItem(row, 1, ts.Mid(pos + logFormat.Length() - logFmtPos -2)); + logList->SetItem(row, 2, rest.Mid(2)); + } + else + { + logList->InsertItem(row, wxEmptyString, -1); + logList->SetItem(row, 1, str.BeforeFirst(':')); + logList->SetItem(row, 2, str.AfterFirst(':').Mid(2)); + } + } else { - logList->InsertItem(row, rest.BeforeFirst(':'), -1); - logList->SetItem(row, 1, rest.AfterFirst(':').Mid(2)); + if (formatted) + rest = str.Mid(logFormat.Length()); + else + rest = str; + + int pos = rest.Find(':'); + + if (pos < 0) + logList->InsertItem(row, rest, -1); + else + { + logList->InsertItem(row, rest.BeforeFirst(':'), -1); + logList->SetItem(row, 1, rest.AfterFirst(':').Mid(2)); + } } } } Index: pgadmin/schema/gpPartition.cpp =================================================================== --- pgadmin/schema/gpPartition.cpp (revision 7826) +++ pgadmin/schema/gpPartition.cpp (working copy) @@ -109,7 +109,7 @@ pgSet *tables; query= wxT("SELECT rel.oid, relname, rel.reltablespace AS spcoid, spcname, pg_get_userbyid(relowner) AS relowner, relacl, relhasoids, ") - wxT("relhassubclass, reltuples, description, conname, conkey,\n") + wxT("relhassubclass, reltuples, description, conname, conkey, parname, \n") wxT(" EXISTS(select 1 FROM pg_trigger\n") wxT(" JOIN pg_proc pt ON pt.oid=tgfoid AND pt.proname='logtrigger'\n") wxT(" JOIN pg_proc pc ON pc.pronamespace=pt.pronamespace AND pc.proname='slonyversion'\n") @@ -129,11 +129,13 @@ query += wxT(" FROM pg_class rel JOIN pg_partition_rule pr ON(rel.oid = pr.parchildrelid) JOIN pg_partition p ON (pr.paroid = p.oid)\n") + wxT(" JOIN pg_inherits i ON (rel.oid = i.inhrelid) \n") wxT(" LEFT OUTER JOIN pg_tablespace ta on ta.oid=rel.reltablespace\n") wxT(" LEFT OUTER JOIN pg_description des ON (des.objoid=rel.oid AND des.objsubid=0)\n") wxT(" LEFT OUTER JOIN pg_constraint c ON c.conrelid=rel.oid AND c.contype='p'\n"); query += wxT(" LEFT OUTER JOIN gp_distribution_policy gpd ON gpd.localoid=rel.oid\n"); - query += wxT(" WHERE relkind = 'r' AND p.parrelid = ") + collection->GetOidStr() + wxT("\n"); + query += wxT(" WHERE relkind = 'r' "); + query += wxT(" AND i.inhparent = ") + collection->GetOidStr() + wxT("\n"); query += restriction + wxT(" ORDER BY relname"); @@ -167,6 +169,7 @@ table->iSetFillFactor(tables->GetVal(wxT("fillfactor"))); table->iSetHasSubclass(tables->GetBool(wxT("relhassubclass"))); + table->iSetPartitionName(tables->GetVal(wxT("parname"))); table->iSetPrimaryKeyName(tables->GetVal(wxT("conname"))); table->iSetIsReplicated(tables->GetBool(wxT("isrepl"))); wxString cn=tables->GetVal(wxT("conkey"));