diff --git a/src/main/java/org/utplsql/api/compatibility/OptionalFeatures.java b/src/main/java/org/utplsql/api/compatibility/OptionalFeatures.java index 8325885..08d6546 100644 --- a/src/main/java/org/utplsql/api/compatibility/OptionalFeatures.java +++ b/src/main/java/org/utplsql/api/compatibility/OptionalFeatures.java @@ -3,6 +3,9 @@ import org.utplsql.api.Version; import org.utplsql.api.exception.InvalidVersionException; +import java.sql.Connection; +import java.sql.SQLException; + public enum OptionalFeatures { FAIL_ON_ERROR("3.0.3", null), @@ -33,4 +36,9 @@ public boolean isAvailableFor(Version version ) { return false; // We have no optional features for invalid versions } } + + public boolean isAvailableFor(Connection conn) throws SQLException { + CompatibilityProxy proxy = new CompatibilityProxy(conn); + return isAvailableFor(proxy.getDatabaseVersion()); + } } diff --git a/src/main/java/org/utplsql/api/outputBuffer/AbstractOutputBuffer.java b/src/main/java/org/utplsql/api/outputBuffer/AbstractOutputBuffer.java index 0211663..1fa2f43 100644 --- a/src/main/java/org/utplsql/api/outputBuffer/AbstractOutputBuffer.java +++ b/src/main/java/org/utplsql/api/outputBuffer/AbstractOutputBuffer.java @@ -20,6 +20,7 @@ abstract class AbstractOutputBuffer implements OutputBuffer { private Reporter reporter; + private int fetchSize = 100; /** * Creates a new DefaultOutputBuffer. @@ -40,6 +41,11 @@ public Reporter getReporter() { return reporter; } + @Override + public void setFetchSize(int fetchSize) { + this.fetchSize = fetchSize; + } + /** * Print the lines as soon as they are produced and write to a PrintStream. * @param conn DB connection @@ -77,7 +83,7 @@ public void fetchAvailable(Connection conn, Consumer onLineFetched) thro try (CallableStatement cstmt = getLinesCursorStatement(conn)) { cstmt.execute(); - cstmt.setFetchSize(1); + cstmt.setFetchSize(fetchSize); try ( ResultSet resultSet = (ResultSet) cstmt.getObject(1)) { while (resultSet.next()) @@ -97,6 +103,7 @@ public List fetchAll(Connection conn) throws SQLException { try (CallableStatement cstmt = getLinesCursorStatement(conn)) { cstmt.execute(); + cstmt.setFetchSize(fetchSize); try ( ResultSet resultSet = (ResultSet) cstmt.getObject(1)) { diff --git a/src/main/java/org/utplsql/api/outputBuffer/NonOutputBuffer.java b/src/main/java/org/utplsql/api/outputBuffer/NonOutputBuffer.java index 58e040f..7b981d1 100644 --- a/src/main/java/org/utplsql/api/outputBuffer/NonOutputBuffer.java +++ b/src/main/java/org/utplsql/api/outputBuffer/NonOutputBuffer.java @@ -26,6 +26,11 @@ public Reporter getReporter() { return reporter; } + @Override + public void setFetchSize(int fetchSize) { + + } + @Override public void printAvailable(Connection conn, PrintStream ps) throws SQLException { List printStreams = new ArrayList<>(1); diff --git a/src/main/java/org/utplsql/api/outputBuffer/OutputBuffer.java b/src/main/java/org/utplsql/api/outputBuffer/OutputBuffer.java index c3e7d34..09d82ef 100644 --- a/src/main/java/org/utplsql/api/outputBuffer/OutputBuffer.java +++ b/src/main/java/org/utplsql/api/outputBuffer/OutputBuffer.java @@ -12,6 +12,12 @@ public interface OutputBuffer { Reporter getReporter(); + /** Override the fetchSize of the OutputBuffer + * + * @param fetchSize the ResultSet fetch-size. + */ + void setFetchSize( int fetchSize ); + /** * Print the lines as soon as they are produced and write to a PrintStream. * @param conn DB connection diff --git a/src/test/java/org/utplsql/api/OptionalFeaturesIT.java b/src/test/java/org/utplsql/api/OptionalFeaturesIT.java new file mode 100644 index 0000000..2115f52 --- /dev/null +++ b/src/test/java/org/utplsql/api/OptionalFeaturesIT.java @@ -0,0 +1,51 @@ +package org.utplsql.api; + +import org.junit.jupiter.api.Test; +import org.utplsql.api.compatibility.CompatibilityProxy; +import org.utplsql.api.compatibility.OptionalFeatures; +import org.utplsql.api.exception.InvalidVersionException; + +import java.sql.SQLException; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class OptionalFeaturesIT extends AbstractDatabaseTest { + + + private Version getDatabaseVersion() throws SQLException { + return new CompatibilityProxy(getConnection()).getDatabaseVersion(); + } + + @Test + public void failOnError() throws SQLException, InvalidVersionException { + + boolean available = OptionalFeatures.FAIL_ON_ERROR.isAvailableFor(getConnection()); + + if (getDatabaseVersion().isGreaterOrEqualThan(new Version("3.0.3"))) + assertEquals(true, available); + else + assertEquals(false, available); + } + + @Test + public void frameworkCompatibilityCheck() throws SQLException, InvalidVersionException { + + boolean available = OptionalFeatures.FRAMEWORK_COMPATIBILITY_CHECK.isAvailableFor(getConnection()); + + if (getDatabaseVersion().isGreaterOrEqualThan(new Version("3.0.3"))) + assertEquals(true, available); + else + assertEquals(false, available); + } + + @Test + public void customReporters() throws SQLException, InvalidVersionException { + + boolean available = OptionalFeatures.CUSTOM_REPORTERS.isAvailableFor(getConnection()); + + if (getDatabaseVersion().isGreaterOrEqualThan(new Version("3.1.0"))) + assertEquals(true, available); + else + assertEquals(false, available); + } +} diff --git a/src/test/java/org/utplsql/api/OutputBufferIT.java b/src/test/java/org/utplsql/api/OutputBufferIT.java index dabd407..f9b5b1f 100644 --- a/src/test/java/org/utplsql/api/OutputBufferIT.java +++ b/src/test/java/org/utplsql/api/OutputBufferIT.java @@ -59,6 +59,7 @@ public void printAvailableLines() throws SQLException { printStreams.add(System.out); printStreams.add(new PrintStream(fileOutStream)); + reporter.getOutputBuffer().setFetchSize(1); reporter.getOutputBuffer().printAvailable(newConnection(), printStreams); return Boolean.TRUE;