Refactor connection handling improve db output

master
Zoran Zaric 7 years ago
parent 33cb4d45b7
commit a31b0c9286

@ -0,0 +1,17 @@
package at.compax.tools.sql;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
@Builder
@Getter
@AllArgsConstructor
public class ConnectionParameters {
private String dbIp;
private long port;
private String sid;
private String username;
private String password;
private boolean enableDbOutput;
}

@ -0,0 +1,23 @@
package at.compax.tools.sql;
import java.sql.Connection;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.experimental.Delegate;
@Builder
@Getter
@RequiredArgsConstructor
@AllArgsConstructor
public class FrogConnection implements Connection {
@Delegate(types=Connection.class)
private final Connection conn;
@Setter
private Boolean dbOutputEnabled;
}

@ -3,7 +3,6 @@ package at.compax.tools.sql;
import java.io.IOException; import java.io.IOException;
import java.sql.CallableStatement; import java.sql.CallableStatement;
import java.sql.Clob; import java.sql.Clob;
import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.ResultSetMetaData; import java.sql.ResultSetMetaData;
@ -19,6 +18,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import at.compax.tools.sql.model.ExecutionParameter;
import at.compax.tools.sql.model.QueryParameter; import at.compax.tools.sql.model.QueryParameter;
import at.compax.tools.sql.model.QueryResult; import at.compax.tools.sql.model.QueryResult;
import at.compax.tools.sql.model.QueryResult.ColumnDefinition; import at.compax.tools.sql.model.QueryResult.ColumnDefinition;
@ -39,9 +39,27 @@ import lombok.extern.log4j.Log4j;
public class SqlExecutor { public class SqlExecutor {
private static final long MAX_ROWS = 10L; private static final long MAX_ROWS = 10L;
public static Result execute(Connection conn, String sql) throws SQLException, JsonProcessingException { public static Result executeJson(FrogConnection conn, String json) throws SQLException, JsonParseException, JsonMappingException, IOException {
log.debug("Parsing JSON: " + json);
ObjectMapper mapper = new ObjectMapper();
ExecutionParameter executionParameter = mapper.readValue(json, ExecutionParameter.class);
boolean isDbOutputOverridden = executionParameter.isEnableDbOutput() && !conn.getDbOutputEnabled();
if (isDbOutputOverridden) {
enableDbOutput(conn); enableDbOutput(conn);
}
Result result = execute(conn, executionParameter.getSql());
if (isDbOutputOverridden) {
disableDbOutput(conn);
}
return result;
}
public static Result execute(FrogConnection conn, String sql) throws SQLException, JsonProcessingException {
log.trace("SQL: " + sql.trim()); log.trace("SQL: " + sql.trim());
@Cleanup @Cleanup
@ -71,7 +89,7 @@ public class SqlExecutor {
return resultBuilder.build(); return resultBuilder.build();
} }
public static QueryResult executeJsonQuery(Connection conn, Long maxRows, String json) throws SQLException, JsonParseException, JsonMappingException, IOException { public static QueryResult executeJsonQuery(FrogConnection conn, Long maxRows, String json) throws SQLException, JsonParseException, JsonMappingException, IOException {
log.debug("Parsing JSON: " + json); log.debug("Parsing JSON: " + json);
ObjectMapper mapper = new ObjectMapper(); ObjectMapper mapper = new ObjectMapper();
@ -81,7 +99,7 @@ public class SqlExecutor {
return executeQuery(conn, maxRows, queryParameter); return executeQuery(conn, maxRows, queryParameter);
} }
public static QueryResult executeQuery(Connection conn, Long maxRows, QueryParameter parameters) throws SQLException { public static QueryResult executeQuery(FrogConnection conn, Long maxRows, QueryParameter parameters) throws SQLException {
if (parameters == null || parameters.getParameters() == null) { if (parameters == null || parameters.getParameters() == null) {
return executeQuery(conn, parameters.getSql(), maxRows); return executeQuery(conn, parameters.getSql(), maxRows);
} else { } else {
@ -89,7 +107,7 @@ public class SqlExecutor {
} }
} }
public static QueryResult executeQuery(Connection conn, String sql, Long maxRows, Object... parameters) throws SQLException { public static QueryResult executeQuery(FrogConnection conn, String sql, Long maxRows, Object... parameters) throws SQLException {
log.trace("SQL: " + sql.trim()); log.trace("SQL: " + sql.trim());
if (maxRows == null) { if (maxRows == null) {
maxRows = MAX_ROWS; maxRows = MAX_ROWS;
@ -191,7 +209,7 @@ public class SqlExecutor {
return queryResultBuilder.rows(rows).build(); return queryResultBuilder.rows(rows).build();
} }
public static QueryResult executeUpdate(Connection conn, String sql, Object... parameters) throws SQLException { public static QueryResult executeUpdate(FrogConnection conn, String sql, Object... parameters) throws SQLException {
log.trace("SQL: " + sql.trim()); log.trace("SQL: " + sql.trim());
String updateQuery = sql.replaceAll(";$", "").trim(); String updateQuery = sql.replaceAll(";$", "").trim();
@ -257,7 +275,7 @@ public class SqlExecutor {
return columnDefinitions; return columnDefinitions;
} }
private static void handleUserErrors(Connection conn, String sql, Statement stmt) throws SQLException, SqlExecutionException { private static void handleUserErrors(FrogConnection conn, String sql, Statement stmt) throws SQLException, SqlExecutionException {
SQLWarning warnings = stmt.getWarnings(); SQLWarning warnings = stmt.getWarnings();
List<UserError> userErrors = new Vector<UserError>(); List<UserError> userErrors = new Vector<UserError>();
if (warnings != null) { if (warnings != null) {
@ -267,7 +285,7 @@ public class SqlExecutor {
} }
} }
private static List<UserError> parseUserErrors(Connection conn) throws SQLException { private static List<UserError> parseUserErrors(FrogConnection conn) throws SQLException {
log.debug("Retrieving user errors"); log.debug("Retrieving user errors");
String userErrorsSql = "select name, type, sequence, line, position, text, attribute, message_number from user_errors where type <> 'JAVA CLASS' order by sequence"; String userErrorsSql = "select name, type, sequence, line, position, text, attribute, message_number from user_errors where type <> 'JAVA CLASS' order by sequence";
boolean first = true; boolean first = true;
@ -314,8 +332,11 @@ public class SqlExecutor {
return userErrors; return userErrors;
} }
private static List<String> parseDbOutput(Connection conn) throws SQLException { private static List<String> parseDbOutput(FrogConnection conn) throws SQLException {
List<String> result = new Vector<>(); List<String> result = new Vector<>();
if (conn.getDbOutputEnabled() == null || !conn.getDbOutputEnabled()) {
return result;
}
@Cleanup @Cleanup
CallableStatement call = conn.prepareCall("{call DBMS_OUTPUT.GET_LINE(?, ?)}"); CallableStatement call = conn.prepareCall("{call DBMS_OUTPUT.GET_LINE(?, ?)}");
@ -340,8 +361,17 @@ public class SqlExecutor {
} }
private static void enableDbOutput(Connection conn) throws SQLException { public static void enableDbOutput(FrogConnection conn) throws SQLException {
conn.createStatement() // conn.createStatement() //
.execute("BEGIN DBMS_OUTPUT.ENABLE; END;"); .execute("BEGIN DBMS_OUTPUT.ENABLE; END;");
conn.setDbOutputEnabled(true);
}
public static void disableDbOutput(FrogConnection conn) throws SQLException {
conn.createStatement() //
.execute("BEGIN DBMS_OUTPUT.DISABLE; END;");
conn.setDbOutputEnabled(false);
} }
} }

@ -15,6 +15,8 @@ import org.apache.log4j.LogManager;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import at.compax.tools.sql.ConnectionParameters;
import at.compax.tools.sql.FrogConnection;
import at.compax.tools.sql.SqlExecutionException; import at.compax.tools.sql.SqlExecutionException;
import at.compax.tools.sql.SqlExecutor; import at.compax.tools.sql.SqlExecutor;
import at.compax.tools.sql.model.QueryResult; import at.compax.tools.sql.model.QueryResult;
@ -38,20 +40,38 @@ public class Main {
private static ExecutionMode executionMode = ExecutionMode.PLUGIN_BACKEND; private static ExecutionMode executionMode = ExecutionMode.PLUGIN_BACKEND;
private static Connection getConnection(String dbIp, long port, String sid, String username, String password) throws SQLException { private static FrogConnection getConnection(ConnectionParameters connectionParameters) throws SQLException {
log.debug("Establishing conneciton..."); log.debug("Establishing conneciton...");
Connection conn = null;
String jdbcConnection = String.format("jdbc:oracle:thin:@%s:%d:%s", dbIp, port, sid); String jdbcConnection = String.format("jdbc:oracle:thin:@%s:%d:%s", connectionParameters.getDbIp(), connectionParameters.getPort(), connectionParameters.getSid());
conn = DriverManager.getConnection(jdbcConnection, username, password); Connection sqlConn = DriverManager.getConnection(jdbcConnection, //
conn.setAutoCommit(false); connectionParameters.getUsername(), //
connectionParameters.getPassword());
sqlConn.setAutoCommit(false);
FrogConnection conn = FrogConnection.builder() //
.conn(sqlConn) //
.build();
log.debug("Established conneciton!"); log.debug("Established conneciton!");
if (connectionParameters.isEnableDbOutput()) {
log.info("Enabling db output...");
try {
SqlExecutor.enableDbOutput(conn);
} catch (SQLException e) {
log.error("Could not enable db output: " + e.getMessage(), e);
conn.setDbOutputEnabled(false);
}
} else {
conn.setDbOutputEnabled(false);
}
return conn; return conn;
} }
private static void closeConnection(Connection conn) { private static void closeConnection(FrogConnection conn) {
if (conn != null) { if (conn != null) {
try { try {
conn.close(); conn.close();
@ -61,28 +81,28 @@ public class Main {
} }
} }
private static QueryResult executeExampleQueryWithException(Connection conn) throws SQLException, JsonProcessingException { private static QueryResult executeExampleQueryWithException(FrogConnection conn) throws SQLException, JsonProcessingException {
String sql = "SELECT id, version, workspac FROM s_settings"; String sql = "SELECT id, version, workspac FROM s_settings";
return SqlExecutor.executeQuery(conn, sql, 10L); return SqlExecutor.executeQuery(conn, sql, 10L);
} }
private static QueryResult executeExampleQueryWithoutParameter(Connection conn) throws SQLException, JsonProcessingException { private static QueryResult executeExampleQueryWithoutParameter(FrogConnection conn) throws SQLException, JsonProcessingException {
String sql = "SELECT id, version, workspace FROM s_settings"; String sql = "SELECT id, version, workspace FROM s_settings";
return SqlExecutor.executeQuery(conn, sql, 10L); return SqlExecutor.executeQuery(conn, sql, 10L);
} }
private static QueryResult executeExampleQueryWithParameter(Connection conn) throws SQLException, JsonProcessingException { private static QueryResult executeExampleQueryWithParameter(FrogConnection conn) throws SQLException, JsonProcessingException {
String sql = "select client from k_clients where id = ?"; String sql = "select client from k_clients where id = ?";
return SqlExecutor.executeQuery(conn, sql, 1L); return SqlExecutor.executeQuery(conn, sql, 1L);
} }
private static Result compileExampleSpec(Connection conn) throws SQLException, JsonProcessingException { private static Result compileExampleSpec(FrogConnection conn) throws SQLException, JsonProcessingException {
String specSql = "CREATE OR REPLACE PACKAGE aax2_wedel\n" + "AS\n" + " PROCEDURE create_cli_migration_workflow(p_customer d_customers.id%type, p_migration_date date);\n" + "END aax2_wedel;"; String specSql = "CREATE OR REPLACE PACKAGE aax2_wedel\n" + "AS\n" + " PROCEDURE create_cli_migration_workflow(p_customer d_customers.id%type, p_migration_date date);\n" + "END aax2_wedel;";
return SqlExecutor.execute(conn, specSql); return SqlExecutor.execute(conn, specSql);
} }
private static Result compileExampleSpecWithErrors(Connection conn) throws SQLException, JsonProcessingException { private static Result compileExampleSpecWithErrors(FrogConnection conn) throws SQLException, JsonProcessingException {
String specSql = "CREATE OR REPLACE PACKAGE aax2_wedel\n" + "AS\n" + " PROCEDURE create_cli_migration_workflow(p_customer d_customers.id%typ, p_migration_date date);\n" + "END aax2_wedel;"; String specSql = "CREATE OR REPLACE PACKAGE aax2_wedel\n" + "AS\n" + " PROCEDURE create_cli_migration_workflow(p_customer d_customers.id%typ, p_migration_date date);\n" + "END aax2_wedel;";
return SqlExecutor.execute(conn, specSql); return SqlExecutor.execute(conn, specSql);
@ -111,7 +131,13 @@ public class Main {
// String stdInSql = readFromStdIn(); // String stdInSql = readFromStdIn();
@Cleanup @Cleanup
Connection conn = getConnection("172.19.13.66", 1521L, "aax2qc", "aax2qc", "aax2qc"); FrogConnection conn = getConnection(ConnectionParameters.builder() //
.dbIp("172.19.13.66") //
.port(1521L) //
.sid("aax2qc") //
.username("aax2qc") //
.password("aax2qc") //
.build());
System.out.println(formatJsonObject(SqlExecutor.executeJsonQuery(conn, 10L, "{ \"sql\": \"select customer_id from d_customers\"}"))); System.out.println(formatJsonObject(SqlExecutor.executeJsonQuery(conn, 10L, "{ \"sql\": \"select customer_id from d_customers\"}")));
System.out.println(formatJsonObject(compileExampleSpec(conn))); System.out.println(formatJsonObject(compileExampleSpec(conn)));
@ -119,6 +145,10 @@ public class Main {
System.out.println(formatJsonObject(executeExampleQueryWithException(conn))); System.out.println(formatJsonObject(executeExampleQueryWithException(conn)));
System.out.println(formatJsonObject(executeExampleQueryWithoutParameter(conn))); System.out.println(formatJsonObject(executeExampleQueryWithoutParameter(conn)));
System.out.println(formatJsonObject(executeExampleQueryWithParameter(conn))); System.out.println(formatJsonObject(executeExampleQueryWithParameter(conn)));
System.out.println(formatJsonObject(SqlExecutor.executeJson(conn, "{ \"sql\": \"begin dbms_output.put_line('should not be seen'); end;\"}")));
System.out.println(formatJsonObject(SqlExecutor.executeJson(conn, "{ \"enableDbOutput\": true, \"sql\": \"begin dbms_output.put_line('should be seen'); end;\"}")));
System.out.println(formatJsonObject(SqlExecutor.executeJson(conn, "{ \"sql\": \"begin dbms_output.put_line('should not be seen'); end;\"}")));
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -133,16 +163,17 @@ public class Main {
} }
} }
private static void serveForever(String host, long port, String sid, String username, String password) { private static void serveForever(ConnectionParameters connectionParameters) {
Connection conn = null; FrogConnection conn = null;
try { try {
try { try {
conn = getConnection(host, port, sid, username, password); conn = getConnection(connectionParameters);
} catch (SQLException e) { } catch (SQLException e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
System.err.println("Could not connect to Database: " + e.getMessage()); System.err.println("Could not connect to Database: " + e.getMessage());
System.exit(1); System.exit(1);
} }
log.info("Waiting for input..."); log.info("Waiting for input...");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in, Charset.forName("UTF-8"))); BufferedReader br = new BufferedReader(new InputStreamReader(System.in, Charset.forName("UTF-8")));
@ -201,8 +232,14 @@ public class Main {
String sid = args[2]; String sid = args[2];
String username = args[3]; String username = args[3];
String password = args[4]; String password = args[4];
serveForever(ConnectionParameters.builder() //
.dbIp(host) //
.port(port) //
.sid(sid) //
.username(username) //
.password(password) //
.build());
serveForever(host, port, sid, username, password);
} }
} }

@ -0,0 +1,16 @@
package at.compax.tools.sql.model;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Builder;
import lombok.Getter;
import lombok.ToString;
@Builder
@Getter
@ToString
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ExecutionParameter {
private String sql;
private boolean enableDbOutput;
}
Loading…
Cancel
Save