diff --git a/src/main/java/org/utplsql/api/DBHelper.java b/src/main/java/org/utplsql/api/DBHelper.java index bfe6c94..8b8339b 100644 --- a/src/main/java/org/utplsql/api/DBHelper.java +++ b/src/main/java/org/utplsql/api/DBHelper.java @@ -12,6 +12,8 @@ */ public final class DBHelper { + public static final String UTPLSQL_COMPATIBILITY_VERSION = "3.0.3"; + private DBHelper() {} /** @@ -52,4 +54,70 @@ public static String getCurrentSchema(Connection conn) throws SQLException { } } + /** + * Check the utPLSQL version compatibility. + * @param conn the connection + * @return true if the requested utPLSQL version is compatible with the one installed on database + * @throws SQLException any database error + */ + public static boolean versionCompatibilityCheck(Connection conn, String requested, String current) + throws SQLException { + CallableStatement callableStatement = null; + try { + callableStatement = conn.prepareCall("BEGIN ? := ut_runner.version_compatibility_check(?, ?); END;"); + callableStatement.registerOutParameter(1, Types.SMALLINT); + callableStatement.setString(2, requested); + + if (current == null) + callableStatement.setNull(3, Types.VARCHAR); + else + callableStatement.setString(3, current); + + callableStatement.executeUpdate(); + return callableStatement.getInt(1) == 1; + } catch (SQLException e) { + if (e.getErrorCode() == 6550) + return false; + else + throw e; + } finally { + if (callableStatement != null) + callableStatement.close(); + } + } + + public static boolean versionCompatibilityCheck(Connection conn, String requested) + throws SQLException { + return versionCompatibilityCheck(conn, requested, null); + } + + public static boolean versionCompatibilityCheck(Connection conn) + throws SQLException { + return versionCompatibilityCheck(conn, UTPLSQL_COMPATIBILITY_VERSION); + } + + /** + * Enable the dbms_output buffer with unlimited size. + * @param conn the connection + */ + public static void enableDBMSOutput(Connection conn) { + try (CallableStatement call = conn.prepareCall("BEGIN dbms_output.enable(NULL); END;")) { + call.execute(); + } catch (SQLException e) { + System.out.println("Failed to enable dbms_output."); + } + } + + /** + * Disable the dbms_output buffer. + * @param conn the connection + */ + public static void disableDBMSOutput(Connection conn) { + try (CallableStatement call = conn.prepareCall("BEGIN dbms_output.disable(); END;")) { + call.execute(); + } catch (SQLException e) { + System.out.println("Failed to disable dbms_output."); + } + } + } diff --git a/src/main/java/org/utplsql/api/TestRunner.java b/src/main/java/org/utplsql/api/TestRunner.java index 532921c..549caa4 100644 --- a/src/main/java/org/utplsql/api/TestRunner.java +++ b/src/main/java/org/utplsql/api/TestRunner.java @@ -103,6 +103,8 @@ public void run(Connection conn) throws SomeTestsFailedException, SQLException { OracleConnection oraConn = conn.unwrap(OracleConnection.class); CallableStatement callableStatement = null; try { + DBHelper.enableDBMSOutput(conn); + callableStatement = conn.prepareCall( "BEGIN " + "ut_runner.run(" + @@ -172,8 +174,11 @@ public void run(Connection conn) throws SomeTestsFailedException, SQLException { throw e; } } finally { - if (callableStatement != null) + if (callableStatement != null) { callableStatement.close(); + } + + DBHelper.disableDBMSOutput(conn); } } diff --git a/src/test/java/org/utplsql/api/DBHelperTest.java b/src/test/java/org/utplsql/api/DBHelperTest.java new file mode 100644 index 0000000..3761650 --- /dev/null +++ b/src/test/java/org/utplsql/api/DBHelperTest.java @@ -0,0 +1,37 @@ +package org.utplsql.api; + +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.utplsql.api.rules.DatabaseRule; + +import java.sql.SQLException; + +public class DBHelperTest { + + @Rule + public final DatabaseRule db = new DatabaseRule(); + + @Test + public void compatibleVersion() { + try { + boolean isCompatible = DBHelper.versionCompatibilityCheck(db.newConnection(), "3.0.0", "3.0.0"); + Assert.assertTrue(isCompatible); + } catch (SQLException e) { + e.printStackTrace(); + Assert.fail(); + } + } + + @Test + public void incompatibleVersion() { + try { + boolean isCompatible = DBHelper.versionCompatibilityCheck(db.newConnection(), "3.1.0", "3.0.0"); + Assert.assertFalse(isCompatible); + } catch (SQLException e) { + e.printStackTrace(); + Assert.fail(); + } + } + +}