From fbd40a35faf1af74ac6363049941dc664ff76a7f Mon Sep 17 00:00:00 2001 From: "philip.cline" Date: Tue, 4 Jul 2023 17:02:46 -0400 Subject: [PATCH] fix(exceptions): allow commas in service IDs --- src/main/java/com/conveyal/gtfs/loader/JdbcTableWriter.java | 5 ++++- src/main/java/com/conveyal/gtfs/loader/StringListField.java | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/conveyal/gtfs/loader/JdbcTableWriter.java b/src/main/java/com/conveyal/gtfs/loader/JdbcTableWriter.java index ffd669ed1..a967f0f96 100644 --- a/src/main/java/com/conveyal/gtfs/loader/JdbcTableWriter.java +++ b/src/main/java/com/conveyal/gtfs/loader/JdbcTableWriter.java @@ -427,7 +427,10 @@ private void setStatementParameters( // Array field type expects comma-delimited values. List values = new ArrayList<>(); for (JsonNode node : value) { - values.add(node.asText()); + String nodeText = node.asText(); + // Surround text value in quotes to preserve any internal commas + if (field instanceof StringListField) nodeText = "\"" + nodeText + "\""; + values.add(nodeText); } field.setParameter(preparedStatement, index, String.join(",", values)); } else { diff --git a/src/main/java/com/conveyal/gtfs/loader/StringListField.java b/src/main/java/com/conveyal/gtfs/loader/StringListField.java index 6319afe67..63474339c 100644 --- a/src/main/java/com/conveyal/gtfs/loader/StringListField.java +++ b/src/main/java/com/conveyal/gtfs/loader/StringListField.java @@ -7,6 +7,7 @@ import java.sql.JDBCType; import java.sql.PreparedStatement; import java.sql.SQLType; +import java.util.Arrays; import java.util.Collections; import java.util.Set; @@ -34,7 +35,10 @@ public ValidateFieldResult validateAndConvert(String original) { public Set setParameter(PreparedStatement preparedStatement, int oneBasedIndex, String string) { // FIXME try { - Array array = preparedStatement.getConnection().createArrayOf("text", string.split(",")); + String[] stringList = string.split("(?<=\"),"); + // Clean the string list of any escaped quotations which are required to preserve any internal commas + stringList = Arrays.stream(stringList).map(s -> s.replace("\"", "")).toArray(String[]::new); + Array array = preparedStatement.getConnection().createArrayOf("text", stringList); preparedStatement.setArray(oneBasedIndex, array); return Collections.EMPTY_SET; } catch (Exception e) {