Added PGTYPEStimestamp_add_interval written by Dave Cramer.
Fixed parsing of defines to make sure they used more than once.
This commit is contained in:
parent
f8ffb60492
commit
f0299325e4
src/interfaces/ecpg
@ -305,5 +305,6 @@ extern char *pgtypes_date_weekdays_short[];
|
|||||||
extern char *pgtypes_date_months[];
|
extern char *pgtypes_date_months[];
|
||||||
extern char *months[];
|
extern char *months[];
|
||||||
extern char *days[];
|
extern char *days[];
|
||||||
|
extern int day_tab[2][13];
|
||||||
|
|
||||||
#endif /* DT_H */
|
#endif /* DT_H */
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
#include "dt.h"
|
#include "dt.h"
|
||||||
#include "pgtypes_timestamp.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, 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}};
|
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0}};
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include "pgtypes_timestamp.h"
|
#include "pgtypes_timestamp.h"
|
||||||
#include "pgtypes_date.h"
|
#include "pgtypes_date.h"
|
||||||
|
|
||||||
|
|
||||||
int PGTYPEStimestamp_defmt_scan(char **, char *, timestamp *, int *, int *, int *,
|
int PGTYPEStimestamp_defmt_scan(char **, char *, timestamp *, int *, int *, int *,
|
||||||
int *, int *, int *, int *);
|
int *, int *, int *, int *);
|
||||||
|
|
||||||
@ -844,3 +845,87 @@ PGTYPEStimestamp_defmt_asc(char *str, char *fmt, timestamp *d)
|
|||||||
free(mfmt);
|
free(mfmt);
|
||||||
return i;
|
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 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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->buffer = YY_CURRENT_BUFFER;
|
||||||
yb->lineno = yylineno;
|
yb->lineno = yylineno;
|
||||||
yb->filename = mm_strdup(input_filename);
|
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);
|
yy_scan_string(ptr->new);
|
||||||
break;
|
break;
|
||||||
@ -712,9 +712,9 @@ cppline {space}*#(.*\\{space})+.*
|
|||||||
yb->buffer = YY_CURRENT_BUFFER;
|
yb->buffer = YY_CURRENT_BUFFER;
|
||||||
yb->lineno = yylineno;
|
yb->lineno = yylineno;
|
||||||
yb->filename = mm_strdup(input_filename);
|
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);
|
yy_scan_string(ptr->new);
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user