aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Meskes <meskes@postgresql.org>2004-12-23 10:46:10 +0000
committerMichael Meskes <meskes@postgresql.org>2004-12-23 10:46:10 +0000
commitf0299325e4edc8089e30ea09e2cca6455a55d18d (patch)
treeca594d25a4dfa23da3f9f6d80011d71a7ef99872 /src
parentf8ffb604923d06b340bbc4e95f2bb2f9d4728d9a (diff)
downloadpostgresql-f0299325e4edc8089e30ea09e2cca6455a55d18d.tar.gz
postgresql-f0299325e4edc8089e30ea09e2cca6455a55d18d.zip
Added PGTYPEStimestamp_add_interval written by Dave Cramer.
Fixed parsing of defines to make sure they used more than once.
Diffstat (limited to 'src')
-rw-r--r--src/interfaces/ecpg/pgtypeslib/dt.h1
-rw-r--r--src/interfaces/ecpg/pgtypeslib/dt_common.c2
-rw-r--r--src/interfaces/ecpg/pgtypeslib/timestamp.c85
-rw-r--r--src/interfaces/ecpg/preproc/pgc.l10
4 files changed, 92 insertions, 6 deletions
diff --git a/src/interfaces/ecpg/pgtypeslib/dt.h b/src/interfaces/ecpg/pgtypeslib/dt.h
index 001e0fc4af4..e000ec4411c 100644
--- a/src/interfaces/ecpg/pgtypeslib/dt.h
+++ b/src/interfaces/ecpg/pgtypeslib/dt.h
@@ -305,5 +305,6 @@ extern char *pgtypes_date_weekdays_short[];
extern char *pgtypes_date_months[];
extern char *months[];
extern char *days[];
+extern int day_tab[2][13];
#endif /* DT_H */
diff --git a/src/interfaces/ecpg/pgtypeslib/dt_common.c b/src/interfaces/ecpg/pgtypeslib/dt_common.c
index ad9c8b05c30..dfd7c663fe3 100644
--- a/src/interfaces/ecpg/pgtypeslib/dt_common.c
+++ b/src/interfaces/ecpg/pgtypeslib/dt_common.c
@@ -8,7 +8,7 @@
#include "dt.h"
#include "pgtypes_timestamp.h"
-static int day_tab[2][13] = {
+int day_tab[2][13] = {
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0},
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0}};
diff --git a/src/interfaces/ecpg/pgtypeslib/timestamp.c b/src/interfaces/ecpg/pgtypeslib/timestamp.c
index 9f4bf782cd0..e6062525ab4 100644
--- a/src/interfaces/ecpg/pgtypeslib/timestamp.c
+++ b/src/interfaces/ecpg/pgtypeslib/timestamp.c
@@ -12,6 +12,7 @@
#include "pgtypes_timestamp.h"
#include "pgtypes_date.h"
+
int PGTYPEStimestamp_defmt_scan(char **, char *, timestamp *, int *, int *, int *,
int *, int *, int *, int *);
@@ -844,3 +845,87 @@ PGTYPEStimestamp_defmt_asc(char *str, char *fmt, timestamp *d)
free(mfmt);
return i;
}
+
+/*
+* add an interval to a time stamp
+*
+* *tout = tin + span
+*
+* returns 0 if successful
+* returns -1 if it fails
+*
+*/
+
+int
+PGTYPEStimestamp_add_interval(timestamp *tin, interval *span, timestamp *tout)
+{
+
+
+ if (TIMESTAMP_NOT_FINITE(*tin))
+ *tout = *tin;
+
+
+ else
+ {
+ if (span->month != 0)
+ {
+ struct tm tt,
+ *tm = &tt;
+ fsec_t fsec;
+
+
+ if (timestamp2tm(*tin, NULL, tm, &fsec, NULL) !=0)
+ return -1;
+ tm->tm_mon += span->month;
+ if (tm->tm_mon > 12)
+ {
+ tm->tm_year += ((tm->tm_mon - 1) / 12);
+ tm->tm_mon = (((tm->tm_mon - 1) % 12) + 1);
+ }
+ else if (tm->tm_mon < 1)
+ {
+ tm->tm_year += ((tm->tm_mon / 12) - 1);
+ tm->tm_mon = ((tm->tm_mon % 12) + 12);
+ }
+
+
+ /* adjust for end of month boundary problems... */
+ if (tm->tm_mday > day_tab[isleap(tm->tm_year)][tm->tm_mon - 1])
+ tm->tm_mday = (day_tab[isleap(tm->tm_year)][tm->tm_mon - 1]);
+
+
+ if (tm2timestamp(tm, fsec, NULL, tin) !=0)
+ return -1;
+ }
+
+
+ *tin +=span->time;
+ *tout = *tin;
+ }
+ return 0;
+
+}
+
+
+/*
+* subtract an interval from a time stamp
+*
+* *tout = tin - span
+*
+* returns 0 if successful
+* returns -1 if it fails
+*
+*/
+
+int
+PGTYPEStimestamp_sub_interval(timestamp *tin, interval *span, timestamp *tout)
+{
+ interval tspan;
+
+ tspan.month = -span->month;
+ tspan.time = -span->time;
+
+
+ return PGTYPEStimestamp_add_interval(tin, &tspan, tout );
+}
+
diff --git a/src/interfaces/ecpg/preproc/pgc.l b/src/interfaces/ecpg/preproc/pgc.l
index 9fc31239c9b..681222806cd 100644
--- a/src/interfaces/ecpg/preproc/pgc.l
+++ b/src/interfaces/ecpg/preproc/pgc.l
@@ -12,7 +12,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.132 2004/08/29 04:13:11 momjian Exp $
+ * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.133 2004/12/23 10:46:10 meskes Exp $
*
*-------------------------------------------------------------------------
*/
@@ -611,9 +611,9 @@ cppline {space}*#(.*\\{space})+.*
yb->buffer = YY_CURRENT_BUFFER;
yb->lineno = yylineno;
yb->filename = mm_strdup(input_filename);
- ptr->used = yb->next = yy_buffer;
+ yb->next = yy_buffer;
- yy_buffer = yb;
+ ptr->used = yy_buffer = yb;
yy_scan_string(ptr->new);
break;
@@ -712,9 +712,9 @@ cppline {space}*#(.*\\{space})+.*
yb->buffer = YY_CURRENT_BUFFER;
yb->lineno = yylineno;
yb->filename = mm_strdup(input_filename);
- ptr->used = yb->next = yy_buffer;
+ yb->next = yy_buffer;
- yy_buffer = yb;
+ ptr->used = yy_buffer = yb;
yy_scan_string(ptr->new);
break;