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