aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/date.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt/date.c')
-rw-r--r--src/backend/utils/adt/date.c143
1 files changed, 61 insertions, 82 deletions
diff --git a/src/backend/utils/adt/date.c b/src/backend/utils/adt/date.c
index 506b3fbfc97..8d2587ce385 100644
--- a/src/backend/utils/adt/date.c
+++ b/src/backend/utils/adt/date.c
@@ -1,7 +1,7 @@
/*-------------------------------------------------------------------------
*
* date.c--
- * Functions for the built-in type "AbsoluteTime".
+ * Utilities for the built-in type "AbsoluteTime" (defined in nabstime).
* Functions for the built-in type "RelativeTime".
* Functions for the built-in type "TimeInterval".
*
@@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/date.c,v 1.5 1997/02/14 04:17:35 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/date.c,v 1.6 1997/03/14 23:19:57 scrappy Exp $
*
* NOTES
* This code is actually (almost) unused.
@@ -35,25 +35,11 @@
#include "access/xact.h"
#include "utils/builtins.h" /* where function declarations go */
#include "utils/palloc.h"
+#include "utils/dt.h"
-#define TM_YEAR_BASE 1900 /* compatible to UNIX time */
-#define EPOCH_YEAR 1970 /* compatible to UNIX time */
-#define YEAR_MAX 2038 /* otherwise overflow */
-#define YEAR_MIN 1902 /* otherwise overflow */
-#define DAYS_PER_LYEAR 366
-#define DAYS_PER_NYEAR 365
-#define HOURS_PER_DAY 24
-#define MINS_PER_HOUR 60
-#define SECS_PER_MIN 60
-#define MAX_LONG 2147483647 /* 2^31 */
-
-/* absolute time definitions */
-#define TIME_NOW_STR "now" /* represents time now */
-#define TIME_EPOCH_STR "epoch" /* Jan 1 00:00:00 1970 GMT */
-#define TIME_EPOCH_STR_LEN (sizeof(TIME_EPOCH_STR)-1)
-
-#define INVALID_ABSTIME_STR "Undefined AbsTime"
-#define INVALID_ABSTIME_STR_LEN (sizeof(INVALID_ABSTIME_STR)-1)
+#ifndef USE_NEW_TIME_CODE
+#define USE_NEW_TIME_CODE 1
+#endif
#define INVALID_RELTIME_STR "Undefined RelTime"
#define INVALID_RELTIME_STR_LEN (sizeof(INVALID_RELTIME_STR)-1)
@@ -66,10 +52,7 @@
* sixty-eight years on either side of that.
*/
-#define IsCharDigit(C) isdigit(C)
-#define IsCharA_Z(C) isalpha(C)
#define IsSpace(C) ((C) == ' ')
-#define IsNull(C) ((C) == NULL)
#define T_INTERVAL_INVAL 0 /* data represents no valid interval */
#define T_INTERVAL_VALID 1 /* data represents a valid interval */
@@ -101,20 +84,13 @@ static int sec_tab[] = {
3600, 3600, 86400, 86400, 604800, 604800,
2592000, 2592000, 31536000, 31536000 };
-/* maximal values (in seconds) per unit which can be represented */
-static int unit_max_quantity[] = {
- 2144448000, 2144448000, 35740800, 35740800,
- 595680, 595680, 24820, 24820, 3545, 3545,
- 827, 827, 68, 68 };
-
-
-struct timeb *TimeDifferenceFromGMT = NULL;
-
/*
* Function prototypes -- internal to this file only
*/
+
static int correct_unit(char unit[], int *unptr);
static int correct_dir(char direction[], int *signptr);
+
static int istinterval(char *i_string,
AbsoluteTime *i_start,
AbsoluteTime *i_end);
@@ -126,41 +102,45 @@ static int istinterval(char *i_string,
/*
* reltimein - converts a reltime string in an internal format
*/
-int32 /* RelativeTime */
-reltimein(char *timestring)
+RelativeTime
+reltimein(char *str)
{
- int error;
- int32 /* RelativeTime */ timeinsec;
- int sign, unitnr;
- long quantity;
-
- error = isreltime(timestring, &sign, &quantity, &unitnr);
-
-#ifdef DATEDEBUG
- elog(DEBUG, "reltimein: isreltime(%s) returns error=%d, %d, %d, %d",
- timestring, error, sign, quantity, unitnr);
-#endif /* !DATEDEBUG */
-
- if (error != 1) {
- timeinsec = INVALID_RELTIME; /*invalid time representation */
- } else {
- /* this check is necessary, while no control on overflow */
- if (quantity > unit_max_quantity[unitnr] || quantity < 0) {
-#ifdef DATEDEBUG
- elog(DEBUG, "reltimein: illegal quantity %d (< %d)",
- quantity, unit_max_quantity[unitnr]);
-#endif /* DATEDEBUG */
- timeinsec = INVALID_RELTIME; /* illegal quantity */
- } else {
- timeinsec = sign * quantity * sec_tab[unitnr];
-#ifdef DATEDEBUG
- elog(DEBUG, "reltimein: computed timeinsec %d",
- timeinsec);
-#endif /* DATEDEBUG */
- }
- }
- return(timeinsec);
-}
+ RelativeTime result;
+
+ struct tm tt, *tm = &tt;
+ double fsec;
+ int dtype;
+ char *field[MAXDATEFIELDS];
+ int nf, ftype[MAXDATEFIELDS];
+ char lowstr[MAXDATELEN+1];
+
+ if (!PointerIsValid(str))
+ elog(WARN,"Bad (null) date external representation",NULL);
+
+ if (strlen(str) > MAXDATELEN)
+ elog( WARN, "Bad (length) reltime external representation '%s'",str);
+
+ if ((ParseDateTime( str, lowstr, field, ftype, MAXDATEFIELDS, &nf) != 0)
+ || (DecodeDateDelta( field, ftype, nf, &dtype, tm, &fsec) != 0))
+ elog(WARN,"Bad reltime external representation '%s'",str);
+
+#ifdef DATEDEBUG
+printf( "reltimein- %d fields are type %d (DTK_DATE=%d)\n", nf, dtype, DTK_DATE);
+#endif
+
+ switch (dtype) {
+ case DTK_DELTA:
+ result = ((((tm->tm_hour*60)+tm->tm_min)*60)+tm->tm_sec);
+ result += (((tm->tm_year*365)+(tm->tm_mon*30)+tm->tm_mday)*(24*60*60));
+ return(result);
+
+ default:
+ return(INVALID_RELTIME);
+ };
+
+ elog(WARN,"Bad reltime (internal coding error) '%s'",str);
+ return(INVALID_RELTIME);
+} /* reltimein() */
/*
@@ -379,42 +359,42 @@ AbsoluteTime timenow()
* reltimele - returns 1, iff t1 less than or equal to t2
* reltimege - returns 1, iff t1 greater than or equal to t2
*/
-int32 reltimeeq(RelativeTime t1, RelativeTime t2)
+bool reltimeeq(RelativeTime t1, RelativeTime t2)
{
if (t1 == INVALID_RELTIME || t2 == INVALID_RELTIME)
return 0;
return(t1 == t2);
}
-int32 reltimene(RelativeTime t1, RelativeTime t2)
+bool reltimene(RelativeTime t1, RelativeTime t2)
{
if (t1 == INVALID_RELTIME || t2 == INVALID_RELTIME)
return 0;
return(t1 != t2);
}
-int32 reltimelt(RelativeTime t1, RelativeTime t2)
+bool reltimelt(RelativeTime t1, RelativeTime t2)
{
if (t1 == INVALID_RELTIME || t2 == INVALID_RELTIME)
return 0;
return(t1 < t2);
}
-int32 reltimegt(RelativeTime t1, RelativeTime t2)
+bool reltimegt(RelativeTime t1, RelativeTime t2)
{
if (t1 == INVALID_RELTIME || t2 == INVALID_RELTIME)
return 0;
return(t1 > t2);
}
-int32 reltimele(RelativeTime t1, RelativeTime t2)
+bool reltimele(RelativeTime t1, RelativeTime t2)
{
if (t1 == INVALID_RELTIME || t2 == INVALID_RELTIME)
return 0;
return(t1 <= t2);
}
-int32 reltimege(RelativeTime t1, RelativeTime t2)
+bool reltimege(RelativeTime t1, RelativeTime t2)
{
if (t1 == INVALID_RELTIME || t2 == INVALID_RELTIME)
return 0;
@@ -425,7 +405,7 @@ int32 reltimege(RelativeTime t1, RelativeTime t2)
/*
* intervaleq - returns 1, iff interval i1 is equal to interval i2
*/
-int32 intervaleq(TimeInterval i1, TimeInterval i2)
+bool intervaleq(TimeInterval i1, TimeInterval i2)
{
if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL)
return(0); /* invalid interval */
@@ -437,7 +417,7 @@ int32 intervaleq(TimeInterval i1, TimeInterval i2)
* intervalleneq - returns 1, iff length of interval i is equal to
* reltime t
*/
-int32 intervalleneq(TimeInterval i, RelativeTime t)
+bool intervalleneq(TimeInterval i, RelativeTime t)
{
RelativeTime rt;
@@ -451,7 +431,7 @@ int32 intervalleneq(TimeInterval i, RelativeTime t)
* intervallenne - returns 1, iff length of interval i is not equal
* to reltime t
*/
-int32 intervallenne(TimeInterval i, RelativeTime t)
+bool intervallenne(TimeInterval i, RelativeTime t)
{
RelativeTime rt;
@@ -465,7 +445,7 @@ int32 intervallenne(TimeInterval i, RelativeTime t)
* intervallenlt - returns 1, iff length of interval i is less than
* reltime t
*/
-int32 intervallenlt(TimeInterval i, RelativeTime t)
+bool intervallenlt(TimeInterval i, RelativeTime t)
{
RelativeTime rt;
@@ -479,7 +459,7 @@ int32 intervallenlt(TimeInterval i, RelativeTime t)
* intervallengt - returns 1, iff length of interval i is greater than
* reltime t
*/
-int32 intervallengt(TimeInterval i, RelativeTime t)
+bool intervallengt(TimeInterval i, RelativeTime t)
{
RelativeTime rt;
@@ -493,7 +473,7 @@ int32 intervallengt(TimeInterval i, RelativeTime t)
* intervallenle - returns 1, iff length of interval i is less or equal
* than reltime t
*/
-int32 intervallenle(TimeInterval i, RelativeTime t)
+bool intervallenle(TimeInterval i, RelativeTime t)
{
RelativeTime rt;
@@ -507,7 +487,7 @@ int32 intervallenle(TimeInterval i, RelativeTime t)
* intervallenge - returns 1, iff length of interval i is greater or
* equal than reltime t
*/
-int32 intervallenge(TimeInterval i, RelativeTime t)
+bool intervallenge(TimeInterval i, RelativeTime t)
{
RelativeTime rt;
@@ -520,7 +500,7 @@ int32 intervallenge(TimeInterval i, RelativeTime t)
/*
* intervalct - returns 1, iff interval i1 contains interval i2
*/
-int32 intervalct(TimeInterval i1, TimeInterval i2)
+bool intervalct(TimeInterval i1, TimeInterval i2)
{
if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL)
return(0);
@@ -531,7 +511,7 @@ int32 intervalct(TimeInterval i1, TimeInterval i2)
/*
* intervalov - returns 1, iff interval i1 (partially) overlaps i2
*/
-int32 intervalov(TimeInterval i1, TimeInterval i2)
+bool intervalov(TimeInterval i1, TimeInterval i2)
{
if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL)
return(0);
@@ -736,7 +716,6 @@ static int correct_dir(char direction[], int *signptr)
return (0); /* invalid direction descriptor */
}
-
/*
* istinterval - returns 1, iff i_string is a valid interval descr.
* 0, iff i_string is NOT a valid interval desc.