diff --git a/include/fluent-bit/flb_pack.h b/include/fluent-bit/flb_pack.h index 8c98e917752..6e66c42a341 100644 --- a/include/fluent-bit/flb_pack.h +++ b/include/fluent-bit/flb_pack.h @@ -36,13 +36,17 @@ #define FLB_PACK_JSON_PRIMITIVE JSMN_PRIMITIVE /* Date formats */ -#define FLB_PACK_JSON_DATE_DOUBLE 0 -#define FLB_PACK_JSON_DATE_ISO8601 1 -#define FLB_PACK_JSON_DATE_EPOCH 2 +#define FLB_PACK_JSON_DATE_DOUBLE 0 +#define FLB_PACK_JSON_DATE_ISO8601 1 +#define FLB_PACK_JSON_DATE_EPOCH 2 +#define FLB_PACK_JSON_DATE_JAVA_SQL_TIMESTAMP 3 /* Specific ISO8601 format */ #define FLB_PACK_JSON_DATE_ISO8601_FMT "%Y-%m-%dT%H:%M:%S" +/* Specific Java SQL Timestamp format */ +#define FLB_PACK_JSON_DATE_JAVA_SQL_TIMESTAMP_FMT "%Y-%m-%d %H:%M:%S" + /* JSON formats (modes) */ #define FLB_PACK_JSON_FORMAT_NONE 0 #define FLB_PACK_JSON_FORMAT_JSON 1 diff --git a/src/flb_pack.c b/src/flb_pack.c index 78783354d75..4846b8fd781 100644 --- a/src/flb_pack.c +++ b/src/flb_pack.c @@ -774,6 +774,9 @@ int flb_pack_to_json_date_type(const char *str) if (strcasecmp(str, "double") == 0) { return FLB_PACK_JSON_DATE_DOUBLE; } + else if (strcasecmp(str, "java_sql_timestamp") == 0) { + return FLB_PACK_JSON_DATE_JAVA_SQL_TIMESTAMP; + } else if (strcasecmp(str, "iso8601") == 0) { return FLB_PACK_JSON_DATE_ISO8601; } @@ -883,6 +886,20 @@ flb_sds_t flb_pack_msgpack_to_json_format(const char *data, uint64_t bytes, case FLB_PACK_JSON_DATE_DOUBLE: msgpack_pack_double(&tmp_pck, flb_time_to_double(&tms)); break; + case FLB_PACK_JSON_DATE_JAVA_SQL_TIMESTAMP: + /* Format the time, use microsecond precision not nanoseconds */ + gmtime_r(&tms.tm.tv_sec, &tm); + s = strftime(time_formatted, sizeof(time_formatted) - 1, + FLB_PACK_JSON_DATE_JAVA_SQL_TIMESTAMP_FMT, &tm); + + len = snprintf(time_formatted + s, + sizeof(time_formatted) - 1 - s, + ".%06" PRIu64, + (uint64_t) tms.tm.tv_nsec / 1000); + s += len; + msgpack_pack_str(&tmp_pck, s); + msgpack_pack_str_body(&tmp_pck, time_formatted, s); + break; case FLB_PACK_JSON_DATE_ISO8601: /* Format the time, use microsecond precision not nanoseconds */ gmtime_r(&tms.tm.tv_sec, &tm);