OSDN Git Service

Added PGTYPEStimestamp_add_interval written by Dave Cramer.
authorMichael Meskes <meskes@postgresql.org>
Thu, 23 Dec 2004 10:46:10 +0000 (10:46 +0000)
committerMichael Meskes <meskes@postgresql.org>
Thu, 23 Dec 2004 10:46:10 +0000 (10:46 +0000)
Fixed parsing of defines to make sure they used more than once.

src/interfaces/ecpg/pgtypeslib/dt.h
src/interfaces/ecpg/pgtypeslib/dt_common.c
src/interfaces/ecpg/pgtypeslib/timestamp.c
src/interfaces/ecpg/preproc/pgc.l

index 001e0fc..e000ec4 100644 (file)
@@ -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 */
index ad9c8b0..dfd7c66 100644 (file)
@@ -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}};
 
index 9f4bf78..e606252 100644 (file)
@@ -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 );
+}
+
index 9fc3123..6812228 100644 (file)
@@ -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;