Implement db output reading
This commit is contained in:
		| @@ -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,28 +218,28 @@ 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); | ||||
|  | ||||
|       return queryResultBuilder.userErrors(e.getUserErrors()).build(); | ||||
|     } | ||||
|  | ||||
|     return queryResultBuilder.affectedRows(affectedRows).build(); | ||||
|   } | ||||
|  | ||||
|   try { | ||||
|     handleUserErrors(conn, sql, stmt); | ||||
|   } catch (SqlExecutionException e) { | ||||
|     log.error(e.getMessage(), e); | ||||
|  | ||||
|     return queryResultBuilder.userErrors(e.getUserErrors()).build(); | ||||
|   } | ||||
|  | ||||
|   return queryResultBuilder.affectedRows(affectedRows).build(); | ||||
| } | ||||
|  | ||||
|   private static Vector<ColumnDefinition> getColumnDefinitions(ResultSetMetaData metaData) throws SQLException { | ||||
|     Vector<ColumnDefinition> columnDefinitions = new Vector<ColumnDefinition>(); | ||||
|     int columnCount = metaData.getColumnCount(); | ||||
| @@ -301,4 +311,37 @@ public class SqlExecutor { | ||||
|  | ||||
|     return userErrors; | ||||
|   } | ||||
|  | ||||
|   private static List<String> parseDbOutput(Connection conn) throws SQLException { | ||||
|     enableDbOutput(conn); | ||||
|  | ||||
|     List<String> 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;"); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -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); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -16,4 +16,5 @@ public class Result { | ||||
|   private List<UserError> userErrors; | ||||
|   private String exception; | ||||
|   private String exceptionMessage; | ||||
|   private List<String> dbOutput; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user