/* * tintervalin - converts an tinterval string to internal format */ Datum tintervalin(PG_FUNCTION_ARGS) { char *tintervalstr = PG_GETARG_CSTRING(0); TimeInterval tinterval; AbsoluteTime i_start, i_end, t1, t2; parsetinterval(tintervalstr, &t1, &t2); tinterval = (TimeInterval) palloc(sizeof(TimeIntervalData)); if (t1 == INVALID_ABSTIME || t2 == INVALID_ABSTIME) tinterval->status = T_INTERVAL_INVAL; /* undefined */ else tinterval->status = T_INTERVAL_VALID; i_start = ABSTIMEMIN(t1, t2); i_end = ABSTIMEMAX(t1, t2); tinterval->data[0] = i_start; tinterval->data[1] = i_end; PG_RETURN_TIMEINTERVAL(tinterval); }
/* * tintervalrecv - converts external binary format to tinterval */ Datum tintervalrecv(PG_FUNCTION_ARGS) { StringInfo buf = (StringInfo) PG_GETARG_POINTER(0); TimeInterval tinterval; int32 status; tinterval = (TimeInterval) palloc(sizeof(TimeIntervalData)); tinterval->status = pq_getmsgint(buf, sizeof(tinterval->status)); tinterval->data[0] = pq_getmsgint(buf, sizeof(tinterval->data[0])); tinterval->data[1] = pq_getmsgint(buf, sizeof(tinterval->data[1])); if (tinterval->data[0] == INVALID_ABSTIME || tinterval->data[1] == INVALID_ABSTIME) status = T_INTERVAL_INVAL; /* undefined */ else status = T_INTERVAL_VALID; if (status != tinterval->status) ereport(ERROR, (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION), errmsg("invalid status in external \"tinterval\" value"))); PG_RETURN_TIMEINTERVAL(tinterval); }
/* * tintervalrecv - converts external binary format to tinterval */ Datum tintervalrecv(PG_FUNCTION_ARGS) { StringInfo buf = (StringInfo) PG_GETARG_POINTER(0); TimeInterval tinterval; tinterval = (TimeInterval) palloc(sizeof(TimeIntervalData)); tinterval->status = pq_getmsgint(buf, sizeof(tinterval->status)); if (!(tinterval->status == T_INTERVAL_INVAL || tinterval->status == T_INTERVAL_VALID)) ereport(ERROR, (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION), errmsg("invalid status in external \"tinterval\" value"), errOmitLocation(true))); tinterval->data[0] = pq_getmsgint(buf, sizeof(tinterval->data[0])); tinterval->data[1] = pq_getmsgint(buf, sizeof(tinterval->data[1])); PG_RETURN_TIMEINTERVAL(tinterval); }
/* * mktinterval - creates a time interval with endpoints t1 and t2 */ Datum mktinterval(PG_FUNCTION_ARGS) { AbsoluteTime t1 = PG_GETARG_ABSOLUTETIME(0); AbsoluteTime t2 = PG_GETARG_ABSOLUTETIME(1); AbsoluteTime tstart = ABSTIMEMIN(t1, t2); AbsoluteTime tend = ABSTIMEMAX(t1, t2); TimeInterval tinterval; tinterval = (TimeInterval) palloc(sizeof(TimeIntervalData)); if (t1 == INVALID_ABSTIME || t2 == INVALID_ABSTIME) tinterval->status = T_INTERVAL_INVAL; else { tinterval->status = T_INTERVAL_VALID; tinterval->data[0] = tstart; tinterval->data[1] = tend; } PG_RETURN_TIMEINTERVAL(tinterval); }