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

Reply via email to