diff options
Diffstat (limited to 'src/backend/utils/adt/nabstime.c')
-rw-r--r-- | src/backend/utils/adt/nabstime.c | 108 |
1 files changed, 97 insertions, 11 deletions
diff --git a/src/backend/utils/adt/nabstime.c b/src/backend/utils/adt/nabstime.c index 143061fa794..fe14c9bec4f 100644 --- a/src/backend/utils/adt/nabstime.c +++ b/src/backend/utils/adt/nabstime.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/nabstime.c,v 1.107 2003/05/04 04:30:15 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/nabstime.c,v 1.108 2003/05/12 23:08:50 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -23,6 +23,7 @@ #include <limits.h> #include "access/xact.h" +#include "libpq/pqformat.h" #include "miscadmin.h" #include "utils/builtins.h" @@ -347,11 +348,11 @@ tm2abstime(struct tm * tm, int tz) } -/* nabstimein() +/* abstimein() * Decode date/time string and return abstime. */ Datum -nabstimein(PG_FUNCTION_ARGS) +abstimein(PG_FUNCTION_ARGS) { char *str = PG_GETARG_CSTRING(0); AbsoluteTime result; @@ -409,11 +410,11 @@ nabstimein(PG_FUNCTION_ARGS) } -/* nabstimeout() +/* abstimeout() * Given an AbsoluteTime return the English text version of the date */ Datum -nabstimeout(PG_FUNCTION_ARGS) +abstimeout(PG_FUNCTION_ARGS) { AbsoluteTime time = PG_GETARG_ABSOLUTETIME(0); char *result; @@ -450,6 +451,31 @@ nabstimeout(PG_FUNCTION_ARGS) PG_RETURN_CSTRING(result); } +/* + * abstimerecv - converts external binary format to abstime + */ +Datum +abstimerecv(PG_FUNCTION_ARGS) +{ + StringInfo buf = (StringInfo) PG_GETARG_POINTER(0); + + PG_RETURN_ABSOLUTETIME((AbsoluteTime) pq_getmsgint(buf, sizeof(AbsoluteTime))); +} + +/* + * abstimesend - converts abstime to binary format + */ +Datum +abstimesend(PG_FUNCTION_ARGS) +{ + AbsoluteTime time = PG_GETARG_ABSOLUTETIME(0); + StringInfoData buf; + + pq_begintypsend(&buf); + pq_sendint(&buf, time, sizeof(time)); + PG_RETURN_BYTEA_P(pq_endtypsend(&buf)); +} + /* abstime_finite() */ @@ -751,7 +777,6 @@ reltimein(PG_FUNCTION_ARGS) PG_RETURN_RELATIVETIME(result); } - /* * reltimeout - converts the internal format to a reltime string */ @@ -771,6 +796,31 @@ reltimeout(PG_FUNCTION_ARGS) PG_RETURN_CSTRING(result); } +/* + * reltimerecv - converts external binary format to reltime + */ +Datum +reltimerecv(PG_FUNCTION_ARGS) +{ + StringInfo buf = (StringInfo) PG_GETARG_POINTER(0); + + PG_RETURN_RELATIVETIME((RelativeTime) pq_getmsgint(buf, sizeof(RelativeTime))); +} + +/* + * reltimesend - converts reltime to binary format + */ +Datum +reltimesend(PG_FUNCTION_ARGS) +{ + RelativeTime time = PG_GETARG_RELATIVETIME(0); + StringInfoData buf; + + pq_begintypsend(&buf); + pq_sendint(&buf, time, sizeof(time)); + PG_RETURN_BYTEA_P(pq_endtypsend(&buf)); +} + static void reltime2tm(RelativeTime time, struct tm * tm) @@ -817,7 +867,6 @@ tintervalin(PG_FUNCTION_ARGS) /* * tintervalout - converts an internal interval format to a string - * */ Datum tintervalout(PG_FUNCTION_ARGS) @@ -832,12 +881,12 @@ tintervalout(PG_FUNCTION_ARGS) strcat(i_str, INVALID_INTERVAL_STR); else { - p = DatumGetCString(DirectFunctionCall1(nabstimeout, + p = DatumGetCString(DirectFunctionCall1(abstimeout, AbsoluteTimeGetDatum(interval->data[0]))); strcat(i_str, p); pfree(p); strcat(i_str, "\" \""); - p = DatumGetCString(DirectFunctionCall1(nabstimeout, + p = DatumGetCString(DirectFunctionCall1(abstimeout, AbsoluteTimeGetDatum(interval->data[1]))); strcat(i_str, p); pfree(p); @@ -846,6 +895,43 @@ tintervalout(PG_FUNCTION_ARGS) PG_RETURN_CSTRING(i_str); } +/* + * tintervalrecv - converts external binary format to tinterval + */ +Datum +tintervalrecv(PG_FUNCTION_ARGS) +{ + StringInfo buf = (StringInfo) PG_GETARG_POINTER(0); + TimeInterval interval; + + interval = (TimeInterval) palloc(sizeof(TimeIntervalData)); + + interval->status = pq_getmsgint(buf, sizeof(interval->status)); + if (!(interval->status == T_INTERVAL_INVAL || + interval->status == T_INTERVAL_VALID)) + elog(ERROR, "Invalid status in external tinterval"); + interval->data[0] = pq_getmsgint(buf, sizeof(interval->data[0])); + interval->data[1] = pq_getmsgint(buf, sizeof(interval->data[1])); + + PG_RETURN_TIMEINTERVAL(interval); +} + +/* + * tintervalsend - converts tinterval to binary format + */ +Datum +tintervalsend(PG_FUNCTION_ARGS) +{ + TimeInterval interval = PG_GETARG_TIMEINTERVAL(0); + StringInfoData buf; + + pq_begintypsend(&buf); + pq_sendint(&buf, interval->status, sizeof(interval->status)); + pq_sendint(&buf, interval->data[0], sizeof(interval->data[0])); + pq_sendint(&buf, interval->data[1], sizeof(interval->data[1])); + PG_RETURN_BYTEA_P(pq_endtypsend(&buf)); +} + /***************************************************************************** * PUBLIC ROUTINES * @@ -1558,7 +1644,7 @@ istinterval(char *i_string, p1++; } /* get the first date */ - *i_start = DatumGetAbsoluteTime(DirectFunctionCall1(nabstimein, + *i_start = DatumGetAbsoluteTime(DirectFunctionCall1(abstimein, CStringGetDatum(p))); /* rechange NULL at the end of the first date to a "'" */ *p1 = '"'; @@ -1586,7 +1672,7 @@ istinterval(char *i_string, p1++; } /* get the second date */ - *i_end = DatumGetAbsoluteTime(DirectFunctionCall1(nabstimein, + *i_end = DatumGetAbsoluteTime(DirectFunctionCall1(abstimein, CStringGetDatum(p))); /* rechange NULL at the end of the first date to a ''' */ *p1 = '"'; |