diff --git a/CHANGELOG.md b/CHANGELOG.md index 607d07a90bd..18f3317cdd5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ ## 1.10.0 [unreleased] +### Bug Fixes +1. [#129](https://github.com/influxdata/influxdb-client-java/pull/129): Fixed serialization of `\n`, `\r` and `\t` to Line Protocol, `=` is valid sign for measurement name + ### Dependencies 1. [#124](https://github.com/influxdata/influxdb-client-java/pull/124): Update dependencies: akka: 2.6.6, commons-io: 2.7, spring: 5.2.7.RELEASE, retrofit: 2.9.0, okhttp3: 4.7.2 diff --git a/client/src/main/java/com/influxdb/client/write/Point.java b/client/src/main/java/com/influxdb/client/write/Point.java index fd2dbf44843..65cb7f88159 100644 --- a/client/src/main/java/com/influxdb/client/write/Point.java +++ b/client/src/main/java/com/influxdb/client/write/Point.java @@ -303,7 +303,7 @@ public String toLineProtocol(@Nullable final PointSettings pointSettings) { StringBuilder sb = new StringBuilder(); - escapeKey(sb, name); + escapeKey(sb, name, false); appendTags(sb, pointSettings); boolean appendedFields = appendFields(sb); if (!appendedFields) { @@ -421,15 +421,34 @@ private void appendTime(@Nonnull final StringBuilder sb) { } private void escapeKey(@Nonnull final StringBuilder sb, @Nonnull final String key) { + escapeKey(sb, key, true); + } + + private void escapeKey(@Nonnull final StringBuilder sb, @Nonnull final String key, final boolean escapeEqual) { for (int i = 0; i < key.length(); i++) { switch (key.charAt(i)) { + case '\n': + sb.append("\\n"); + continue; + case '\r': + sb.append("\\r"); + continue; + case '\t': + sb.append("\\t"); + continue; case ' ': case ',': - case '=': sb.append('\\'); + break; + case '=': + if (escapeEqual) { + sb.append('\\'); + } + break; default: - sb.append(key.charAt(i)); } + + sb.append(key.charAt(i)); } } diff --git a/client/src/test/java/com/influxdb/client/internal/MeasurementMapperTest.java b/client/src/test/java/com/influxdb/client/internal/MeasurementMapperTest.java index 839202ffbbb..82efd4c41ea 100644 --- a/client/src/test/java/com/influxdb/client/internal/MeasurementMapperTest.java +++ b/client/src/test/java/com/influxdb/client/internal/MeasurementMapperTest.java @@ -101,6 +101,17 @@ void instantOver2226() { Assertions.assertThat(mapper.toPoint(pojo, WritePrecision.NS).toLineProtocol()).isEqualTo("pojo,tag=value value=\"15\" 43658216763800123456"); } + @Test + public void escapingTags() { + + Pojo pojo = new Pojo(); + pojo.tag = "mad\nrid"; + pojo.value = 5; + + String lineProtocol = mapper.toPoint(pojo, WritePrecision.S).toLineProtocol(); + Assertions.assertThat(lineProtocol).isEqualTo("pojo,tag=mad\\nrid value=\"5\""); + } + @Measurement(name = "pojo") private static class Pojo { diff --git a/client/src/test/java/com/influxdb/client/write/PointTest.java b/client/src/test/java/com/influxdb/client/write/PointTest.java index 61a84e20b9f..30be6d6ab84 100644 --- a/client/src/test/java/com/influxdb/client/write/PointTest.java +++ b/client/src/test/java/com/influxdb/client/write/PointTest.java @@ -54,7 +54,7 @@ void measurementEscape() { .addTag("", "warn") .addField("level", 2); - Assertions.assertThat(point.toLineProtocol()).isEqualTo("h2\\=o,location=europe level=2i"); + Assertions.assertThat(point.toLineProtocol()).isEqualTo("h2=o,location=europe level=2i"); point = Point.measurement("h2,o") .addTag("location", "europe") @@ -86,6 +86,30 @@ void tagEmptyValue() { Assertions.assertThat(point.toLineProtocol()).isEqualTo("h2o,location=europe level=2i"); } + @Test + public void tagEscapingKeyAndValue() { + + Point point = Point.measurement("h\n2\ro\t_data") + .addTag("new\nline", "new\nline") + .addTag("carriage\rreturn", "carriage\rreturn") + .addTag("t\tab", "t\tab") + .addField("level", 2); + + Assertions.assertThat(point.toLineProtocol()) + .isEqualTo("h\\n2\\ro\\t_data,carriage\\rreturn=carriage\\rreturn,new\\nline=new\\nline,t\\tab=t\\tab level=2i"); + } + + @Test + public void equalSignEscaping() { + + Point point = Point.measurement("h=2o") + .addTag("l=ocation", "e=urope") + .addField("l=evel", 2); + + Assertions.assertThat(point.toLineProtocol()) + .isEqualTo("h=2o,l\\=ocation=e\\=urope l\\=evel=2i"); + } + @Test void fieldTypes() {