diff options
Diffstat (limited to 'src/backend/utils')
-rw-r--r-- | src/backend/utils/adt/datetime.c | 38 | ||||
-rw-r--r-- | src/backend/utils/adt/nabstime.c | 91 | ||||
-rw-r--r-- | src/backend/utils/adt/pgstatfuncs.c | 32 | ||||
-rw-r--r-- | src/backend/utils/adt/selfuncs.c | 3 | ||||
-rw-r--r-- | src/backend/utils/adt/timestamp.c | 46 |
5 files changed, 85 insertions, 125 deletions
diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c index 260c8abb341..6ac81b2fa56 100644 --- a/src/backend/utils/adt/datetime.c +++ b/src/backend/utils/adt/datetime.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.150 2005/05/27 21:31:23 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.151 2005/06/29 22:51:56 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -20,6 +20,7 @@ #include <limits.h> #include <math.h> +#include "access/xact.h" #include "miscadmin.h" #include "utils/datetime.h" #include "utils/guc.h" @@ -674,6 +675,41 @@ j2day(int date) } /* j2day() */ +/* + * GetCurrentDateTime() + * + * Get the transaction start time ("now()") broken down as a struct pg_tm. + */ +void +GetCurrentDateTime(struct pg_tm * tm) +{ + int tz; + fsec_t fsec; + + timestamp2tm(GetCurrentTransactionStartTimestamp(), &tz, tm, &fsec, + NULL, NULL); + /* Note: don't pass NULL tzp to timestamp2tm; affects behavior */ +} + +/* + * GetCurrentTimeUsec() + * + * Get the transaction start time ("now()") broken down as a struct pg_tm, + * including fractional seconds and timezone offset. + */ +void +GetCurrentTimeUsec(struct pg_tm * tm, fsec_t *fsec, int *tzp) +{ + int tz; + + timestamp2tm(GetCurrentTransactionStartTimestamp(), &tz, tm, fsec, + NULL, NULL); + /* Note: don't pass NULL tzp to timestamp2tm; affects behavior */ + if (tzp != NULL) + *tzp = tz; +} + + /* TrimTrailingZeros() * ... resulting from printing numbers with full precision. */ diff --git a/src/backend/utils/adt/nabstime.c b/src/backend/utils/adt/nabstime.c index d712d9f8b46..dfbb982521f 100644 --- a/src/backend/utils/adt/nabstime.c +++ b/src/backend/utils/adt/nabstime.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/nabstime.c,v 1.133 2005/06/15 00:34:08 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/nabstime.c,v 1.134 2005/06/29 22:51:56 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -27,7 +27,7 @@ #include "miscadmin.h" #include "pgtime.h" #include "utils/builtins.h" -#include "utils/timestamp.h" +#include "utils/nabstime.h" #define MIN_DAYNUM -24856 /* December 13, 1901 */ #define MAX_DAYNUM 24854 /* January 18, 2038 */ @@ -99,84 +99,6 @@ GetCurrentAbsoluteTime(void) } -/* - * GetCurrentAbsoluteTimeUsec() - * - * Get the current system time (relative to Unix epoch), including fractional - * seconds expressed as microseconds. - */ -AbsoluteTime -GetCurrentAbsoluteTimeUsec(int *usec) -{ - time_t now; - struct timeval tp; - - gettimeofday(&tp, NULL); - now = tp.tv_sec; - *usec = tp.tv_usec; - return (AbsoluteTime) now; -} - - -/* - * AbsoluteTimeUsecToTimestampTz() - * - * Convert system time including microseconds to TimestampTz representation. - */ -TimestampTz -AbsoluteTimeUsecToTimestampTz(AbsoluteTime sec, int usec) -{ - TimestampTz result; - -#ifdef HAVE_INT64_TIMESTAMP - result = ((sec - ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY)) - * USECS_PER_SEC) + usec; -#else - result = sec - ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY) - + (usec / 1000000.0); -#endif - - return result; -} - - -/* - * GetCurrentDateTime() - * - * Get the transaction start time ("now()") broken down as a struct pg_tm. - */ -void -GetCurrentDateTime(struct pg_tm * tm) -{ - int tz; - - abstime2tm(GetCurrentTransactionStartTime(), &tz, tm, NULL); -} - -/* - * GetCurrentTimeUsec() - * - * Get the transaction start time ("now()") broken down as a struct pg_tm, - * including fractional seconds and timezone offset. - */ -void -GetCurrentTimeUsec(struct pg_tm * tm, fsec_t *fsec, int *tzp) -{ - int tz; - int usec; - - abstime2tm(GetCurrentTransactionStartTimeUsec(&usec), &tz, tm, NULL); - /* Note: don't pass NULL tzp to abstime2tm; affects behavior */ - if (tzp != NULL) - *tzp = tz; -#ifdef HAVE_INT64_TIMESTAMP - *fsec = usec; -#else - *fsec = usec / 1000000.0; -#endif -} - - void abstime2tm(AbsoluteTime _time, int *tzp, struct pg_tm * tm, char **tzn) { @@ -458,15 +380,6 @@ abstime_cmp_internal(AbsoluteTime a, AbsoluteTime b) if (b == INVALID_ABSTIME) return -1; /* non-INVALID < INVALID */ -#if 0 - /* CURRENT is no longer stored internally... */ - /* XXX this is broken, should go away: */ - if (a == CURRENT_ABSTIME) - a = GetCurrentTransactionStartTime(); - if (b == CURRENT_ABSTIME) - b = GetCurrentTransactionStartTime(); -#endif - if (a > b) return 1; else if (a == b) diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index 870513fb9d5..b1bd11c9c20 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/pgstatfuncs.c,v 1.23 2005/06/28 05:09:00 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/pgstatfuncs.c,v 1.24 2005/06/29 22:51:56 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -341,13 +341,9 @@ pg_stat_get_backend_activity(PG_FUNCTION_ARGS) Datum pg_stat_get_backend_activity_start(PG_FUNCTION_ARGS) { - PgStat_StatBeEntry *beentry; - int32 beid; - AbsoluteTime sec; - int usec; + int32 beid = PG_GETARG_INT32(0); TimestampTz result; - - beid = PG_GETARG_INT32(0); + PgStat_StatBeEntry *beentry; if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL) PG_RETURN_NULL(); @@ -355,31 +351,24 @@ pg_stat_get_backend_activity_start(PG_FUNCTION_ARGS) if (!superuser() && beentry->userid != GetUserId()) PG_RETURN_NULL(); - sec = beentry->activity_start_sec; - usec = beentry->activity_start_usec; + result = beentry->activity_start_timestamp; /* * No time recorded for start of current query -- this is the case if * the user hasn't enabled query-level stats collection. */ - if (sec == 0 && usec == 0) + if (result == 0) PG_RETURN_NULL(); - result = AbsoluteTimeUsecToTimestampTz(sec, usec); - PG_RETURN_TIMESTAMPTZ(result); } Datum pg_stat_get_backend_start(PG_FUNCTION_ARGS) { - PgStat_StatBeEntry *beentry; - int32 beid; - AbsoluteTime sec; - int usec; + int32 beid = PG_GETARG_INT32(0); TimestampTz result; - - beid = PG_GETARG_INT32(0); + PgStat_StatBeEntry *beentry; if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL) PG_RETURN_NULL(); @@ -387,14 +376,11 @@ pg_stat_get_backend_start(PG_FUNCTION_ARGS) if (!superuser() && beentry->userid != GetUserId()) PG_RETURN_NULL(); - sec = beentry->start_sec; - usec = beentry->start_usec; + result = beentry->start_timestamp; - if (sec == 0 && usec == 0) + if (result == 0) /* probably can't happen? */ PG_RETURN_NULL(); - result = AbsoluteTimeUsecToTimestampTz(sec, usec); - PG_RETURN_TIMESTAMPTZ(result); } diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index 204d37bf415..e8120d4e7b9 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -15,7 +15,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.182 2005/06/13 23:14:48 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.183 2005/06/29 22:51:56 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -105,6 +105,7 @@ #include "utils/datum.h" #include "utils/int8.h" #include "utils/lsyscache.h" +#include "utils/nabstime.h" #include "utils/pg_locale.h" #include "utils/selfuncs.h" #include "utils/syscache.h" diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index 035a422bfcc..f9f4ec24b1a 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.126 2005/06/15 00:34:09 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.127 2005/06/29 22:51:56 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -28,6 +28,8 @@ #include "parser/scansup.h" #include "utils/array.h" #include "utils/builtins.h" +#include "utils/datetime.h" + /* * gcc's -ffast-math switch breaks routines that expect exact results from @@ -38,6 +40,10 @@ #endif +/* Set at postmaster start */ +TimestampTz PgStartTime; + + #ifdef HAVE_INT64_TIMESTAMP static int64 time2t(const int hour, const int min, const int sec, const fsec_t fsec); @@ -927,21 +933,39 @@ EncodeSpecialTimestamp(Timestamp dt, char *str) Datum now(PG_FUNCTION_ARGS) { - TimestampTz result; - AbsoluteTime sec; - int usec; - - sec = GetCurrentTransactionStartTimeUsec(&usec); - - result = AbsoluteTimeUsecToTimestampTz(sec, usec); - - PG_RETURN_TIMESTAMPTZ(result); + PG_RETURN_TIMESTAMPTZ(GetCurrentTransactionStartTimestamp()); } Datum pgsql_postmaster_start_time(PG_FUNCTION_ARGS) { - PG_RETURN_TIMESTAMPTZ(StartTime); + PG_RETURN_TIMESTAMPTZ(PgStartTime); +} + +/* + * GetCurrentTimestamp -- get the current operating system time + * + * Result is in the form of a TimestampTz value, and is expressed to the + * full precision of the gettimeofday() syscall + */ +TimestampTz +GetCurrentTimestamp(void) +{ + TimestampTz result; + struct timeval tp; + + gettimeofday(&tp, NULL); + + result = tp.tv_sec - + ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY); + +#ifdef HAVE_INT64_TIMESTAMP + result = (result * USECS_PER_SEC) + tp.tv_usec; +#else + result = result + (tp.tv_usec / 1000000.0); +#endif + + return result; } void |