This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-csv.git
commit cfd55c94732c85861cdea82b819b34fbbb5377bb Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Mon Feb 22 21:32:23 2021 -0500 [CSV-123] Add possibility to use ResultSet header meta data as CSV header #11. --- src/changes/changes.xml | 4 ++- .../java/org/apache/commons/csv/CSVPrinter.java | 28 ++++++++++++++++ .../org/apache/commons/csv/CSVPrinterTest.java | 38 +++++++++++++++++----- 3 files changed, 61 insertions(+), 9 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 81571ac..9315846 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -55,7 +55,9 @@ <action issue="CSV-149" type="fix" dev="ggregory" due-to="Kranthi, Gary Gregory, Brent Worden, dota17">Line number is not proper at EOF.</action> <action issue="CSV-195" type="fix" dev="ggregory" due-to="Rodolfo Duldulao, Rodolfo Duldulao, Michael Vitz, dota17">Parser iterates over the last CSV Record twice.</action> <action issue="CSV-267" type="fix" dev="ggregory" due-to="Arturo Bernal">Minor improvements #126, #127.</action> - <!-- UPDATES --> + <action issue="CSV-123" type="fix" dev="ggregory" due-to="Emmanuel Bourg, Benedikt Ritter, shivakrishnaah, Gary Gregory">Add possibility to use ResultSet header meta data as CSV header #11.</action> + <!-- ADD --> + <!-- UPDATE --> <action type="update" dev="ggregory" due-to="Gary Gregory">Update org.junit.jupiter:junit-jupiter from 5.6.0 to 5.7.0, #84 #109</action> <action type="update" dev="ggregory" due-to="Gary Gregory">Update tests from Apache Commons Lang 3.9 to 3.11.</action> <action type="update" dev="ggregory" due-to="Gary Gregory">Update tests from commons-io:commons-io 2.6 to 2.8.0, #108.</action> diff --git a/src/main/java/org/apache/commons/csv/CSVPrinter.java b/src/main/java/org/apache/commons/csv/CSVPrinter.java index a0cc612..d3c262e 100644 --- a/src/main/java/org/apache/commons/csv/CSVPrinter.java +++ b/src/main/java/org/apache/commons/csv/CSVPrinter.java @@ -225,6 +225,18 @@ public final class CSVPrinter implements Flushable, Closeable { } /** + * Prints headers for a result set based on its metadata. + * + * @param resultSet The result set to query for metadata. + * @throws IOException If an I/O error occurs. + * @throws SQLException If a database access error occurs or this method is called on a closed result set. + * @since 1.9.0 + */ + public void printHeaders(final ResultSet resultSet) throws IOException, SQLException { + printRecord((Object[]) format.withHeader(resultSet).getHeader()); + } + + /** * Outputs the record separator. * * @throws IOException @@ -388,4 +400,20 @@ public final class CSVPrinter implements Flushable, Closeable { println(); } } + + /** + * Prints all the objects with metadata in the given JDBC result set based on the header boolean. + * + * @param resultSet result set the values to print. + * @param printHeader Boolean value to print header or not. + * @throws IOException If an I/O error occurs + * @throws SQLException if a database access error occurs + * @since 1.9.0 + */ + public void printRecords(final ResultSet resultSet, final boolean printHeader) throws SQLException, IOException { + if (printHeader) { + printHeaders(resultSet); + } + printRecords(resultSet); + } } diff --git a/src/test/java/org/apache/commons/csv/CSVPrinterTest.java b/src/test/java/org/apache/commons/csv/CSVPrinterTest.java index 39e83b0..120c857 100644 --- a/src/test/java/org/apache/commons/csv/CSVPrinterTest.java +++ b/src/test/java/org/apache/commons/csv/CSVPrinterTest.java @@ -21,6 +21,7 @@ import static org.apache.commons.csv.Constants.CR; import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -29,13 +30,13 @@ import static org.mockito.Mockito.verify; import java.io.CharArrayWriter; import java.io.File; +import java.io.FileReader; import java.io.IOException; import java.io.PrintStream; +import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; import java.io.Writer; -import java.io.Reader; -import java.io.FileReader; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.sql.BatchUpdateException; @@ -62,7 +63,7 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; /** - * + * Tests {@link CSVPrinter}. */ public class CSVPrinterTest { @@ -86,8 +87,8 @@ public class CSVPrinterTest { } private final String recordSeparator = CSVFormat.DEFAULT.getRecordSeparator(); - private String longText2; + private String longText2; private void doOneRandom(final CSVFormat format) throws Exception { final Random r = new Random(); @@ -140,7 +141,7 @@ public class CSVPrinterTest { return fixed; } - private Connection geH2Connection() throws SQLException, ClassNotFoundException { + private Connection getH2Connection() throws SQLException, ClassNotFoundException { Class.forName("org.h2.Driver"); return DriverManager.getConnection("jdbc:h2:mem:my_test;", "sa", ""); } @@ -620,7 +621,7 @@ public class CSVPrinterTest { @Test public void testJdbcPrinter() throws IOException, ClassNotFoundException, SQLException { final StringWriter sw = new StringWriter(); - try (final Connection connection = geH2Connection()) { + try (final Connection connection = getH2Connection()) { setUpTable(connection); try (final Statement stmt = connection.createStatement(); final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT)) { @@ -635,7 +636,7 @@ public class CSVPrinterTest { public void testJdbcPrinterWithResultSet() throws IOException, ClassNotFoundException, SQLException { final StringWriter sw = new StringWriter(); Class.forName("org.h2.Driver"); - try (final Connection connection = geH2Connection()) { + try (final Connection connection = getH2Connection()) { setUpTable(connection); try (final Statement stmt = connection.createStatement(); final ResultSet resultSet = stmt.executeQuery("select ID, NAME, TEXT from TEST"); @@ -648,10 +649,31 @@ public class CSVPrinterTest { } @Test + public void testJdbcPrinterWithResultSetHeader() throws IOException, ClassNotFoundException, SQLException { + final StringWriter sw = new StringWriter(); + try (final Connection connection = getH2Connection()) { + setUpTable(connection); + try (final Statement stmt = connection.createStatement(); + final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT);) { + try (final ResultSet resultSet = stmt.executeQuery("select ID, NAME from TEST")) { + printer.printRecords(resultSet, true); + assertEquals("ID,NAME" + recordSeparator + "1,r1" + recordSeparator + "2,r2" + recordSeparator, + sw.toString()); + } + try (final ResultSet resultSet = stmt.executeQuery("select ID, NAME from TEST")) { + printer.printRecords(resultSet, false); + assertNotEquals("ID,NAME" + recordSeparator + "1,r1" + recordSeparator + "2,r2" + recordSeparator, + sw.toString()); + } + } + } + } + + @Test public void testJdbcPrinterWithResultSetMetaData() throws IOException, ClassNotFoundException, SQLException { final StringWriter sw = new StringWriter(); Class.forName("org.h2.Driver"); - try (final Connection connection = geH2Connection()) { + try (final Connection connection = getH2Connection()) { setUpTable(connection); try (final Statement stmt = connection.createStatement(); final ResultSet resultSet = stmt.executeQuery("select ID, NAME, TEXT from TEST");