Changeset: 51697805b5d0 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=51697805b5d0
Modified Files:
        clients/mapilib/mapi.c
        common/utils/conversion.c
        common/utils/conversion.h
        sql/backends/monet5/sql_result.c
Branch: protocol
Log Message:

Use digits to determine timestamp printing precision.


diffs (117 lines):

diff --git a/clients/mapilib/mapi.c b/clients/mapilib/mapi.c
--- a/clients/mapilib/mapi.c
+++ b/clients/mapilib/mapi.c
@@ -4135,7 +4135,7 @@ static char* mapi_convert_timetz(struct 
 
 static char* mapi_convert_timestamp(struct MapiColumn *col) {
        if (*((lng*) col->buffer_ptr) == *((lng*)col->null_value)) return NULL;
-       if (conversion_epoch_to_string(col->write_buf, COLBUFSIZ, (lng*) 
col->buffer_ptr, *((lng*)col->null_value)) < 0) {
+       if (conversion_epoch_to_string(col->write_buf, COLBUFSIZ, (lng*) 
col->buffer_ptr, *((lng*)col->null_value), col->digits) < 0) {
                return NULL;
        }
        return (char*) col->write_buf;
@@ -4143,7 +4143,7 @@ static char* mapi_convert_timestamp(stru
 
 static char* mapi_convert_timestamptz(struct MapiColumn *col) {
        if (*((lng*) col->buffer_ptr) == *((lng*)col->null_value)) return NULL;
-       if (conversion_epoch_tz_to_string(col->write_buf, COLBUFSIZ, (lng*) 
col->buffer_ptr, *((lng*)col->null_value), col->timezone) < 0) {
+       if (conversion_epoch_tz_to_string(col->write_buf, COLBUFSIZ, (lng*) 
col->buffer_ptr, *((lng*)col->null_value), col->digits, col->timezone) < 0) {
                return NULL;
        }
        return (char*) col->write_buf;
diff --git a/common/utils/conversion.c b/common/utils/conversion.c
--- a/common/utils/conversion.c
+++ b/common/utils/conversion.c
@@ -323,6 +323,7 @@ conversion_time_optional_tz_to_string(ch
                if ((res = snprintf(dst + (9 + digits), len - (9 + digits), 
"%s%02d:%02d", original_diff >= 0 ? "+" : "", diff_hour, diff_min)) < 0) {
                        return res;
                }
+               return 15 + digits;
        }
        return 9 + digits;
 }
@@ -360,17 +361,28 @@ conversion_timestamp_get_data(lng time, 
        conversion_date_get_data(days, year, month, day);
 }
 static int
-conversion_epoch_optional_tz_to_string(char *dst, int len, const lng *src, lng 
null_value, int include_timezone, int timezone_diff) {
+conversion_epoch_optional_tz_to_string(char *dst, int len, const lng *src, lng 
null_value, int digits, int include_timezone, int timezone_diff) {
        short year;
        unsigned short month, day, hour, min, sec;
        unsigned int nanosecond;
        lng time = *src;
+       int res = 0;
        if (*src == null_value) {
                strcpy(dst, NULL_STRING);
                return 3;
        }
 
        conversion_timestamp_get_data(*src, timezone_diff, &year, &month, &day, 
&hour, &min, &sec, &nanosecond);
+
+       if ((res = snprintf(dst, len, "%d-%02d-%02d %02d:%02d:%02d.%06d", year, 
month, day,  hour, min, sec, nanosecond)) < 0) {
+               return res;
+       }
+       digits--;
+       if (digits == 0) digits = -1;
+       res += digits - 6;
+       // adjust displayed precision based on the digits
+       dst[res] = '\0';
+
        if (include_timezone) {
                int diff_hour, diff_min;
                int original_diff = timezone_diff;
@@ -378,19 +390,22 @@ conversion_epoch_optional_tz_to_string(c
                diff_hour = timezone_diff / 3600000;
                timezone_diff -= diff_hour * 3600000;
                diff_min = timezone_diff / 60000;
-               return snprintf(dst, len, "%d-%02d-%02d 
%02d:%02d:%02d.%06d%s%02d:%02d", year, month, day, hour, min, sec, nanosecond, 
original_diff >= 0 ? "+" : "", diff_hour, diff_min);
+               if ((res = snprintf(dst + res, len - res, "%s%02d:%02d", 
original_diff >= 0 ? "+" : "", diff_hour, diff_min)) < 0) {
+                       return res;
+               }
+               return res;
        }
-       return snprintf(dst, len, "%d-%02d-%02d %02d:%02d:%02d.%06d", year, 
month, day,  hour, min, sec, nanosecond);
+       return res;
 }
 
 int
-conversion_epoch_to_string(char *dst, int len, const lng *src, lng null_value) 
{
-       return conversion_epoch_optional_tz_to_string(dst, len, src, 
null_value, 0, 0);
+conversion_epoch_to_string(char *dst, int len, const lng *src, lng null_value, 
int digits) {
+       return conversion_epoch_optional_tz_to_string(dst, len, src, 
null_value, digits, 0, 0);
 }
 
 int 
-conversion_epoch_tz_to_string(char *dst, int len, const lng *src, lng 
null_value, int timezone_diff) {
-       return conversion_epoch_optional_tz_to_string(dst, len, src, 
null_value, 1, timezone_diff);
+conversion_epoch_tz_to_string(char *dst, int len, const lng *src, lng 
null_value, int digits, int timezone_diff) {
+       return conversion_epoch_optional_tz_to_string(dst, len, src, 
null_value, digits, 1, timezone_diff);
 }
 
 static char hexit[] = "0123456789ABCDEF";
diff --git a/common/utils/conversion.h b/common/utils/conversion.h
--- a/common/utils/conversion.h
+++ b/common/utils/conversion.h
@@ -70,8 +70,8 @@ int conversion_timetz_to_string(char *ds
 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
-int conversion_epoch_to_string(char *dst, int len, const lng *src, lng 
null_value);
-int conversion_epoch_tz_to_string(char *dst, int len, const lng *src, lng 
null_value, int timezone_diff);
+int conversion_epoch_to_string(char *dst, int len, const lng *src, lng 
null_value, int digits);
+int conversion_epoch_tz_to_string(char *dst, int len, const lng *src, lng 
null_value, int digits, int timezone_diff);
 
 void conversion_timestamp_get_data(lng timestamp, int timezone_diff, short 
*year, unsigned short *month, unsigned short *day, unsigned short *hour, 
unsigned short *minute, unsigned short *second, unsigned int *nanosecond);
 
diff --git a/sql/backends/monet5/sql_result.c b/sql/backends/monet5/sql_result.c
--- a/sql/backends/monet5/sql_result.c
+++ b/sql/backends/monet5/sql_result.c
@@ -2059,7 +2059,7 @@ int mvc_export_resultset_prot10(mvc *m, 
                                        if (convert_to_string || 
ATOMvarsized(mtype)) {
                                                if (c->type.type->eclass == 
EC_BLOB) {
                                                        blob *b = (blob*) 
BUNtail(iterators[i], row);
-                                                       rowsize += sizeof(lng) 
+ (b->nitems == ~(size_t) 0) ? 0 : b->nitems;
+                                                       rowsize += sizeof(lng) 
+ ((b->nitems == ~(size_t) 0) ? 0 : b->nitems);
                                                } else {
                                                        size_t slen = 
strlen((const char*) BUNtail(iterators[i], row));
                                                        rowsize += slen + 1;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to