Changeset: e4ef92ec4acf for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e4ef92ec4acf Modified Files: clients/mapilib/mapi.c common/utils/conversion.c common/utils/conversion.h Branch: protocol Log Message:
Add support for TIMETZ type. diffs (98 lines): diff --git a/clients/mapilib/mapi.c b/clients/mapilib/mapi.c --- a/clients/mapilib/mapi.c +++ b/clients/mapilib/mapi.c @@ -4119,7 +4119,15 @@ static char* mapi_convert_decimal(struct static char* mapi_convert_time(struct MapiColumn *col) { if (*((int*) col->buffer_ptr) == *((int*)col->null_value)) return NULL; - if (conversion_time_to_string(col->write_buf, COLBUFSIZ, (int*) col->buffer_ptr, *((int*)col->null_value), col->digits, 0) < 0) { + if (conversion_time_to_string(col->write_buf, COLBUFSIZ, (int*) col->buffer_ptr, *((int*)col->null_value), col->digits) < 0) { + return NULL; + } + return (char*) col->write_buf; +} + +static char* mapi_convert_timetz(struct MapiColumn *col) { + if (*((int*) col->buffer_ptr) == *((int*)col->null_value)) return NULL; + if (conversion_timetz_to_string(col->write_buf, COLBUFSIZ, (int*) col->buffer_ptr, *((int*)col->null_value), col->digits, col->timezone) < 0) { return NULL; } return (char*) col->write_buf; @@ -4345,6 +4353,10 @@ read_into_cache(MapiHdl hdl, int lookahe } else if (strcasecmp(type_sql_name, "time") == 0) { result->fields[i].sql_type = SQL_BINARY_TIME; result->fields[i].converter = (mapi_converter) mapi_convert_time; + } else if (strcasecmp(type_sql_name, "timetz") == 0) { + result->fields[i].sql_type = SQL_BINARY_TIMETZ; + result->fields[i].timezone = timezone; + result->fields[i].converter = (mapi_converter) mapi_convert_timetz; } else if (strcasecmp(type_sql_name, "timestamp") == 0) { result->fields[i].sql_type = SQL_BINARY_TIMESTAMP; result->fields[i].converter = (mapi_converter) mapi_convert_timestamp; diff --git a/common/utils/conversion.c b/common/utils/conversion.c --- a/common/utils/conversion.c +++ b/common/utils/conversion.c @@ -292,8 +292,8 @@ conversion_time_get_data(int time, int t } -int -conversion_time_to_string(char *dst, int len, const int *src, int null_value, int digits, int timezone_diff) { +static int +conversion_time_optional_tz_to_string(char *dst, int len, const int *src, int null_value, int digits, int include_timezone, int timezone_diff) { unsigned short hour, min, sec; unsigned int nanosecond; int res = 0; @@ -305,16 +305,36 @@ conversion_time_to_string(char *dst, int conversion_time_get_data(*src, timezone_diff, &hour, &min, &sec, &nanosecond); - if ((res = sprintf(dst, "%02d:%02d:%02d.%06d", hour, min, sec, nanosecond)) < 0) { + if ((res = snprintf(dst, len, "%02d:%02d:%02d.%06d", hour, min, sec, nanosecond)) < 0) { return res; } digits--; if (digits == 0) digits = -1; // adjust displayed precision based on the digits dst[9 + digits] = '\0'; + + if (include_timezone) { + int diff_hour, diff_min; + int original_diff = timezone_diff; + + diff_hour = timezone_diff / 3600000; + timezone_diff -= diff_hour * 3600000; + diff_min = timezone_diff / 60000; + if ((res = snprintf(dst + (9 + digits), len - (9 + digits), "%s%02d:%02d", original_diff >= 0 ? "+" : "", diff_hour, diff_min)) < 0) { + return res; + } + } return 9 + digits; } +int conversion_time_to_string(char *dst, int len, const int *src, int null_value, int digits) { + return conversion_time_optional_tz_to_string(dst, len, src, null_value, digits, 0, 0); +} + +int conversion_timetz_to_string(char *dst, int len, const int *src, int null_value, int digits, int timezone_diff) { + return conversion_time_optional_tz_to_string(dst, len, src, null_value, digits, 1, timezone_diff); +} + static int days_between_zero_and_epoch = 719528; void diff --git a/common/utils/conversion.h b/common/utils/conversion.h --- a/common/utils/conversion.h +++ b/common/utils/conversion.h @@ -63,7 +63,10 @@ int conversion_date_to_string(char *dst, void conversion_date_get_data(int date, short *year, unsigned short *month, unsigned short *day); // time conversion, *src is ms since 00:00:00 -int conversion_time_to_string(char *dst, int len, const int *src, int null_value, int digits, int timezone_diff); +int conversion_time_to_string(char *dst, int len, const int *src, int null_value, int digits); +int conversion_timetz_to_string(char *dst, int len, const int *src, int null_value, int digits, int timezone_diff); + + void conversion_time_get_data(int time, int timezone_diff, unsigned short *hour, unsigned short *minute, unsigned short *second, unsigned int *nanosecond); // timestamp conversion, *src is time since epoch in ms _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list