From: Jan E. <je...@in...> - 2014-01-05 14:01:48
|
libdbi replaced dbi_data_t's datetime field by datetimex and switched from _dbd_parse_datetime for _dbd_parse_datetimex to support dates outside the range of time_t. Adjust the drivers to follow suit. --- drivers/db2/dbd_db2.c | 2 +- drivers/firebird/utility.c | 2 +- drivers/freetds/dbd_freetds.c | 3 +-- drivers/ingres/dbd_ingres.c | 32 ++++++++++++++++---------------- drivers/msql/dbd_msql.c | 2 +- drivers/mysql/dbd_mysql.c | 2 +- drivers/oracle/dbd_oracle.c | 30 ++++++++++++------------------ drivers/pgsql/dbd_pgsql.c | 2 +- drivers/sqlite/dbd_sqlite.c | 2 +- drivers/sqlite3/dbd_sqlite3.c | 2 +- 10 files changed, 36 insertions(+), 43 deletions(-) diff --git a/drivers/db2/dbd_db2.c b/drivers/db2/dbd_db2.c index 30a8186..1e97067 100755 --- a/drivers/db2/dbd_db2.c +++ b/drivers/db2/dbd_db2.c @@ -992,7 +992,7 @@ void _get_row_data(dbi_result_t *result, dbi_row_t *row, unsigned long long rowi default: break; } - data->d_datetime = _dbd_parse_datetime(ptr_date, attribs); + _dbd_parse_datetimex(ptr_date, attribs, &data->d_datetimex); free((char *) ptr_date); break; default: diff --git a/drivers/firebird/utility.c b/drivers/firebird/utility.c index d797141..de672dd 100644 --- a/drivers/firebird/utility.c +++ b/drivers/firebird/utility.c @@ -333,7 +333,7 @@ int _get_row_data(dbi_result_t *result, dbi_row_t *row, unsigned long long rowid times.tm_mon+1, times.tm_mday); } - data->d_datetime = _dbd_parse_datetime(date_s, sizeattrib); + _dbd_parse_datetimex(date_s, sizeattrib, &data->d_datetimex); break; case DBI_TYPE_BINARY: diff --git a/drivers/freetds/dbd_freetds.c b/drivers/freetds/dbd_freetds.c index c272073..98c4864 100644 --- a/drivers/freetds/dbd_freetds.c +++ b/drivers/freetds/dbd_freetds.c @@ -1031,8 +1031,7 @@ dbi_row_t *_dbd_freetds_buffers_binding(dbi_conn_t * conn, dbi_result_t * result CS_SUCCEED) { // fprintf(stderr, "cs_convert() succeeded when failure was expected\n"); } - ((dbi_data_t *) addr)->d_datetime = - _dbd_parse_datetime(datastring, DBI_DATETIME_TIME | DBI_DATETIME_DATE); + _dbd_parse_datetimex(datastring, DBI_DATETIME_TIME | DBI_DATETIME_DATE, &((dbi_data_t *)addr)->d_datetimex); } break; /* decode binary string */ diff --git a/drivers/ingres/dbd_ingres.c b/drivers/ingres/dbd_ingres.c index d0b2abf..1a5e091 100644 --- a/drivers/ingres/dbd_ingres.c +++ b/drivers/ingres/dbd_ingres.c @@ -485,21 +485,22 @@ size_t dbd_quote_binary(dbi_conn_t *conn, const unsigned char* orig, /* ---------- result handling ---------- */ -static time_t ingres_date(char *raw){ - struct tm unixtime; +static int ingres_date(const char *raw, dbi_datetimex *dtx) +{ + struct tm *unixtime = &dtx->tm; char *p = raw, *q, sep; PRINT_DEBUG(NULL,"parsing date: '%s'\n",raw); - unixtime.tm_sec = unixtime.tm_min = unixtime.tm_hour = 0; - unixtime.tm_isdst = -1; + unixtime->tm_sec = unixtime->tm_min = unixtime->tm_hour = 0; + unixtime->tm_isdst = -1; // parse Ingres default (US) date format: dd-mmm-yyyy [hh:mm:ss] //for(p = raw; *p && !isdigit(*p); ++p) // ; if(isdigit(*p)){ // process day - unixtime.tm_mday = atoi(p); + unixtime->tm_mday = atoi(p); while(*p && isdigit(*p)) ++p; if(!*p){ _verbose_handler(NULL,"date ended after day??",raw); return 0; } @@ -507,7 +508,7 @@ static time_t ingres_date(char *raw){ // process month if(isdigit(*p)){ - unixtime.tm_mon = atoi(p)-1; /* months are 0 through 11 */ + unixtime->tm_mon = atoi(p)-1; /* months are 0 through 11 */ while(*p && *p != sep) ++p; }else{ @@ -516,17 +517,17 @@ static time_t ingres_date(char *raw){ ++p; if(*p){ *p = 0; - unixtime.tm_mon = in_word_set(q,3)->index; // should work for long month names too + unixtime->tm_mon = in_word_set(q,3)->index; // should work for long month names too ++p; } } if(!*p){ _verbose_handler(NULL,"date ended after month??",raw); return 0; } // process year - unixtime.tm_year = atoi(p)-1900; + unixtime->tm_year = atoi(p)-1900; PRINT_DEBUG(NULL,"ingres_date: parsed date day=%d mon=%d yr=%d\n", - unixtime.tm_mday, unixtime.tm_mon, unixtime.tm_year); + unixtime->tm_mday, unixtime->tm_mon, unixtime->tm_year); while(isdigit(*p)) ++p; @@ -537,32 +538,31 @@ static time_t ingres_date(char *raw){ // Ingres does not generate a time by itself, it's always preceded by a date. if(isdigit(*p)){ // time is present // process hours - unixtime.tm_hour = atoi(p); + unixtime->tm_hour = atoi(p); while(isdigit(*p)) ++p; if(!*p){ _verbose_handler(NULL,"time ended after hour??",raw); return 0; } ++p; // skip separator // process minutes - unixtime.tm_min = atoi(p); + unixtime->tm_min = atoi(p); while(isdigit(*p)) ++p; if(!*p){ _verbose_handler(NULL,"time ended after minute??",raw); return 0; } ++p; // skip separator // process seconds - unixtime.tm_sec = atoi(p); + unixtime->tm_sec = atoi(p); PRINT_DEBUG(NULL,"ingres_date: parsed time %02d:%02d:%02d\n", - unixtime.tm_hour, unixtime.tm_min, unixtime.tm_sec); + unixtime->tm_hour, unixtime->tm_min, unixtime->tm_sec); /* check for a timezone suffix */ //while(isdigit(*p) || *p == ' ') // ++p; }else if(*p) _verbose_handler(NULL,"bad time: '%s'",p); - - return timegm(&unixtime); + dtx->utc_offset = 0; }else _verbose_handler(NULL,"bad date: '%s'",raw); return 0; @@ -660,7 +660,7 @@ static int ingres_field(dbi_result_t *result, dbi_row_t *row, dbi_data_t *data, len = convParm.cv_dstValue.dv_length; if(pdesc->ds_dataType == IIAPI_DTE_TYPE){ val[len] = 0; - data->d_datetime = ingres_date(val); + ingres_date(val, &data->d_datetimex); PRINT_DEBUG(result->conn," [%d] date string %d bytes\n", idx,len); break; }else if(pdesc->ds_dataType == IIAPI_DEC_TYPE || pdesc->ds_dataType == IIAPI_MNY_TYPE){ diff --git a/drivers/msql/dbd_msql.c b/drivers/msql/dbd_msql.c index f3430b1..55c38be 100644 --- a/drivers/msql/dbd_msql.c +++ b/drivers/msql/dbd_msql.c @@ -511,7 +511,7 @@ void _get_row_data(dbi_result_t *result, dbi_row_t *row, unsigned long long rowi case DBI_TYPE_DATETIME: sizeattrib = _isolate_attrib(result->field_attribs[curfield], DBI_DATETIME_DATE\ , DBI_DATETIME_TIME); - data->d_datetime = _dbd_parse_datetime(raw, sizeattrib); + _dbd_parse_datetimex(raw, sizeattrib, &data->d_datetimex); break; default: data->d_string = strdup(raw); diff --git a/drivers/mysql/dbd_mysql.c b/drivers/mysql/dbd_mysql.c index bca34c3..c11e6a8 100644 --- a/drivers/mysql/dbd_mysql.c +++ b/drivers/mysql/dbd_mysql.c @@ -902,7 +902,7 @@ void _get_row_data(dbi_result_t *result, dbi_row_t *row, unsigned long long rowi break; case DBI_TYPE_DATETIME: sizeattrib = result->field_attribs[curfield] & (DBI_DATETIME_DATE|DBI_DATETIME_TIME); - data->d_datetime = _dbd_parse_datetime(raw, sizeattrib); + _dbd_parse_datetimex(raw, sizeattrib, &data->d_datetimex); break; } diff --git a/drivers/oracle/dbd_oracle.c b/drivers/oracle/dbd_oracle.c index ab04f99..9ef29e8 100755 --- a/drivers/oracle/dbd_oracle.c +++ b/drivers/oracle/dbd_oracle.c @@ -68,7 +68,7 @@ void _get_row_data(dbi_result_t *result, dbi_row_t *row, unsigned long long rowi unsigned long long _oracle_query_to_longlong(dbi_conn_t *conn, const char *sql_cmd); void _checkerr(OCIError * errhp, sword status); static size_t oracle_escape_string(char *to, const char *from, size_t length); -time_t _oradate_to_time_t (char *obuff); +int _oradate_to_dtx(const char *obuff, dbi_datetimex dtx); void dbd_register_driver(const dbi_info_t **_driver_info, const char ***_custom_functions, @@ -777,7 +777,7 @@ void _get_row_data(dbi_result_t *result, dbi_row_t *row, unsigned long long rowi memcpy(data->d_string, cols[curfield],row->field_sizes[curfield]); break; case DBI_TYPE_DATETIME: - data->d_datetime = _oradate_to_time_t (cols[curfield]); + _oradate_to_tm(cols[curfield], &data->d_datetimex); break; } if (cols[curfield]) free(cols[curfield]); @@ -923,13 +923,10 @@ static size_t oracle_escape_string(char *to, const char *from, size_t length) return (size_t) (to-to_start); } - - -time_t _oradate_to_time_t (char *obuff) +int _oradate_to_tm(const char *obuff, dbi_datetimex *dtx) { - struct tm tmt; + struct tm *tmt = &dtx->tm; /* char stime[101], *cp = NULL; */ - time_t loct = 0L; /* memset(stime, 0, sizeof(stime)); */ @@ -943,15 +940,12 @@ time_t _oradate_to_time_t (char *obuff) /* cp = strptime(stime, "%Y%m%d%H%M%S", &tmt); */ - memset(&tmt, 0, sizeof(tmt)); - tmt.tm_sec = obuff[6]-1; - tmt.tm_min = obuff[5]-1; - tmt.tm_hour = obuff[4]-1; - tmt.tm_mday = obuff[3]; - tmt.tm_mon = obuff[2]; - tmt.tm_year = (obuff[0]-100)*100 + (obuff[1]-100); - - loct = mktime(&tmt); - - return(loct); + memset(tmt, 0, sizeof(*tmt)); + tmt->tm_sec = obuff[6]-1; + tmt->tm_min = obuff[5]-1; + tmt->tm_hour = obuff[4]-1; + tmt->tm_mday = obuff[3]; + tmt->tm_mon = obuff[2]; + tmt->tm_year = (obuff[0]-100)*100 + (obuff[1]-100); + return 0; } diff --git a/drivers/pgsql/dbd_pgsql.c b/drivers/pgsql/dbd_pgsql.c index ae31d6c..b5820d6 100644 --- a/drivers/pgsql/dbd_pgsql.c +++ b/drivers/pgsql/dbd_pgsql.c @@ -882,7 +882,7 @@ void _get_row_data(dbi_result_t *result, dbi_row_t *row, unsigned long long rowi case DBI_TYPE_DATETIME: sizeattrib = result->field_attribs[curfield] & (DBI_DATETIME_DATE|DBI_DATETIME_TIME); - data->d_datetime = _dbd_parse_datetime(raw, sizeattrib); + _dbd_parse_datetimex(raw, sizeattrib, &data->d_datetimex); break; default: diff --git a/drivers/sqlite/dbd_sqlite.c b/drivers/sqlite/dbd_sqlite.c index 76e27a1..7b67136 100644 --- a/drivers/sqlite/dbd_sqlite.c +++ b/drivers/sqlite/dbd_sqlite.c @@ -1286,7 +1286,7 @@ void _get_row_data(dbi_result_t *result, dbi_row_t *row, unsigned int rowidx) { break; case DBI_TYPE_DATETIME: sizeattrib = _isolate_attrib(result->field_attribs[curfield], DBI_DATETIME_DATE, DBI_DATETIME_TIME); - data->d_datetime = _dbd_parse_datetime(raw, sizeattrib); + _dbd_parse_datetimex(raw, sizeattrib, &data->d_datetimex); break; default: diff --git a/drivers/sqlite3/dbd_sqlite3.c b/drivers/sqlite3/dbd_sqlite3.c index 0f993cc..2e75e41 100644 --- a/drivers/sqlite3/dbd_sqlite3.c +++ b/drivers/sqlite3/dbd_sqlite3.c @@ -1751,7 +1751,7 @@ static void _get_row_data(dbi_result_t *result, dbi_row_t *row, unsigned long lo break; case DBI_TYPE_DATETIME: sizeattrib = _isolate_attrib(result->field_attribs[curfield], DBI_DATETIME_DATE, DBI_DATETIME_TIME); - data->d_datetime = _dbd_parse_datetime(raw, sizeattrib); + _dbd_parse_datetimex(raw, sizeattrib, &data->d_datetimex); break; default: -- 1.8.4 |