Index: admin.sql.in =================================================================== RCS file: /projects/pgadmin-tools/support/admin.sql.in,v retrieving revision 1.2 retrieving revision 1.3 diff -Lsupport/admin.sql.in -Lsupport/admin.sql.in -u -w -r1.2 -r1.3 --- support/admin.sql.in +++ support/admin.sql.in @@ -68,6 +68,10 @@ LANGUAGE C STABLE STRICT; */ +CREATE FUNCTION pg_postmaster_starttime() RETURNS timestamp + AS 'MODULE_PATHNAME', 'pg_postmaster_starttime' + LANGUAGE C VOLATILE STRICT; + CREATE FUNCTION pg_logdir_ls() RETURNS setof record AS 'MODULE_PATHNAME', 'pg_logdir_ls' LANGUAGE C VOLATILE STRICT; Index: misc.c =================================================================== RCS file: /projects/pgadmin-tools/support/misc.c,v retrieving revision 1.4 retrieving revision 1.5 diff -Lsupport/misc.c -Lsupport/misc.c -u -w -r1.4 -r1.5 --- support/misc.c +++ support/misc.c @@ -34,11 +34,12 @@ Datum pg_reload_conf(PG_FUNCTION_ARGS); Datum pg_logfile_rotate(PG_FUNCTION_ARGS); Datum pg_logdir_ls(PG_FUNCTION_ARGS); +Datum pg_postmaster_starttime(PG_FUNCTION_ARGS); PG_FUNCTION_INFO_V1(pg_reload_conf); PG_FUNCTION_INFO_V1(pg_logfile_rotate); PG_FUNCTION_INFO_V1(pg_logdir_ls); - +PG_FUNCTION_INFO_V1(pg_postmaster_starttime); Datum pg_reload_conf(PG_FUNCTION_ARGS) { @@ -198,3 +199,48 @@ SRF_RETURN_DONE(funcctx); } + +Datum pg_postmaster_starttime(PG_FUNCTION_ARGS) +{ + Timestamp result; + struct pg_tm tm; + + if (!superuser()) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + (errmsg("only superuser can query the postmaster starttime")))); + +#ifdef WIN32 + { + extern DLLIMPORT HANDLE PostmasterHandle; + FILETIME creationTime; + FILETIME exitTime, kernelTime, userTime; + SYSTEMTIME st; + + bool rc=GetProcessTimes(PostmasterHandle, &creationTime, + &exitTime, &kernelTime, &userTime); + if (!rc) + PG_RETURN_NULL(); + + FileTimeToSystemTime(&creationTime, &st); + + tm.tm_year = st.wYear; + tm.tm_mon = st.wMonth; + tm.tm_mday = st.wDay; + tm.tm_hour = st.wHour; + tm.tm_min = st.wMinute; + tm.tm_sec = st.wSecond; + } +#else + PG_RETURN_NULL(); +#endif + + if (tm2timestamp(&tm, 0, NULL, &result) != 0) + { + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("postmaster timestamp out of range"))); + } + + PG_RETURN_TIMESTAMP(result); +}