[CSV-123] Add possibility to use ResultSet header meta data as CSV

header #11.
This commit is contained in:
Gary Gregory 2021-02-22 21:32:23 -05:00
parent 0b01ea8211
commit cfd55c9473
3 changed files with 61 additions and 9 deletions

View File

@ -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>

View File

@ -224,6 +224,18 @@ public final class CSVPrinter implements Flushable, Closeable {
println();
}
/**
* 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.
*
@ -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);
}
}

View File

@ -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");
@ -647,11 +648,32 @@ public class CSVPrinterTest {
+ "\"" + recordSeparator, sw.toString());
}
@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");