From 0973d3d421db3ee0fc0e383799741e70bf034b3f Mon Sep 17 00:00:00 2001 From: Zoran Zaric Date: Wed, 1 Nov 2017 10:48:49 +0100 Subject: [PATCH] Implement db output reading --- .../java/at/compax/tools/sql/SqlExecutor.java | 81 ++++++++++++++----- .../java/at/compax/tools/sql/main/Main.java | 18 ++--- .../at/compax/tools/sql/model/Result.java | 1 + 3 files changed, 72 insertions(+), 28 deletions(-) diff --git a/src/main/java/at/compax/tools/sql/SqlExecutor.java b/src/main/java/at/compax/tools/sql/SqlExecutor.java index a843af6..c488b29 100644 --- a/src/main/java/at/compax/tools/sql/SqlExecutor.java +++ b/src/main/java/at/compax/tools/sql/SqlExecutor.java @@ -1,6 +1,8 @@ package at.compax.tools.sql; import java.io.IOException; +import java.sql.CallableStatement; +import java.sql.Clob; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -62,6 +64,8 @@ public class SqlExecutor { resultBuilder.userErrors(e.getUserErrors()); } + resultBuilder.dbOutput(parseDbOutput(conn)); + return resultBuilder.build(); } @@ -162,7 +166,12 @@ public class SqlExecutor { } else if (columnType == Types.TIMESTAMP) { columnBuilder.value(rs.getTimestamp(columnIndex)); } else if (columnType == Types.CLOB) { - columnBuilder.value(rs.getClob(columnIndex).getSubString(1, 100)); + Clob clob = rs.getClob(columnIndex); + if (clob != null) { + columnBuilder.value(clob.getSubString(1, 100)); + } else { + columnBuilder.value(null); + } } else if (columnType == Types.BLOB) { columnBuilder.value("[BLOB]"); } else { @@ -179,6 +188,7 @@ public class SqlExecutor { return queryResultBuilder.rows(rows).build(); } + public static QueryResult executeUpdate(Connection conn, String sql, Object... parameters) throws SQLException { log.trace("SQL: " + sql.trim()); String updateQuery = sql.replaceAll(";$", "").trim(); @@ -208,27 +218,27 @@ public class SqlExecutor { } } - long affectedRows = 0L; - QueryResultBuilder queryResultBuilder = QueryResult.builder(); - try { - affectedRows = stmt.executeUpdate(); - } catch (SQLException e) { - return queryResultBuilder // - .exception(e.getClass().getName()) // - .exceptionMessage(e.getMessage()) // - .build(); - } + long affectedRows = 0L; + QueryResultBuilder queryResultBuilder = QueryResult.builder(); + try { + affectedRows = stmt.executeUpdate(); + } catch (SQLException e) { + return queryResultBuilder // + .exception(e.getClass().getName()) // + .exceptionMessage(e.getMessage()) // + .build(); + } - try { - handleUserErrors(conn, sql, stmt); - } catch (SqlExecutionException e) { - log.error(e.getMessage(), e); + try { + handleUserErrors(conn, sql, stmt); + } catch (SqlExecutionException e) { + log.error(e.getMessage(), e); - return queryResultBuilder.userErrors(e.getUserErrors()).build(); - } + return queryResultBuilder.userErrors(e.getUserErrors()).build(); + } - return queryResultBuilder.affectedRows(affectedRows).build(); -} + return queryResultBuilder.affectedRows(affectedRows).build(); + } private static Vector getColumnDefinitions(ResultSetMetaData metaData) throws SQLException { Vector columnDefinitions = new Vector(); @@ -301,4 +311,37 @@ public class SqlExecutor { return userErrors; } + + private static List parseDbOutput(Connection conn) throws SQLException { + enableDbOutput(conn); + + List result = new Vector<>(); + + @Cleanup + CallableStatement call = conn.prepareCall("{call DBMS_OUTPUT.GET_LINE(?, ?)}"); + call.registerOutParameter(1, Types.VARCHAR); + call.registerOutParameter(2, Types.NUMERIC); + + long status = 0L; + while (status == 0L) { + call.execute(); + status = call.getLong(2); + + String line = call.getString(1); + log.trace("DBMS_OUTPUT: " + line); + log.trace("DBMS_OUTPUT Status: " + status); + if (line != null && status == 0L) { + result.add(line); + } + } + ; + + return result; + + } + + private static void enableDbOutput(Connection conn) throws SQLException { + conn.createStatement() // + .execute("BEGIN DBMS_OUTPUT.ENABLE; END;"); + } } diff --git a/src/main/java/at/compax/tools/sql/main/Main.java b/src/main/java/at/compax/tools/sql/main/Main.java index da2f484..3c65d05 100644 --- a/src/main/java/at/compax/tools/sql/main/Main.java +++ b/src/main/java/at/compax/tools/sql/main/Main.java @@ -118,6 +118,15 @@ public class Main { } } + public static String formatJsonObject(Object object) throws JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + if (executionMode == ExecutionMode.TERMINAL) { + return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(object); + } else { + return mapper.writeValueAsString(object); + } + } + public static void main(String[] args) throws Exception { BasicConfigurator.configure(); LogManager.getRootLogger().setLevel(Level.OFF); @@ -163,13 +172,4 @@ public class Main { } } } - - public static String formatJsonObject(Object object) throws JsonProcessingException { - ObjectMapper mapper = new ObjectMapper(); - if (executionMode == ExecutionMode.TERMINAL) { - return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(object); - } else { - return mapper.writeValueAsString(object); - } - } } diff --git a/src/main/java/at/compax/tools/sql/model/Result.java b/src/main/java/at/compax/tools/sql/model/Result.java index 62f64fe..9c64337 100644 --- a/src/main/java/at/compax/tools/sql/model/Result.java +++ b/src/main/java/at/compax/tools/sql/model/Result.java @@ -16,4 +16,5 @@ public class Result { private List userErrors; private String exception; private String exceptionMessage; + private List dbOutput; }