From 463264dab5ca94470e678a3845783c0ae5c1d97c Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 25 Jun 2020 17:18:03 +0200 Subject: [PATCH] [jOOQ/jOOQ#8829] Loader does not work with binary data in JSON --- jOOQ/src/main/java/org/jooq/impl/JSONReader.java | 12 +++++++++++- jOOQ/src/main/java/org/jooq/impl/LoaderImpl.java | 1 + 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONReader.java b/jOOQ/src/main/java/org/jooq/impl/JSONReader.java index cb69dc63d8..3cbecf6e32 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONReader.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONReader.java @@ -53,6 +53,8 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import javax.xml.bind.DatatypeConverter; + import org.jooq.DSLContext; import org.jooq.Field; import org.jooq.Record; @@ -79,6 +81,7 @@ final class JSONReader { return read(new StringReader(string)); } + @SuppressWarnings("rawtypes") final Result read(final Reader reader) { try { @@ -154,7 +157,7 @@ final class JSONReader { result.add(r); } else { - List record = (List) o3; + List record = (List) o3; if (result == null) { if (f.isEmpty()) @@ -164,6 +167,13 @@ final class JSONReader { } Record r = ctx.newRecord(f); + + // [#8829] LoaderImpl expects binary data to be encoded in base64, + // not according to org.jooq.tools.Convert + for (int i = 0; i < f.size(); i++) + if (f.get(i).getType() == byte[].class && record.get(i) instanceof String) + record.set(i, DatatypeConverter.parseBase64Binary((String) record.get(i))); + r.from(record); result.add(r); } diff --git a/jOOQ/src/main/java/org/jooq/impl/LoaderImpl.java b/jOOQ/src/main/java/org/jooq/impl/LoaderImpl.java index f9d61147aa..13ce967fef 100644 --- a/jOOQ/src/main/java/org/jooq/impl/LoaderImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/LoaderImpl.java @@ -755,6 +755,7 @@ final class LoaderImpl implements // [#1627] [#5858] Handle NULL values and base64 encodings // [#2741] TODO: This logic will be externalised in new SPI + // [#8829] JSON binary data has already been decoded at this point for (int i = 0; i < row.length; i++) if (StringUtils.equals(nullString, row[i])) row[i] = null;