From 2798e6c07e743e3e8b87a223fae63300184f53fa Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Mon, 13 Aug 2018 10:26:04 +0300 Subject: [PATCH 01/56] UpsertRowByPrimaryKey action migrate to sailor v2 --- .../jdbc/actions/UpsertRowByPrimaryKey.java | 122 ++++++++++++------ 1 file changed, 85 insertions(+), 37 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java b/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java index 16cd442..3724740 100644 --- a/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java +++ b/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java @@ -6,12 +6,13 @@ import io.elastic.jdbc.QueryBuilders.Query; import io.elastic.jdbc.QueryFactory; import io.elastic.jdbc.Utils; -import java.text.SimpleDateFormat; -import java.util.Calendar; +import io.elastic.jdbc.Engines; + import javax.json.Json; -import javax.json.JsonArray; import javax.json.JsonObject; -import javax.json.JsonString; +import javax.json.JsonValue; + + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,58 +24,105 @@ public class UpsertRowByPrimaryKey implements Module { private static final Logger logger = LoggerFactory.getLogger(UpsertRowByPrimaryKey.class); private static final String PROPERTY_DB_ENGINE = "dbEngine"; private static final String PROPERTY_TABLE_NAME = "tableName"; - private static final String PROPERTY_ID_COLUMN = "idColumn"; - - private Connection connection = null; - - /* TODO: UpsertRowByPrimaryKey action migrate to sailor v2 */ @Override public void execute(ExecutionParameters parameters) { final JsonObject configuration = parameters.getConfiguration(); final JsonObject body = parameters.getMessage().getBody(); - if (!configuration.has(PROPERTY_TABLE_NAME) || configuration.get(PROPERTY_TABLE_NAME) - .isJsonNull() || configuration.get(PROPERTY_TABLE_NAME).getAsString().isEmpty()) { + JsonObject snapshot = parameters.getSnapshot(); + String tableName = ""; + String dbEngine = ""; + String schemaName = ""; + ResultSet rs = null; + String primaryKey = ""; + StringBuilder primaryValue = new StringBuilder(); + Integer primaryKeysCount = 0; + + if (configuration.containsKey(PROPERTY_TABLE_NAME) + && Utils.getNonNullString(configuration, PROPERTY_TABLE_NAME).length() != 0) { + tableName = configuration.getString(PROPERTY_TABLE_NAME); + } else if (snapshot.containsKey(PROPERTY_TABLE_NAME) + && Utils.getNonNullString(snapshot, PROPERTY_TABLE_NAME).length() != 0) { + tableName = snapshot.getString(PROPERTY_TABLE_NAME); + } else { throw new RuntimeException("Table name is required field"); } - if (!configuration.has(PROPERTY_ID_COLUMN) || configuration.get(PROPERTY_ID_COLUMN).isJsonNull() - || configuration.get("idColumn").getAsString().isEmpty()) { - throw new RuntimeException("ID column is required field"); - } - String tableName = configuration.get(PROPERTY_TABLE_NAME).getAsString(); - String idColumn = configuration.get(PROPERTY_ID_COLUMN).getAsString(); - String idColumnValue = null; - if (!(!body.has(idColumn) || body.get(idColumn).isJsonNull() || body.get(idColumn).getAsString() - .isEmpty())) { - idColumnValue = body.get(idColumn).getAsString(); + + if (Utils.getNonNullString(configuration, PROPERTY_DB_ENGINE).length() != 0) { + dbEngine = configuration.getString(PROPERTY_DB_ENGINE); + } else if (Utils.getNonNullString(snapshot, PROPERTY_DB_ENGINE).length() != 0) { + dbEngine = snapshot.getString(PROPERTY_DB_ENGINE); + } else { + throw new RuntimeException("DB Engine is required field"); } - logger.info("ID column value: {}", idColumnValue); - String db = configuration.get(PROPERTY_DB_ENGINE).getAsString(); - boolean isOracle = db.equals(Engines.ORACLE.name().toLowerCase()); + + logger.info("Executing lookup primary key"); + boolean isOracle = dbEngine.equals(Engines.ORACLE.name().toLowerCase()); + Connection connection = Utils.getConnection(configuration); + try { - connection = Utils.getConnection(configuration); - Map columnTypes = Utils.getColumnTypes(connection, isOracle, tableName); - logger.info("Detected column types: " + columnTypes); - QueryFactory queryFactory = new QueryFactory(); - Query query = queryFactory.getQuery(PROPERTY_DB_ENGINE); - query.from(tableName).lookup(idColumn, idColumnValue); - if (query.executeRecordExists(connection)) { - query.executeUpdate(connection, tableName, idColumn, idColumnValue, body); + DatabaseMetaData dbMetaData = connection.getMetaData(); + if (tableName.contains(".")) { + schemaName = + (isOracle) ? tableName.split("\\.")[0].toUpperCase() : tableName.split("\\.")[0]; + tableName = + (isOracle) ? tableName.split("\\.")[1].toUpperCase() : tableName.split("\\.")[1]; + } + rs = dbMetaData + .getPrimaryKeys(null, ((isOracle && !schemaName.isEmpty()) ? schemaName : null), + tableName); + while (rs.next()) { + primaryKey=rs.getString("COLUMN_NAME"); + primaryKeysCount++; + } + if (primaryKeysCount == 1) { + logger.info("Executing upsert row by primary key action"); + for (Map.Entry entry : body.entrySet()) { + if (entry.getKey().equals(primaryKey)) { + logger.info("Primary key{} = {}", entry.getKey(), entry.getValue()); + primaryValue.append(entry.getValue()); + } + } + Utils.columnTypes = Utils.getColumnTypes(connection, isOracle, tableName); + logger.info("Detected column types: " + Utils.columnTypes); + Map columnTypes = Utils.getColumnTypes(connection, isOracle, tableName); + QueryFactory queryFactory = new QueryFactory(); + Query query = queryFactory.getQuery(dbEngine); + logger.info("Lookup parameters: {} = {}", primaryKey.toString(), primaryValue.toString()); + query.from(tableName).lookup(primaryKey.toString(), primaryValue.toString()); + if (query.executeRecordExists(connection)) { + logger.info("Update parameters: {} = {}", primaryKey.toString(), primaryValue.toString()); + query.executeUpdate(connection, tableName, primaryKey.toString(), primaryValue.toString(), body); + } else { + logger.info("Insert parameters: {} = {}", primaryKey.toString(), primaryValue.toString()); + query.executeInsert(connection, tableName, body); + } + logger.info("Emit data= {}", body.toString()); + parameters.getEventEmitter().emitData(new Message.Builder().body(body).build()); + snapshot = Json.createObjectBuilder().add(PROPERTY_TABLE_NAME, tableName).build(); + logger.info("Emitting new snapshot {}", snapshot.toString()); + parameters.getEventEmitter().emitSnapshot(snapshot); } else { - query.executeInsert(connection, tableName, body); + logger.error("Error: Should be one Primary Key"); + throw new IllegalStateException("Should be one Primary Key"); } - this.getEventEmitter().emitData(new Message.Builder().body(body).build()); } catch (SQLException e) { throw new RuntimeException(e); } finally { + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + System.out.println("Failed to close result set" + e.toString()); + } + } if (connection != null) { try { connection.close(); } catch (SQLException e) { - logger.error(e.toString()); + System.out.println("Failed to close connection" + e.toString()); } } } } - -} +} \ No newline at end of file From 8c89e582990adc2d8e355f6c5eeade6d4e817054 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Mon, 13 Aug 2018 12:10:24 +0300 Subject: [PATCH 02/56] UpsertRowByPrimaryKey action migrate to sailor v2 --- component.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/component.json b/component.json index cd8a0f2..c4f62d1 100755 --- a/component.json +++ b/component.json @@ -124,6 +124,21 @@ }, "dynamicMetadata": "io.elastic.jdbc.PrimaryColumnNamesProvider" }, + "upsertRowByPrimaryKey": { + "main": "io.elastic.jdbc.actions.UpsertRowByPrimaryKey", + "title": "Upsert Row By Primary Key", + "description": "Executes upsert by primary key", + "fields": { + "tableName": { + "viewClass": "SelectView", + "prompt": "Select a Table", + "label": "Table", + "required": true, + "model": "io.elastic.jdbc.TableNameProvider" + } + }, + "dynamicMetadata": "io.elastic.jdbc.ColumnNamesProvider" + }, "deleteRowByPrimaryKey": { "main": "io.elastic.jdbc.actions.DeleteRowByPrimaryKey", "title": "Delete Row By Primary Key", From a5fd81ea200ba316979f389324b449fa4d81f1d0 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Mon, 13 Aug 2018 12:35:12 +0300 Subject: [PATCH 03/56] UpsertRowByPrimaryKey action migrate to sailor v2 --- src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java index be3e213..0dfc615 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java @@ -19,7 +19,8 @@ public ResultSet executeSelectQuery(Connection connection, String sqlQuery, Json PreparedStatement stmt = connection.prepareStatement(sql.toString()); int i = 1; for (Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), (entry.getValue() != null) ? entry.getValue().toString().replace("\"", "") : null); + Utils.setStatementParam(stmt, i, entry.getKey(), (entry.getValue() != null) ? + entry.getValue().toString().replace("\"", "") : null); i++; } return stmt.executeQuery(); @@ -114,7 +115,8 @@ public void executeInsert(Connection connection, String tableName, JsonObject bo PreparedStatement stmt = connection.prepareStatement(sql); int i = 1; for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), entry.getValue().toString()); + Utils.setStatementParam(stmt, i, entry.getKey(), + entry.getValue().toString().replace("\"", "")); i++; } stmt.execute(); @@ -136,7 +138,7 @@ public void executeUpdate(Connection connection, String tableName, String idColu PreparedStatement stmt = connection.prepareStatement(sql); int i = 1; for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), entry.getValue().toString()); + Utils.setStatementParam(stmt, i, entry.getKey(), entry.getValue().toString().replace("\"", "")); i++; } Utils.setStatementParam(stmt, i, idColumn, idValue); From 2acdc5b46fd817f87171e59c07436467d9851a44 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Mon, 13 Aug 2018 12:46:55 +0300 Subject: [PATCH 04/56] UpsertRowByPrimaryKey action migrate to sailor v2 --- src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java index 0dfc615..5d84de1 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java @@ -116,7 +116,7 @@ public void executeInsert(Connection connection, String tableName, JsonObject bo int i = 1; for (Map.Entry entry : body.entrySet()) { Utils.setStatementParam(stmt, i, entry.getKey(), - entry.getValue().toString().replace("\"", "")); + entry.getValue().toString().replaceAll("^\"+|\"+$", "")); i++; } stmt.execute(); @@ -138,7 +138,7 @@ public void executeUpdate(Connection connection, String tableName, String idColu PreparedStatement stmt = connection.prepareStatement(sql); int i = 1; for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), entry.getValue().toString().replace("\"", "")); + Utils.setStatementParam(stmt, i, entry.getKey(), entry.getValue().toString().replaceAll("^\"+|\"+$", "")); i++; } Utils.setStatementParam(stmt, i, idColumn, idValue); From 3cc60849bd3ad75e0865ba27990e4207f66fbc86 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Mon, 13 Aug 2018 17:57:48 +0300 Subject: [PATCH 05/56] MySQL change setStatementParam --- .../io/elastic/jdbc/QueryBuilders/MySQL.java | 232 +++++++++--------- src/main/java/io/elastic/jdbc/Utils.java | 26 +- 2 files changed, 128 insertions(+), 130 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java index 5d84de1..ef70e4e 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java @@ -13,136 +13,134 @@ import org.slf4j.LoggerFactory; public class MySQL extends Query { - private static final Logger logger = LoggerFactory.getLogger(MySQL.class); - public ResultSet executeSelectQuery(Connection connection, String sqlQuery, JsonObject body) throws SQLException { - StringBuilder sql = new StringBuilder(sqlQuery); - PreparedStatement stmt = connection.prepareStatement(sql.toString()); - int i = 1; - for (Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), (entry.getValue() != null) ? - entry.getValue().toString().replace("\"", "") : null); - i++; + private static final Logger logger = LoggerFactory.getLogger(MySQL.class); + public ResultSet executeSelectQuery(Connection connection, String sqlQuery, JsonObject body) throws SQLException { + StringBuilder sql = new StringBuilder(sqlQuery); + PreparedStatement stmt = connection.prepareStatement(sql.toString()); + int i = 1; + for (Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, i, entry.getKey(), (entry.getValue() != null) ? body : null); + i++; + } + return stmt.executeQuery(); } - return stmt.executeQuery(); - } - public ResultSet executeSelectTrigger(Connection connection, String sqlQuery) throws SQLException { - StringBuilder sql = new StringBuilder(sqlQuery); - PreparedStatement stmt = connection.prepareStatement(sql.toString()); - if(pollingValue != null) { - stmt.setTimestamp(1, pollingValue); + public ResultSet executeSelectTrigger(Connection connection, String sqlQuery) throws SQLException { + StringBuilder sql = new StringBuilder(sqlQuery); + PreparedStatement stmt = connection.prepareStatement(sql.toString()); + if(pollingValue != null) { + stmt.setTimestamp(1, pollingValue); + } + return stmt.executeQuery(); } - return stmt.executeQuery(); - } - public ResultSet executePolling(Connection connection) throws SQLException { - validateQuery(); - StringBuilder sql = new StringBuilder("SELECT * FROM "); - sql.append(tableName); - sql.append(" WHERE "); - sql.append(pollingField); - sql.append(" > ?"); - if (orderField != null) { - sql.append(" ORDER BY ").append(orderField); - } - sql.append(" ASC LIMIT ? OFFSET ?"); - - PreparedStatement stmt = connection.prepareStatement(sql.toString()); - stmt.setTimestamp(1, pollingValue); - stmt.setInt(2, countNumber); - stmt.setInt(3, skipNumber); - return stmt.executeQuery(); - } - - public ResultSet executeLookup(Connection connection, JsonObject body) throws SQLException { - validateQuery(); - StringBuilder sql = new StringBuilder("SELECT * FROM "); - sql.append(tableName); - sql.append(" WHERE "); - sql.append(lookupField); - sql.append(" = ?"); - sql.append(" ORDER BY ").append(lookupField); - sql.append(" ASC LIMIT ? OFFSET ?"); + public ResultSet executePolling(Connection connection) throws SQLException { + validateQuery(); + StringBuilder sql = new StringBuilder("SELECT * FROM "); + sql.append(tableName); + sql.append(" WHERE "); + sql.append(pollingField); + sql.append(" > ?"); + if (orderField != null) { + sql.append(" ORDER BY ").append(orderField); + } + sql.append(" ASC LIMIT ? OFFSET ?"); - PreparedStatement stmt = connection.prepareStatement(sql.toString()); - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, 1, entry.getKey(), entry.getValue().toString()); + PreparedStatement stmt = connection.prepareStatement(sql.toString()); + stmt.setTimestamp(1, pollingValue); + stmt.setInt(2, countNumber); + stmt.setInt(3, skipNumber); + return stmt.executeQuery(); } - stmt.setInt(2, countNumber); - stmt.setInt(3, skipNumber); - return stmt.executeQuery(); - } - public int executeDelete(Connection connection, JsonObject body) throws SQLException { - String sql = "DELETE" + - " FROM " + tableName + - " WHERE " + lookupField + " = ?"; - PreparedStatement stmt = connection.prepareStatement(sql); - stmt.setString(1, lookupValue); - return stmt.executeUpdate(); - } + public ResultSet executeLookup(Connection connection, JsonObject body) throws SQLException { + validateQuery(); + StringBuilder sql = new StringBuilder("SELECT * FROM "); + sql.append(tableName); + sql.append(" WHERE "); + sql.append(lookupField); + sql.append(" = ?"); + sql.append(" ORDER BY ").append(lookupField); + sql.append(" ASC LIMIT ? OFFSET ?"); - public boolean executeRecordExists(Connection connection) throws SQLException { - validateQuery(); - String sql = "SELECT COUNT(*)" + - " FROM " + tableName + - " WHERE " + lookupField + " = ?"; - PreparedStatement stmt = connection.prepareStatement(sql); - stmt.setString(1, lookupValue); - ResultSet rs = stmt.executeQuery(); - rs.next(); - return rs.getInt(1) > 0; - } + PreparedStatement stmt = connection.prepareStatement(sql.toString()); + for (Map.Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, 1, entry.getKey(), body); + } + stmt.setInt(2, countNumber); + stmt.setInt(3, skipNumber); + return stmt.executeQuery(); + } - public void executeInsert(Connection connection, String tableName, JsonObject body) - throws SQLException { - validateQuery(); - StringBuilder keys = new StringBuilder(); - StringBuilder values = new StringBuilder(); - for (Map.Entry entry : body.entrySet()) { - if (keys.length() > 0) { - keys.append(","); - } - keys.append(entry.getKey()); - if (values.length() > 0) { - values.append(","); - } - values.append("?"); + public int executeDelete(Connection connection, JsonObject body) throws SQLException { + String sql = "DELETE" + + " FROM " + tableName + + " WHERE " + lookupField + " = ?"; + PreparedStatement stmt = connection.prepareStatement(sql); + stmt.setString(1, lookupValue); + return stmt.executeUpdate(); } - String sql = "INSERT INTO " + tableName + - " (" + keys.toString() + ")" + - " VALUES (" + values.toString() + ")"; - PreparedStatement stmt = connection.prepareStatement(sql); - int i = 1; - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), - entry.getValue().toString().replaceAll("^\"+|\"+$", "")); - i++; + + public boolean executeRecordExists(Connection connection) throws SQLException { + validateQuery(); + String sql = "SELECT COUNT(*)" + + " FROM " + tableName + + " WHERE " + lookupField + " = ?"; + PreparedStatement stmt = connection.prepareStatement(sql); + stmt.setString(1, lookupValue); + ResultSet rs = stmt.executeQuery(); + rs.next(); + return rs.getInt(1) > 0; } - stmt.execute(); - } - public void executeUpdate(Connection connection, String tableName, String idColumn, - String idValue, JsonObject body) throws SQLException { - validateQuery(); - StringBuilder setString = new StringBuilder(); - for (Map.Entry entry : body.entrySet()) { - if (setString.length() > 0) { - setString.append(","); - } - setString.append(entry.getKey()).append(" = ?"); + public void executeInsert(Connection connection, String tableName, JsonObject body) + throws SQLException { + validateQuery(); + StringBuilder keys = new StringBuilder(); + StringBuilder values = new StringBuilder(); + for (Map.Entry entry : body.entrySet()) { + if (keys.length() > 0) { + keys.append(","); + } + keys.append(entry.getKey()); + if (values.length() > 0) { + values.append(","); + } + values.append("?"); + } + String sql = "INSERT INTO " + tableName + + " (" + keys.toString() + ")" + + " VALUES (" + values.toString() + ")"; + PreparedStatement stmt = connection.prepareStatement(sql); + int i = 1; + for (String key : body.keySet()) { + Utils.setStatementParam(stmt, i, key, body); + i++; + } + stmt.execute(); } - String sql = "UPDATE " + tableName + - " SET " + setString.toString() + - " WHERE " + idColumn + " = ?"; - PreparedStatement stmt = connection.prepareStatement(sql); - int i = 1; - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), entry.getValue().toString().replaceAll("^\"+|\"+$", "")); - i++; + + public void executeUpdate(Connection connection, String tableName, String idColumn, + String idValue, JsonObject body) throws SQLException { + validateQuery(); + StringBuilder setString = new StringBuilder(); + for (Map.Entry entry : body.entrySet()) { + if (setString.length() > 0) { + setString.append(","); + } + setString.append(entry.getKey()).append(" = ?"); + } + String sql = "UPDATE " + tableName + + " SET " + setString.toString() + + " WHERE " + idColumn + " = ?"; + PreparedStatement stmt = connection.prepareStatement(sql); + int i = 1; + for (String key : body.keySet()) { + Utils.setStatementParam(stmt, i, key, body); + i++; + } + Utils.setStatementParam(stmt, i, idColumn, body); + stmt.execute(); } - Utils.setStatementParam(stmt, i, idColumn, idValue); - stmt.execute(); - } } \ No newline at end of file diff --git a/src/main/java/io/elastic/jdbc/Utils.java b/src/main/java/io/elastic/jdbc/Utils.java index 57e7db1..fd3d5b5 100644 --- a/src/main/java/io/elastic/jdbc/Utils.java +++ b/src/main/java/io/elastic/jdbc/Utils.java @@ -100,43 +100,43 @@ private static Integer getPort(final JsonObject config, final Engines engineType } public static void setStatementParam(PreparedStatement statement, int paramNumber, String colName, - String colValue) throws SQLException { + JsonObject body) throws SQLException { try { if (isNumeric(colName)) { - if (colValue != "null") { - statement.setBigDecimal(paramNumber, new BigDecimal(colValue)); + if (body.get(colName) != null) { + statement.setBigDecimal(paramNumber, body.getJsonNumber(colName).bigDecimalValue()); } else { statement.setBigDecimal(paramNumber, null); } } else if (isTimestamp(colName)) { - if (colValue != "null") { - statement.setTimestamp(paramNumber, Timestamp.valueOf(colValue)); + if (body.get(colName) != null) { + statement.setTimestamp(paramNumber, Timestamp.valueOf(body.getString(colName))); } else { statement.setTimestamp(paramNumber, null); } } else if (isDate(colName)) { - if (colValue != "null") { - statement.setDate(paramNumber, Date.valueOf(colValue)); + if (body.get(colName) != null) { + statement.setDate(paramNumber, Date.valueOf(body.getString(colName))); } else { statement.setDate(paramNumber, null); } } else if (isBoolean(colName)) { - if (colValue != "null") { - statement.setBoolean(paramNumber, Boolean.valueOf(colValue)); + if (body.get(colName) != null) { + statement.setBoolean(paramNumber, body.getBoolean(colName)); } else { statement.setBoolean(paramNumber, false); } } else { - if (colValue != "null") { - statement.setString(paramNumber, colValue); + if (body.get(colName) != null) { + statement.setString(paramNumber, body.getString(colName)); } else { statement.setNull(paramNumber, Types.VARCHAR); } } } catch (java.lang.NumberFormatException e) { String message = String - .format("Provided data: %s can't be cast to the column %s datatype", colValue, - colName); + .format("Provided data: %s can't be cast to the column %s datatype",body.get(colName), + colName); throw new RuntimeException(message); } } From 9b295487c2006f035b243f0fa2f2455319619bc9 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Mon, 13 Aug 2018 18:00:49 +0300 Subject: [PATCH 06/56] MSSQL change setStatementParam --- .../java/io/elastic/jdbc/QueryBuilders/MSSQL.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java index 7f2dd33..b076fd6 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java @@ -17,8 +17,7 @@ public ResultSet executeSelectQuery(Connection connection, String sqlQuery, Json PreparedStatement stmt = connection.prepareStatement(sqlQuery); int i = 1; for (Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), - entry.getValue().toString().replace("\"", "")); + Utils.setStatementParam(stmt, i, entry.getKey(), body); i++; } return stmt.executeQuery(); @@ -70,7 +69,7 @@ public ResultSet executeLookup(Connection connection, JsonObject body) throws SQ " AND RowNum < ?"; PreparedStatement stmt = connection.prepareStatement(sql); for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, 1, entry.getKey(), entry.getValue().toString()); + Utils.setStatementParam(stmt, 1, entry.getKey(), body); } stmt.setInt(2, skipNumber); stmt.setInt(3, countNumber + skipNumber); @@ -120,7 +119,7 @@ public void executeInsert(Connection connection, String tableName, JsonObject bo PreparedStatement stmt = connection.prepareStatement(sql); int i = 1; for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), entry.getValue().toString()); + Utils.setStatementParam(stmt, i, entry.getKey(), body); i++; } stmt.execute(); @@ -142,10 +141,10 @@ public void executeUpdate(Connection connection, String tableName, String idColu PreparedStatement stmt = connection.prepareStatement(sql); int i = 1; for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), entry.getValue().toString()); + Utils.setStatementParam(stmt, i, entry.getKey(), body); i++; } - Utils.setStatementParam(stmt, i, idColumn, idValue); + Utils.setStatementParam(stmt, i, idColumn, body); stmt.execute(); } } \ No newline at end of file From 768ba0c7a4197c590d6cb2aa5808304c6de3b1e7 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Mon, 13 Aug 2018 18:01:40 +0300 Subject: [PATCH 07/56] Oracle change setStatementParam --- .../java/io/elastic/jdbc/QueryBuilders/Oracle.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java index 5c0609d..b81483b 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java @@ -17,8 +17,7 @@ public ResultSet executeSelectQuery(Connection connection, String sqlQuery, Json PreparedStatement stmt = connection.prepareStatement(sqlQuery); int i = 1; for (Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), - entry.getValue().toString().replace("\"", "")); + Utils.setStatementParam(stmt, i, entry.getKey(), body); i++; } return stmt.executeQuery(); @@ -58,7 +57,7 @@ public ResultSet executeLookup(Connection connection, JsonObject body) throws SQ "ORDER BY " + lookupField; PreparedStatement stmt = connection.prepareStatement(sql); for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, 1, entry.getKey(), entry.getValue().toString()); + Utils.setStatementParam(stmt, 1, entry.getKey(), body); } stmt.setInt(2, skipNumber); stmt.setInt(3, countNumber); @@ -107,7 +106,7 @@ public void executeInsert(Connection connection, String tableName, JsonObject bo PreparedStatement stmt = connection.prepareStatement(sql); int i = 1; for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), entry.getValue().toString()); + Utils.setStatementParam(stmt, i, entry.getKey(), body); i++; } stmt.execute(); @@ -129,10 +128,10 @@ public void executeUpdate(Connection connection, String tableName, String idColu PreparedStatement stmt = connection.prepareStatement(sql); int i = 1; for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), entry.getValue().toString()); + Utils.setStatementParam(stmt, i, entry.getKey(), body); i++; } - Utils.setStatementParam(stmt, i, idColumn, idValue); + Utils.setStatementParam(stmt, i, idColumn, body); stmt.execute(); } From 3ed0da4a4ec385f274fd819c84436367b899c3ae Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Mon, 13 Aug 2018 18:02:40 +0300 Subject: [PATCH 08/56] Postrgre change setStatementParam --- .../io/elastic/jdbc/QueryBuilders/PostgreSQL.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java index b26e297..fbad48b 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java @@ -17,8 +17,7 @@ public ResultSet executeSelectQuery(Connection connection, String sqlQuery, Json PreparedStatement stmt = connection.prepareStatement(sqlQuery); int i = 1; for (Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), - entry.getValue().toString().replace("\"", "")); + Utils.setStatementParam(stmt, i, entry.getKey(), body); i++; } return stmt.executeQuery(); @@ -71,7 +70,7 @@ public ResultSet executeLookup(Connection connection, JsonObject body) throws SQ PreparedStatement stmt = connection.prepareStatement(sql); //stmt.setString(1, lookupValue); for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, 1, entry.getKey(), entry.getValue().toString()); + Utils.setStatementParam(stmt, 1, entry.getKey(), body); } stmt.setInt(2, skipNumber); stmt.setInt(3, countNumber + skipNumber); @@ -85,7 +84,7 @@ public int executeDelete(Connection connection, JsonObject body) throws SQLExcep " WHERE " + lookupField + " = ?"; PreparedStatement stmt = connection.prepareStatement(sql); for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, 1, entry.getKey(), entry.getValue().toString()); + Utils.setStatementParam(stmt, 1, entry.getKey(), body); } return stmt.executeUpdate(); } @@ -123,7 +122,7 @@ public void executeInsert(Connection connection, String tableName, JsonObject bo PreparedStatement stmt = connection.prepareStatement(sql); int i = 1; for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), entry.getValue().toString()); + Utils.setStatementParam(stmt, i, entry.getKey(), body); i++; } stmt.execute(); @@ -145,10 +144,10 @@ public void executeUpdate(Connection connection, String tableName, String idColu PreparedStatement stmt = connection.prepareStatement(sql); int i = 1; for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), entry.getValue().toString()); + Utils.setStatementParam(stmt, i, entry.getKey(), body); i++; } - Utils.setStatementParam(stmt, i, idColumn, idValue); + Utils.setStatementParam(stmt, i, idColumn, body); stmt.execute(); } } \ No newline at end of file From 5b257c9adde8c115437858215370d2e4b591b1a4 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Mon, 13 Aug 2018 18:48:35 +0300 Subject: [PATCH 09/56] Query change executeRecordExists --- src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java | 4 ++-- src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java | 4 ++-- src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java | 4 ++-- src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java | 4 ++-- src/main/java/io/elastic/jdbc/QueryBuilders/Query.java | 2 +- .../java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java index b076fd6..af86532 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java @@ -86,13 +86,13 @@ public int executeDelete(Connection connection, JsonObject body) throws SQLExcep return stmt.executeUpdate(); } - public boolean executeRecordExists(Connection connection) throws SQLException { + public boolean executeRecordExists(Connection connection, JsonObject body) throws SQLException { validateQuery(); String sql = "SELECT COUNT(*)" + " FROM " + tableName + " WHERE " + lookupField + " = ?"; PreparedStatement stmt = connection.prepareStatement(sql); - stmt.setString(1, lookupValue); + Utils.setStatementParam(stmt, 1, lookupField, body); ResultSet rs = stmt.executeQuery(); rs.next(); return rs.getInt(1) > 0; diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java index ef70e4e..26dfff9 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java @@ -81,13 +81,13 @@ public int executeDelete(Connection connection, JsonObject body) throws SQLExcep return stmt.executeUpdate(); } - public boolean executeRecordExists(Connection connection) throws SQLException { + public boolean executeRecordExists(Connection connection, JsonObject body) throws SQLException { validateQuery(); String sql = "SELECT COUNT(*)" + " FROM " + tableName + " WHERE " + lookupField + " = ?"; PreparedStatement stmt = connection.prepareStatement(sql); - stmt.setString(1, lookupValue); + Utils.setStatementParam(stmt, 1, lookupField, body); ResultSet rs = stmt.executeQuery(); rs.next(); return rs.getInt(1) > 0; diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java index b81483b..a713d75 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java @@ -73,13 +73,13 @@ public int executeDelete(Connection connection, JsonObject body) throws SQLExcep return stmt.executeUpdate(); } - public boolean executeRecordExists(Connection connection) throws SQLException { + public boolean executeRecordExists(Connection connection, JsonObject body) throws SQLException { validateQuery(); String sql = "SELECT COUNT(*)" + " FROM " + tableName + " WHERE " + lookupField + " = ?"; PreparedStatement stmt = connection.prepareStatement(sql); - stmt.setString(1, lookupValue); + Utils.setStatementParam(stmt, 1, lookupField, body); ResultSet rs = stmt.executeQuery(); rs.next(); return rs.getInt(1) > 0; diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java index fbad48b..521be6c 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java @@ -89,13 +89,13 @@ public int executeDelete(Connection connection, JsonObject body) throws SQLExcep return stmt.executeUpdate(); } - public boolean executeRecordExists(Connection connection) throws SQLException { + public boolean executeRecordExists(Connection connection, JsonObject body) throws SQLException { validateQuery(); String sql = "SELECT COUNT(*)" + " FROM " + tableName + " WHERE " + lookupField + " = ?"; PreparedStatement stmt = connection.prepareStatement(sql); - stmt.setString(1, lookupValue); + Utils.setStatementParam(stmt, 1, lookupField, body); ResultSet rs = stmt.executeQuery(); rs.next(); return rs.getInt(1) > 0; diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java b/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java index 5a33708..59935b0 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java @@ -55,7 +55,7 @@ public Query selectPolling(String sqlQuery, Timestamp fieldValue) { abstract public ResultSet executeLookup(Connection connection, JsonObject body) throws SQLException; - abstract public boolean executeRecordExists(Connection connection) throws SQLException; + abstract public boolean executeRecordExists(Connection connection, JsonObject body) throws SQLException; abstract public int executeDelete(Connection connection, JsonObject body) throws SQLException; diff --git a/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java b/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java index 3724740..88c038f 100644 --- a/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java +++ b/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java @@ -90,7 +90,7 @@ public void execute(ExecutionParameters parameters) { Query query = queryFactory.getQuery(dbEngine); logger.info("Lookup parameters: {} = {}", primaryKey.toString(), primaryValue.toString()); query.from(tableName).lookup(primaryKey.toString(), primaryValue.toString()); - if (query.executeRecordExists(connection)) { + if (query.executeRecordExists(connection, body)) { logger.info("Update parameters: {} = {}", primaryKey.toString(), primaryValue.toString()); query.executeUpdate(connection, tableName, primaryKey.toString(), primaryValue.toString(), body); } else { From e8ab2c5094c7619ed71c05484814455a4da4c2ee Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Tue, 14 Aug 2018 13:41:24 +0300 Subject: [PATCH 10/56] Update action UpsertRowByPrimaryKey Update unittest UpsertRowByPrimaryKeyMSSQLSpec --- .../jdbc/actions/UpsertRowByPrimaryKey.java | 27 +-- .../UpsertRowByPrimaryKeyMSSQLSpec.groovy | 170 ++++++++++-------- 2 files changed, 109 insertions(+), 88 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java b/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java index 88c038f..f1f06dc 100644 --- a/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java +++ b/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java @@ -30,8 +30,8 @@ public void execute(ExecutionParameters parameters) { final JsonObject configuration = parameters.getConfiguration(); final JsonObject body = parameters.getMessage().getBody(); JsonObject snapshot = parameters.getSnapshot(); - String tableName = ""; - String dbEngine = ""; + String tableName; + String dbEngine; String schemaName = ""; ResultSet rs = null; String primaryKey = ""; @@ -62,41 +62,46 @@ public void execute(ExecutionParameters parameters) { try { DatabaseMetaData dbMetaData = connection.getMetaData(); + if (tableName.contains(".")) { schemaName = (isOracle) ? tableName.split("\\.")[0].toUpperCase() : tableName.split("\\.")[0]; tableName = (isOracle) ? tableName.split("\\.")[1].toUpperCase() : tableName.split("\\.")[1]; } - rs = dbMetaData - .getPrimaryKeys(null, ((isOracle && !schemaName.isEmpty()) ? schemaName : null), - tableName); + + rs = dbMetaData.getPrimaryKeys(null, ((isOracle && !schemaName.isEmpty()) ? schemaName : null),tableName); + while (rs.next()) { primaryKey=rs.getString("COLUMN_NAME"); primaryKeysCount++; } + if (primaryKeysCount == 1) { logger.info("Executing upsert row by primary key action"); + for (Map.Entry entry : body.entrySet()) { if (entry.getKey().equals(primaryKey)) { logger.info("Primary key{} = {}", entry.getKey(), entry.getValue()); primaryValue.append(entry.getValue()); } } + Utils.columnTypes = Utils.getColumnTypes(connection, isOracle, tableName); logger.info("Detected column types: " + Utils.columnTypes); - Map columnTypes = Utils.getColumnTypes(connection, isOracle, tableName); QueryFactory queryFactory = new QueryFactory(); Query query = queryFactory.getQuery(dbEngine); - logger.info("Lookup parameters: {} = {}", primaryKey.toString(), primaryValue.toString()); - query.from(tableName).lookup(primaryKey.toString(), primaryValue.toString()); + logger.info("Lookup parameters: {} = {}", primaryKey, primaryValue.toString()); + query.from(tableName).lookup(primaryKey, primaryValue.toString()); + if (query.executeRecordExists(connection, body)) { - logger.info("Update parameters: {} = {}", primaryKey.toString(), primaryValue.toString()); - query.executeUpdate(connection, tableName, primaryKey.toString(), primaryValue.toString(), body); + logger.info("Update parameters: {} = {}", primaryKey, primaryValue.toString()); + query.executeUpdate(connection, tableName, primaryKey, primaryValue.toString(), body); } else { - logger.info("Insert parameters: {} = {}", primaryKey.toString(), primaryValue.toString()); + logger.info("Insert parameters: {} = {}", primaryKey, primaryValue.toString()); query.executeInsert(connection, tableName, body); } + logger.info("Emit data= {}", body.toString()); parameters.getEventEmitter().emitData(new Message.Builder().body(body).build()); snapshot = Json.createObjectBuilder().add(PROPERTY_TABLE_NAME, tableName).build(); diff --git a/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyMSSQLSpec.groovy b/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyMSSQLSpec.groovy index 6d0e412..bdc1ad0 100644 --- a/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyMSSQLSpec.groovy +++ b/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyMSSQLSpec.groovy @@ -5,6 +5,7 @@ import io.elastic.api.ExecutionParameters import io.elastic.api.Message import spock.lang.* +import javax.json.Json import javax.json.JsonObject import java.sql.Connection import java.sql.DriverManager @@ -13,8 +14,6 @@ import java.sql.ResultSet @Ignore class UpsertRowByPrimaryKeyMSSQLSpec extends Specification { - @Shared - def connectionString = System.getenv("CONN_URI_MSSQL") @Shared def user = System.getenv("CONN_USER_MSSQL") @Shared @@ -23,7 +22,10 @@ class UpsertRowByPrimaryKeyMSSQLSpec extends Specification { def databaseName = System.getenv("CONN_DBNAME_MSSQL") @Shared def host = System.getenv("CONN_HOST_MSSQL") - + @Shared + def port = System.getenv("CONN_PORT_MSSQL") + @Shared + def connectionString ="jdbc:sqlserver://" + host + ":" + port + ";database=" + databaseName @Shared Connection connection @@ -36,9 +38,11 @@ class UpsertRowByPrimaryKeyMSSQLSpec extends Specification { @Shared EventEmitter.Callback reboundCallback @Shared + EventEmitter.Callback httpReplyCallback + @Shared EventEmitter emitter @Shared - LookupRowByPrimaryKey action + UpsertRowByPrimaryKey action def setupSpec() { connection = DriverManager.getConnection(connectionString, user, password) @@ -53,26 +57,28 @@ class UpsertRowByPrimaryKeyMSSQLSpec extends Specification { snapshotCallback = Mock(EventEmitter.Callback) dataCallback = Mock(EventEmitter.Callback) reboundCallback = Mock(EventEmitter.Callback) - emitter = new EventEmitter.Builder().onData(dataCallback).onSnapshot(snapshotCallback).onError(errorCallback).onRebound(reboundCallback).build() - action = new LookupRowByPrimaryKey(emitter) + httpReplyCallback = Mock(EventEmitter.Callback) + emitter = new EventEmitter.Builder().onData(dataCallback).onSnapshot(snapshotCallback).onError(errorCallback) + .onRebound(reboundCallback).onHttpReplyCallback(httpReplyCallback).build() + action = new UpsertRowByPrimaryKey() } def runAction(JsonObject config, JsonObject body, JsonObject snapshot) { Message msg = new Message.Builder().body(body).build() - ExecutionParameters params = new ExecutionParameters(msg, config, snapshot) + ExecutionParameters params = new ExecutionParameters(msg, emitter, config, snapshot) action.execute(params); } def getStarsConfig() { - JsonObject config = Json.createObjectBuilder().build() - - config.addProperty("idColumn", "id") - config.addProperty("tableName", "stars") - config.addProperty("user", user) - config.addProperty("password", password) - config.addProperty("dbEngine", "mssql") - config.addProperty("host", host) - config.addProperty("databaseName", databaseName) + JsonObject config = Json.createObjectBuilder() + .add("tableName", "stars") + .add("user", user) + .add("password", password) + .add("dbEngine", "mssql") + .add("host", host) + .add("port", port) + .add("databaseName", databaseName) + .build(); return config; } @@ -80,7 +86,8 @@ class UpsertRowByPrimaryKeyMSSQLSpec extends Specification { String sql = "IF OBJECT_ID('stars', 'U') IS NOT NULL\n" + " DROP TABLE stars;" connection.createStatement().execute(sql); - connection.createStatement().execute("CREATE TABLE stars (id int, name varchar(255) NOT NULL, date datetime, radius int, destination int)"); + connection.createStatement().execute("CREATE TABLE stars (id int PRIMARY KEY, name varchar(255) NOT NULL, " + + "date datetime, radius int, destination int, visible bit, visibledate date)"); } def getRecords(tableName) { @@ -111,11 +118,14 @@ class UpsertRowByPrimaryKeyMSSQLSpec extends Specification { JsonObject snapshot = Json.createObjectBuilder().build() - JsonObject body = Json.createObjectBuilder().build() - body.addProperty("id", "1") - body.addProperty("name", "Taurus") - body.addProperty("date", "2015-02-19 10:10:10.0") - body.addProperty("radius", "123") + JsonObject body = Json.createObjectBuilder() + .add("id", 1) + .add("name", "Taurus") + .add("date", "2015-02-19 10:10:10.0") + .add("radius", 123) + .add("visible", true) + .add("visibledate", "2015-02-19") + .build(); runAction(getStarsConfig(), body, snapshot) @@ -123,7 +133,8 @@ class UpsertRowByPrimaryKeyMSSQLSpec extends Specification { expect: records.size() == 1 - records.get(0) == '{id=1, name=Taurus, date=2015-02-19 10:10:10.0, radius=123, destination=null}' + records.get(0) == '{id=1, name=Taurus, date=2015-02-19 10:10:10.0, radius=123, destination=null, visible=true, ' + + 'visibledate=2015-02-19}' } def "one insert, incorrect value: string in integer field"() { @@ -132,11 +143,11 @@ class UpsertRowByPrimaryKeyMSSQLSpec extends Specification { JsonObject snapshot = Json.createObjectBuilder().build() - JsonObject body = Json.createObjectBuilder().build() - body.addProperty("id", "1") - body.addProperty("name", "Taurus") - body.addProperty("radius", "test") - + JsonObject body = Json.createObjectBuilder() + .add("id", "1") + .add("name", "Taurus") + .add("radius", "test") + .build() String exceptionClass = ""; try { @@ -155,17 +166,18 @@ class UpsertRowByPrimaryKeyMSSQLSpec extends Specification { JsonObject snapshot = Json.createObjectBuilder().build() - JsonObject body1 = Json.createObjectBuilder().build() - body1.addProperty("id", "1") - body1.addProperty("name", "Taurus") - body1.addProperty("radius", "123") - + JsonObject body1 = Json.createObjectBuilder() + .add("id", 1) + .add("name", "Taurus") + .add("radius", 123) + .build() runAction(getStarsConfig(), body1, snapshot) - JsonObject body2 = Json.createObjectBuilder().build() - body2.addProperty("id", "2") - body2.addProperty("name", "Eridanus") - body2.addProperty("radius", "456") + JsonObject body2 = Json.createObjectBuilder() + .add("id", 2) + .add("name", "Eridanus") + .add("radius", 456) + .build() runAction(getStarsConfig(), body2, snapshot) @@ -173,8 +185,8 @@ class UpsertRowByPrimaryKeyMSSQLSpec extends Specification { expect: records.size() == 2 - records.get(0) == '{id=1, name=Taurus, date=null, radius=123, destination=null}' - records.get(1) == '{id=2, name=Eridanus, date=null, radius=456, destination=null}' + records.get(0) == '{id=1, name=Taurus, date=null, radius=123, destination=null, visible=null, visibledate=null}' + records.get(1) == '{id=2, name=Eridanus, date=null, radius=456, destination=null, visible=null, visibledate=null}' } def "one insert, one update by ID"() { @@ -183,44 +195,46 @@ class UpsertRowByPrimaryKeyMSSQLSpec extends Specification { JsonObject snapshot = Json.createObjectBuilder().build() - JsonObject body1 = Json.createObjectBuilder().build() - body1.addProperty("id", "1") - body1.addProperty("name", "Taurus") - body1.addProperty("radius", "123") - + JsonObject body1 = Json.createObjectBuilder() + .add("id", 1) + .add("name", "Taurus") + .add("radius", 123) + .build() runAction(getStarsConfig(), body1, snapshot) - JsonObject body2 = Json.createObjectBuilder().build() - body2.addProperty("id", "1") - body2.addProperty("name", "Eridanus") - + JsonObject body2 = Json.createObjectBuilder() + .add("id", 1) + .add("name", "Eridanus") + .build() runAction(getStarsConfig(), body2, snapshot) ArrayList records = getRecords("stars") expect: records.size() == 1 - records.get(0) == '{id=1, name=Eridanus, date=null, radius=123, destination=null}' + records.get(0) == '{id=1, name=Eridanus, date=null, radius=123, destination=null, visible=null, visibledate=null}' } def getPersonsConfig() { - JsonObject config = Json.createObjectBuilder().build() - config.addProperty("idColumn", "email") - config.addProperty("tableName", "persons") - config.addProperty("user", user) - config.addProperty("password", password) - config.addProperty("dbEngine", "mssql") - config.addProperty("host", host) - config.addProperty("databaseName", databaseName) - return config; + JsonObject config = Json.createObjectBuilder() + .add("tableName", "persons") + .add("user", user) + .add("password", password) + .add("dbEngine", "mssql") + .add("host", host) + .add("port", port) + .add("databaseName", databaseName) + .build() + return config } def preparePersonsTable() { String sql = "IF OBJECT_ID('persons', 'U') IS NOT NULL\n" + " DROP TABLE persons;" connection.createStatement().execute(sql); - connection.createStatement().execute("CREATE TABLE persons (id int, name varchar(255) NOT NULL, email varchar(255) NOT NULL)"); + connection.createStatement().execute("CREATE TABLE persons (id int, name varchar(255) NOT NULL, " + + "email varchar(255) NOT NULL PRIMARY KEY)"); } def "one insert, name with quote"() { @@ -229,10 +243,11 @@ class UpsertRowByPrimaryKeyMSSQLSpec extends Specification { JsonObject snapshot = Json.createObjectBuilder().build() - JsonObject body1 = Json.createObjectBuilder().build() - body1.addProperty("id", "1") - body1.addProperty("name", "O'Henry") - body1.addProperty("email", "ohenry@elastic.io") + JsonObject body1 = Json.createObjectBuilder() + .add("id", 1) + .add("name", "O'Henry") + .add("email", "ohenry@elastic.io") + .build() runAction(getPersonsConfig(), body1, snapshot) ArrayList records = getRecords("persons") @@ -248,22 +263,25 @@ class UpsertRowByPrimaryKeyMSSQLSpec extends Specification { JsonObject snapshot = Json.createObjectBuilder().build() - JsonObject body1 = Json.createObjectBuilder().build() - body1.addProperty("id", "1") - body1.addProperty("name", "User1") - body1.addProperty("email", "user1@elastic.io") + JsonObject body1 = Json.createObjectBuilder() + .add("id", 1) + .add("name", "User1") + .add("email", "user1@elastic.io") + .build() runAction(getPersonsConfig(), body1, snapshot) - JsonObject body2 = Json.createObjectBuilder().build() - body2.addProperty("id", "2") - body2.addProperty("name", "User2") - body2.addProperty("email", "user2@elastic.io") + JsonObject body2 = Json.createObjectBuilder() + .add("id", 2) + .add("name", "User2") + .add("email", "user2@elastic.io") + .build() runAction(getPersonsConfig(), body2, snapshot) - JsonObject body3 = Json.createObjectBuilder().build() - body3.addProperty("id", "3") - body3.addProperty("name", "User3") - body3.addProperty("email", "user2@elastic.io") + JsonObject body3 = Json.createObjectBuilder() + .add("id", 3) + .add("name", "User3") + .add("email", "user2@elastic.io") + .build() runAction(getPersonsConfig(), body3, snapshot) ArrayList records = getRecords("persons") @@ -273,6 +291,4 @@ class UpsertRowByPrimaryKeyMSSQLSpec extends Specification { records.get(0) == '{id=1, name=User1, email=user1@elastic.io}' records.get(1) == '{id=3, name=User3, email=user2@elastic.io}' } - - } From a2491b2e3c5cec4485615491ca4068b4efb870c1 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Tue, 14 Aug 2018 17:37:44 +0300 Subject: [PATCH 11/56] New unittest UpsertRowByPrimaryKeyOracleSpec --- .../UpsertRowByPrimaryKeyOracleSpec.groovy | 321 ++++++++++++++++++ 1 file changed, 321 insertions(+) create mode 100644 src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyOracleSpec.groovy diff --git a/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyOracleSpec.groovy b/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyOracleSpec.groovy new file mode 100644 index 0000000..14a4e35 --- /dev/null +++ b/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyOracleSpec.groovy @@ -0,0 +1,321 @@ +package io.elastic.jdbc.actions + +import io.elastic.api.EventEmitter +import io.elastic.api.ExecutionParameters +import io.elastic.api.Message +import spock.lang.Ignore +import spock.lang.Shared +import spock.lang.Specification + +import javax.json.Json +import javax.json.JsonObject +import java.sql.Connection +import java.sql.DriverManager +import java.sql.ResultSet + +//@Ignore +class UpsertRowByPrimaryKeyOracleSpec extends Specification { + + @Shared + def user = "elasticio"//System.getenv("CONN_USER_MSSQL") + @Shared + def password = "PeU13cbKtH"//System.getenv("CONN_PASSWORD_MSSQL") + @Shared + def databaseName = "elasticio_testdb"//System.getenv("CONN_DBNAME_MSSQL") + @Shared + def host = "ec2-18-194-228-22.eu-central-1.compute.amazonaws.com"//System.getenv("CONN_HOST_MSSQL") + @Shared + def port = "1521"//System.getenv("CONN_PORT_MSSQL") + @Shared + def dbEngine = "oracle"//System.getenv("CONN_DBENGINE_MSSQL") + @Shared + def connectionString ="jdbc:oracle:thin:@//ec2-18-194-228-22.eu-central-1.compute.amazonaws.com:1521/XE" + @Shared + Connection connection + + @Shared + EventEmitter.Callback errorCallback + @Shared + EventEmitter.Callback snapshotCallback + @Shared + EventEmitter.Callback dataCallback + @Shared + EventEmitter.Callback reboundCallback + @Shared + EventEmitter.Callback httpReplyCallback + @Shared + EventEmitter emitter + @Shared + UpsertRowByPrimaryKey action + + def setupSpec() { + connection = DriverManager.getConnection(connectionString, user, password) + } + + def setup() { + createAction() + } + + def createAction() { + errorCallback = Mock(EventEmitter.Callback) + snapshotCallback = Mock(EventEmitter.Callback) + dataCallback = Mock(EventEmitter.Callback) + reboundCallback = Mock(EventEmitter.Callback) + httpReplyCallback = Mock(EventEmitter.Callback) + emitter = new EventEmitter.Builder().onData(dataCallback).onSnapshot(snapshotCallback).onError(errorCallback) + .onRebound(reboundCallback).onHttpReplyCallback(httpReplyCallback).build() + action = new UpsertRowByPrimaryKey() + } + + def runAction(JsonObject config, JsonObject body, JsonObject snapshot) { + Message msg = new Message.Builder().body(body).build() + ExecutionParameters params = new ExecutionParameters(msg, emitter, config, snapshot) + action.execute(params); + } + + def getStarsConfig() { + JsonObject config = Json.createObjectBuilder() + .add("tableName", "STARS") + .add("user", user) + .add("password", password) + .add("dbEngine", dbEngine) + .add("host", host) + .add("port", port) + .add("databaseName", databaseName) + .build(); + return config; + } + + def prepareStarsTable() { + String sql = "BEGIN" + + " EXECUTE IMMEDIATE 'DROP TABLE stars';" + + "EXCEPTION" + + " WHEN OTHERS THEN" + + " IF SQLCODE != -942 THEN" + + " RAISE;" + + " END IF;" + + "END;" + connection.createStatement().execute(sql); + connection.createStatement().execute("CREATE TABLE stars (id number, name varchar(255) NOT NULL, " + + "ndate timestamp, radius number, destination float,visible number(1), " + + "CONSTRAINT pk_stars PRIMARY KEY (id))"); + } + + def getRecords(tableName) { + ArrayList records = new ArrayList(); + String sql = "SELECT * FROM " + tableName; + ResultSet rs = connection.createStatement().executeQuery(sql); + while (rs.next()) { + records.add(rs.toRowResult().toString()); + } + rs.close(); + return records; + } + + def cleanupSpec() { + String sql = "BEGIN" + + " EXECUTE IMMEDIATE 'DROP TABLE persons';" + + "EXCEPTION" + + " WHEN OTHERS THEN" + + " IF SQLCODE != -942 THEN" + + " RAISE;" + + " END IF;" + + "END;" + + connection.createStatement().execute(sql) + sql = "BEGIN" + + " EXECUTE IMMEDIATE 'DROP TABLE stars';" + + "EXCEPTION" + + " WHEN OTHERS THEN" + + " IF SQLCODE != -942 THEN" + + " RAISE;" + + " END IF;" + + "END;" + connection.createStatement().execute(sql) + connection.close() + } + + def "one insert"() { + + prepareStarsTable(); + + JsonObject snapshot = Json.createObjectBuilder().build() + + JsonObject body = Json.createObjectBuilder() + .add("ID", 1) + .add("name", "Taurus") + .add("ndate", "2015-02-19 10:10:10") + .add("radius", 123) + .add("visible", 1) + .build(); + + runAction(getStarsConfig(), body, snapshot) + + ArrayList records = getRecords("stars") + + expect: + records.size() == 1 + records.get(0) == '{ID=1, NAME=Taurus, NDATE=2015-02-19 10:10:10.0, RADIUS=123, DESTINATION=null, VISIBLE=1}' + } + + def "one insert, incorrect value: string in integer field"() { + + prepareStarsTable(); + + JsonObject snapshot = Json.createObjectBuilder().build() + + JsonObject body = Json.createObjectBuilder() + .add("ID", 1) + .add("name", "Taurus") + .add("radius", "test") + .build() + String exceptionClass = ""; + + try { + runAction(getStarsConfig(), body, snapshot) + } catch (Exception e) { + exceptionClass = e.getClass().getName(); + } + + expect: + exceptionClass.contains("Exception") + } + + def "two inserts"() { + + prepareStarsTable(); + + JsonObject snapshot = Json.createObjectBuilder().build() + + JsonObject body1 = Json.createObjectBuilder() + .add("ID", 1) + .add("name", "Taurus") + .add("radius", 123) + .build() + runAction(getStarsConfig(), body1, snapshot) + + JsonObject body2 = Json.createObjectBuilder() + .add("ID", 2) + .add("name", "Eridanus") + .add("radius", 456) + .build() + + runAction(getStarsConfig(), body2, snapshot) + + ArrayList records = getRecords("stars") + + expect: + records.size() == 2 + records.get(0) == '{ID=1, NAME=Taurus, NDATE=null, RADIUS=123, DESTINATION=null, VISIBLE=null}' + records.get(1) == '{ID=2, NAME=Eridanus, NDATE=null, RADIUS=456, DESTINATION=null, VISIBLE=null}' + } + + def "one insert, one update by ID"() { + + prepareStarsTable(); + + JsonObject snapshot = Json.createObjectBuilder().build() + + JsonObject body1 = Json.createObjectBuilder() + .add("ID", 1) + .add("name", "Taurus") + .add("radius", 123) + .build() + runAction(getStarsConfig(), body1, snapshot) + + JsonObject body2 = Json.createObjectBuilder() + .add("ID", 1) + .add("name", "Eridanus") + .build() + runAction(getStarsConfig(), body2, snapshot) + + ArrayList records = getRecords("stars") + + expect: + records.size() == 1 + records.get(0) == '{ID=1, NAME=Eridanus, NDATE=null, RADIUS=123, DESTINATION=null, VISIBLE=null}' + } + + + def getPersonsConfig() { + JsonObject config = Json.createObjectBuilder() + .add("tableName", "PERSONS") + .add("user", user) + .add("password", password) + .add("dbEngine", dbEngine) + .add("host", host) + .add("port", port) + .add("databaseName", databaseName) + .build() + return config + } + + def preparePersonsTable() { + String sql = "BEGIN" + + " EXECUTE IMMEDIATE 'DROP TABLE persons';" + + "EXCEPTION" + + " WHEN OTHERS THEN" + + " IF SQLCODE != -942 THEN" + + " RAISE;" + + " END IF;" + + "END;" + connection.createStatement().execute(sql); + connection.createStatement().execute("CREATE TABLE persons (id int, name varchar(255) NOT NULL, " + + "EMAIL varchar(255) NOT NULL, CONSTRAINT pk_persons PRIMARY KEY (EMAIL))"); + } + + def "one insert, name with quote"() { + + preparePersonsTable(); + + JsonObject snapshot = Json.createObjectBuilder().build() + + JsonObject body1 = Json.createObjectBuilder() + .add("id", 1) + .add("name", "O'Henry") + .add("EMAIL", "ohenry@elastic.io") + .build() + runAction(getPersonsConfig(), body1, snapshot) + + ArrayList records = getRecords("persons") + + expect: + records.size() == 1 + records.get(0) == '{ID=1, NAME=O\'Henry, EMAIL=ohenry@elastic.io}' + } + + def "two inserts, one update by email"() { + + preparePersonsTable(); + + JsonObject snapshot = Json.createObjectBuilder().build() + + JsonObject body1 = Json.createObjectBuilder() + .add("id", 1) + .add("name", "User1") + .add("EMAIL", "user1@elastic.io") + .build() + runAction(getPersonsConfig(), body1, snapshot) + + JsonObject body2 = Json.createObjectBuilder() + .add("id", 2) + .add("name", "User2") + .add("EMAIL", "user2@elastic.io") + .build() + runAction(getPersonsConfig(), body2, snapshot) + + JsonObject body3 = Json.createObjectBuilder() + .add("id", 3) + .add("name", "User3") + .add("EMAIL", "user2@elastic.io") + .build() + runAction(getPersonsConfig(), body3, snapshot) + + ArrayList records = getRecords("persons") + + expect: + records.size() == 2 + records.get(0) == '{ID=1, NAME=User1, EMAIL=user1@elastic.io}' + records.get(1) == '{ID=3, NAME=User3, EMAIL=user2@elastic.io}' + } +} From a4d53f5b54b8b1d1fa4a2faf018b6b1c6814f9d4 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Tue, 14 Aug 2018 17:47:01 +0300 Subject: [PATCH 12/56] Update unittest UpsertRowByPrimaryKeyOracleSpec --- .../UpsertRowByPrimaryKeyOracleSpec.groovy | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyOracleSpec.groovy b/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyOracleSpec.groovy index 14a4e35..19b0156 100644 --- a/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyOracleSpec.groovy +++ b/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyOracleSpec.groovy @@ -13,23 +13,23 @@ import java.sql.Connection import java.sql.DriverManager import java.sql.ResultSet -//@Ignore +@Ignore class UpsertRowByPrimaryKeyOracleSpec extends Specification { @Shared - def user = "elasticio"//System.getenv("CONN_USER_MSSQL") + def user = System.getenv("CONN_USER_ORACLE") @Shared - def password = "PeU13cbKtH"//System.getenv("CONN_PASSWORD_MSSQL") + def password = System.getenv("CONN_PASSWORD_ORACLE") @Shared - def databaseName = "elasticio_testdb"//System.getenv("CONN_DBNAME_MSSQL") + def databaseName = System.getenv("CONN_DBNAME_ORACLE") @Shared - def host = "ec2-18-194-228-22.eu-central-1.compute.amazonaws.com"//System.getenv("CONN_HOST_MSSQL") + def host = System.getenv("CONN_HOST_ORACLE") @Shared - def port = "1521"//System.getenv("CONN_PORT_MSSQL") + def port = System.getenv("CONN_PORT_ORACLE") @Shared - def dbEngine = "oracle"//System.getenv("CONN_DBENGINE_MSSQL") + def dbEngine = "oracle" @Shared - def connectionString ="jdbc:oracle:thin:@//ec2-18-194-228-22.eu-central-1.compute.amazonaws.com:1521/XE" + def connectionString ="jdbc:oracle:thin:@//" + host + ":" + port + "/XE" @Shared Connection connection From b56fc97694a26b0828850bb727bff865d7606a3d Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Tue, 14 Aug 2018 18:21:56 +0300 Subject: [PATCH 13/56] Update unittest UpsertRowByPrimaryKeyOracleSpec --- .../UpsertRowByPrimaryKeyPostgreSpec.groovy | 294 ++++++++++++++++++ 1 file changed, 294 insertions(+) create mode 100644 src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyPostgreSpec.groovy diff --git a/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyPostgreSpec.groovy b/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyPostgreSpec.groovy new file mode 100644 index 0000000..486fa04 --- /dev/null +++ b/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyPostgreSpec.groovy @@ -0,0 +1,294 @@ +package io.elastic.jdbc.actions + +import io.elastic.api.EventEmitter +import io.elastic.api.ExecutionParameters +import io.elastic.api.Message +import spock.lang.Ignore +import spock.lang.Shared +import spock.lang.Specification + +import javax.json.Json +import javax.json.JsonObject +import java.sql.Connection +import java.sql.DriverManager +import java.sql.ResultSet + +@Ignore +class UpsertRowByPrimaryKeyPostgreSpec extends Specification { + + @Shared + def user = System.getenv("CONN_USER_POSTGRESQL") + @Shared + def password = System.getenv("CONN_PASSWORD_POSTGRESQL") + @Shared + def databaseName = System.getenv("CONN_DBNAME_POSTGRESQL") + @Shared + def host = System.getenv("CONN_HOST_POSTGRESQL") + @Shared + def port = System.getenv("CONN_PORT_POSTGRESQL") + @Shared + def dbEngine = "postgresql" + @Shared + def connectionString ="jdbc:postgresql://"+ host + ":" + port + "/" + databaseName + @Shared + Connection connection + + @Shared + EventEmitter.Callback errorCallback + @Shared + EventEmitter.Callback snapshotCallback + @Shared + EventEmitter.Callback dataCallback + @Shared + EventEmitter.Callback reboundCallback + @Shared + EventEmitter.Callback httpReplyCallback + @Shared + EventEmitter emitter + @Shared + UpsertRowByPrimaryKey action + + def setupSpec() { + connection = DriverManager.getConnection(connectionString, user, password) + } + + def setup() { + createAction() + } + + def createAction() { + errorCallback = Mock(EventEmitter.Callback) + snapshotCallback = Mock(EventEmitter.Callback) + dataCallback = Mock(EventEmitter.Callback) + reboundCallback = Mock(EventEmitter.Callback) + httpReplyCallback = Mock(EventEmitter.Callback) + emitter = new EventEmitter.Builder().onData(dataCallback).onSnapshot(snapshotCallback).onError(errorCallback) + .onRebound(reboundCallback).onHttpReplyCallback(httpReplyCallback).build() + action = new UpsertRowByPrimaryKey() + } + + def runAction(JsonObject config, JsonObject body, JsonObject snapshot) { + Message msg = new Message.Builder().body(body).build() + ExecutionParameters params = new ExecutionParameters(msg, emitter, config, snapshot) + action.execute(params); + } + + def getStarsConfig() { + JsonObject config = Json.createObjectBuilder() + .add("tableName", "stars") + .add("user", user) + .add("password", password) + .add("dbEngine", dbEngine) + .add("host", host) + .add("port", port) + .add("databaseName", databaseName) + .build(); + return config; + } + + def prepareStarsTable() { + String sql = "DROP TABLE IF EXISTS stars;" + connection.createStatement().execute(sql); + connection.createStatement().execute("CREATE TABLE stars (id int, name varchar(255) NOT NULL, " + + "date timestamp, radius int, destination int, visible boolean, visibledate date, PRIMARY KEY(id))"); + } + + def getRecords(tableName) { + ArrayList records = new ArrayList(); + String sql = "SELECT * FROM " + tableName; + ResultSet rs = connection.createStatement().executeQuery(sql); + while (rs.next()) { + records.add(rs.toRowResult().toString()); + } + rs.close(); + return records; + } + + def cleanupSpec() { + String sql = "DROP TABLE IF EXISTS persons;" + + connection.createStatement().execute(sql) + sql = "DROP TABLE IF EXISTS stars;" + connection.createStatement().execute(sql) + connection.close() + } + + def "one insert"() { + + prepareStarsTable(); + + JsonObject snapshot = Json.createObjectBuilder().build() + + JsonObject body = Json.createObjectBuilder() + .add("id", 1) + .add("name", "Taurus") + .add("date", "2015-02-19 10:10:10") + .add("radius", 123) + .add("visible", true) + .add("visibledate", "2015-02-19") + .build(); + + runAction(getStarsConfig(), body, snapshot) + + ArrayList records = getRecords("stars") + + expect: + records.size() == 1 + records.get(0) == '{id=1, name=Taurus, date=2015-02-19 10:10:10.0, radius=123, destination=null, visible=true, ' + + 'visibledate=2015-02-19}' + } + + def "one insert, incorrect value: string in integer field"() { + + prepareStarsTable(); + + JsonObject snapshot = Json.createObjectBuilder().build() + + JsonObject body = Json.createObjectBuilder() + .add("id", 1) + .add("name", "Taurus") + .add("radius", "test") + .build() + String exceptionClass = ""; + + try { + runAction(getStarsConfig(), body, snapshot) + } catch (Exception e) { + exceptionClass = e.getClass().getName(); + } + + expect: + exceptionClass.contains("Exception") + } + + def "two inserts"() { + + prepareStarsTable(); + + JsonObject snapshot = Json.createObjectBuilder().build() + + JsonObject body1 = Json.createObjectBuilder() + .add("id", 1) + .add("name", "Taurus") + .add("radius", 123) + .build() + runAction(getStarsConfig(), body1, snapshot) + + JsonObject body2 = Json.createObjectBuilder() + .add("id", 2) + .add("name", "Eridanus") + .add("radius", 456) + .build() + + runAction(getStarsConfig(), body2, snapshot) + + ArrayList records = getRecords("stars") + + expect: + records.size() == 2 + records.get(0) == '{id=1, name=Taurus, date=null, radius=123, destination=null, visible=null, visibledate=null}' + records.get(1) == '{id=2, name=Eridanus, date=null, radius=456, destination=null, visible=null, visibledate=null}' + } + + def "one insert, one update by ID"() { + + prepareStarsTable(); + + JsonObject snapshot = Json.createObjectBuilder().build() + + JsonObject body1 = Json.createObjectBuilder() + .add("id", 1) + .add("name", "Taurus") + .add("radius", 123) + .build() + runAction(getStarsConfig(), body1, snapshot) + + JsonObject body2 = Json.createObjectBuilder() + .add("id", 1) + .add("name", "Eridanus") + .build() + runAction(getStarsConfig(), body2, snapshot) + + ArrayList records = getRecords("stars") + + expect: + records.size() == 1 + records.get(0) == '{id=1, name=Eridanus, date=null, radius=123, destination=null, visible=null, visibledate=null}' + } + + + def getPersonsConfig() { + JsonObject config = Json.createObjectBuilder() + .add("tableName", "persons") + .add("user", user) + .add("password", password) + .add("dbEngine", dbEngine) + .add("host", host) + .add("port", port) + .add("databaseName", databaseName) + .build() + return config + } + + def preparePersonsTable() { + String sql = "DROP TABLE IF EXISTS persons;" + connection.createStatement().execute(sql); + connection.createStatement().execute("CREATE TABLE persons (id int, name varchar(255) NOT NULL, " + + "email varchar(255) NOT NULL, PRIMARY KEY(email))"); + } + + def "one insert, name with quote"() { + + preparePersonsTable(); + + JsonObject snapshot = Json.createObjectBuilder().build() + + JsonObject body1 = Json.createObjectBuilder() + .add("id", 1) + .add("name", "O'Henry") + .add("email", "ohenry@elastic.io") + .build() + runAction(getPersonsConfig(), body1, snapshot) + + ArrayList records = getRecords("persons") + + expect: + records.size() == 1 + records.get(0) == '{id=1, name=O\'Henry, email=ohenry@elastic.io}' + } + + def "two inserts, one update by email"() { + + preparePersonsTable(); + + JsonObject snapshot = Json.createObjectBuilder().build() + + JsonObject body1 = Json.createObjectBuilder() + .add("id", 1) + .add("name", "User1") + .add("email", "user1@elastic.io") + .build() + runAction(getPersonsConfig(), body1, snapshot) + + JsonObject body2 = Json.createObjectBuilder() + .add("id", 2) + .add("name", "User2") + .add("email", "user2@elastic.io") + .build() + runAction(getPersonsConfig(), body2, snapshot) + + JsonObject body3 = Json.createObjectBuilder() + .add("id", 3) + .add("name", "User3") + .add("email", "user2@elastic.io") + .build() + runAction(getPersonsConfig(), body3, snapshot) + + ArrayList records = getRecords("persons") + + expect: + records.size() == 2 + records.get(0) == '{id=1, name=User1, email=user1@elastic.io}' + records.get(1) == '{id=3, name=User3, email=user2@elastic.io}' + } +} From 79d72c9bf16a39bfa3da9539f51faca355a14208 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Wed, 15 Aug 2018 09:35:40 +0300 Subject: [PATCH 14/56] Update UpsertRowByPrimaryKey --- .../jdbc/actions/UpsertRowByPrimaryKey.java | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java b/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java index f1f06dc..3f03dc0 100644 --- a/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java +++ b/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java @@ -36,7 +36,7 @@ public void execute(ExecutionParameters parameters) { ResultSet rs = null; String primaryKey = ""; StringBuilder primaryValue = new StringBuilder(); - Integer primaryKeysCount = 0; + int primaryKeysCount = 0; if (configuration.containsKey(PROPERTY_TABLE_NAME) && Utils.getNonNullString(configuration, PROPERTY_TABLE_NAME).length() != 0) { @@ -62,38 +62,33 @@ public void execute(ExecutionParameters parameters) { try { DatabaseMetaData dbMetaData = connection.getMetaData(); - if (tableName.contains(".")) { schemaName = (isOracle) ? tableName.split("\\.")[0].toUpperCase() : tableName.split("\\.")[0]; tableName = (isOracle) ? tableName.split("\\.")[1].toUpperCase() : tableName.split("\\.")[1]; } - - rs = dbMetaData.getPrimaryKeys(null, ((isOracle && !schemaName.isEmpty()) ? schemaName : null),tableName); - + rs = dbMetaData + .getPrimaryKeys(null, ((isOracle && !schemaName.isEmpty()) ? schemaName : null), + tableName); while (rs.next()) { primaryKey=rs.getString("COLUMN_NAME"); primaryKeysCount++; } - if (primaryKeysCount == 1) { logger.info("Executing upsert row by primary key action"); - for (Map.Entry entry : body.entrySet()) { if (entry.getKey().equals(primaryKey)) { logger.info("Primary key{} = {}", entry.getKey(), entry.getValue()); primaryValue.append(entry.getValue()); } } - Utils.columnTypes = Utils.getColumnTypes(connection, isOracle, tableName); logger.info("Detected column types: " + Utils.columnTypes); QueryFactory queryFactory = new QueryFactory(); Query query = queryFactory.getQuery(dbEngine); logger.info("Lookup parameters: {} = {}", primaryKey, primaryValue.toString()); query.from(tableName).lookup(primaryKey, primaryValue.toString()); - if (query.executeRecordExists(connection, body)) { logger.info("Update parameters: {} = {}", primaryKey, primaryValue.toString()); query.executeUpdate(connection, tableName, primaryKey, primaryValue.toString(), body); @@ -101,7 +96,6 @@ public void execute(ExecutionParameters parameters) { logger.info("Insert parameters: {} = {}", primaryKey, primaryValue.toString()); query.executeInsert(connection, tableName, body); } - logger.info("Emit data= {}", body.toString()); parameters.getEventEmitter().emitData(new Message.Builder().body(body).build()); snapshot = Json.createObjectBuilder().add(PROPERTY_TABLE_NAME, tableName).build(); From 5bcd1cb1c74036ee2f6a4b22261bfc86ae8f8468 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Wed, 15 Aug 2018 10:07:22 +0300 Subject: [PATCH 15/56] New unittest UpsertRowByPrimaryKeyMySQLSpec --- .../UpsertRowByPrimaryKeyMySQLSpec.groovy | 294 ++++++++++++++++++ 1 file changed, 294 insertions(+) create mode 100644 src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyMySQLSpec.groovy diff --git a/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyMySQLSpec.groovy b/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyMySQLSpec.groovy new file mode 100644 index 0000000..9c570b5 --- /dev/null +++ b/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyMySQLSpec.groovy @@ -0,0 +1,294 @@ +package io.elastic.jdbc.actions + +import io.elastic.api.EventEmitter +import io.elastic.api.ExecutionParameters +import io.elastic.api.Message +import spock.lang.Ignore +import spock.lang.Shared +import spock.lang.Specification + +import javax.json.Json +import javax.json.JsonObject +import java.sql.Connection +import java.sql.DriverManager +import java.sql.ResultSet + +@Ignore +class UpsertRowByPrimaryKeyMySQLSpec extends Specification { + + @Shared + def user = System.getenv("CONN_USER_MYSQL") + @Shared + def password = System.getenv("CONN_PASSWORD_MYSQL") + @Shared + def databaseName = System.getenv("CONN_DBNAME_MYSQL") + @Shared + def host = System.getenv("CONN_HOST_MYSQL") + @Shared + def port = System.getenv("CONN_PORT_MYSQL") + @Shared + def dbEngine = "mysql" + @Shared + def connectionString ="jdbc:" + dbEngine + "://" + host + ":" + port + "/" + databaseName + "?useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC" + @Shared + Connection connection + + @Shared + EventEmitter.Callback errorCallback + @Shared + EventEmitter.Callback snapshotCallback + @Shared + EventEmitter.Callback dataCallback + @Shared + EventEmitter.Callback reboundCallback + @Shared + EventEmitter.Callback httpReplyCallback + @Shared + EventEmitter emitter + @Shared + UpsertRowByPrimaryKey action + + def setupSpec() { + connection = DriverManager.getConnection(connectionString, user, password) + } + + def setup() { + createAction() + } + + def createAction() { + errorCallback = Mock(EventEmitter.Callback) + snapshotCallback = Mock(EventEmitter.Callback) + dataCallback = Mock(EventEmitter.Callback) + reboundCallback = Mock(EventEmitter.Callback) + httpReplyCallback = Mock(EventEmitter.Callback) + emitter = new EventEmitter.Builder().onData(dataCallback).onSnapshot(snapshotCallback).onError(errorCallback) + .onRebound(reboundCallback).onHttpReplyCallback(httpReplyCallback).build() + action = new UpsertRowByPrimaryKey() + } + + def runAction(JsonObject config, JsonObject body, JsonObject snapshot) { + Message msg = new Message.Builder().body(body).build() + ExecutionParameters params = new ExecutionParameters(msg, emitter, config, snapshot) + action.execute(params); + } + + def getStarsConfig() { + JsonObject config = Json.createObjectBuilder() + .add("tableName", "stars") + .add("user", user) + .add("password", password) + .add("dbEngine", dbEngine) + .add("host", host) + .add("port", port) + .add("databaseName", databaseName) + .build(); + return config; + } + + def prepareStarsTable() { + + String sql = "DROP TABLE IF EXISTS stars;" + connection.createStatement().execute(sql); + connection.createStatement().execute("CREATE TABLE stars (id int PRIMARY KEY, name varchar(255) NOT NULL, " + + "date datetime, radius int, destination int, visible bit, visibledate date)"); + } + + def getRecords(tableName) { + ArrayList records = new ArrayList(); + String sql = "SELECT * FROM " + tableName; + ResultSet rs = connection.createStatement().executeQuery(sql); + while (rs.next()) { + records.add(rs.toRowResult().toString()); + } + rs.close(); + return records; + } + + def cleanupSpec() { + String sql = "DROP TABLE IF EXISTS persons;" + + connection.createStatement().execute(sql) + sql = "DROP TABLE IF EXISTS stars;" + connection.createStatement().execute(sql) + connection.close() + } + + def "one insert"() { + + prepareStarsTable(); + + JsonObject snapshot = Json.createObjectBuilder().build() + + JsonObject body = Json.createObjectBuilder() + .add("id", 1) + .add("name", "Taurus") + .add("date", "2015-02-19 10:10:10.0") + .add("radius", 123) + .add("visible", true) + .build(); + + runAction(getStarsConfig(), body, snapshot) + + ArrayList records = getRecords("stars") + + expect: + records.size() == 1 + records.get(0) == '{id=1, name=Taurus, date=2015-02-19 10:10:10.0, radius=123, destination=null, visible=true, ' + + 'visibledate=null}' + } + + def "one insert, incorrect value: string in integer field"() { + + prepareStarsTable(); + + JsonObject snapshot = Json.createObjectBuilder().build() + + JsonObject body = Json.createObjectBuilder() + .add("id", "1") + .add("name", "Taurus") + .add("radius", "test") + .build() + String exceptionClass = ""; + + try { + runAction(getStarsConfig(), body, snapshot) + } catch (Exception e) { + exceptionClass = e.getClass().getName(); + } + + expect: + exceptionClass.contains("Exception") + } + + def "two inserts"() { + + prepareStarsTable(); + + JsonObject snapshot = Json.createObjectBuilder().build() + + JsonObject body1 = Json.createObjectBuilder() + .add("id", 1) + .add("name", "Taurus") + .add("radius", 123) + .build() + runAction(getStarsConfig(), body1, snapshot) + + JsonObject body2 = Json.createObjectBuilder() + .add("id", 2) + .add("name", "Eridanus") + .add("radius", 456) + .build() + + runAction(getStarsConfig(), body2, snapshot) + + ArrayList records = getRecords("stars") + + expect: + records.size() == 2 + records.get(0) == '{id=1, name=Taurus, date=null, radius=123, destination=null, visible=null, visibledate=null}' + records.get(1) == '{id=2, name=Eridanus, date=null, radius=456, destination=null, visible=null, visibledate=null}' + } + + def "one insert, one update by ID"() { + + prepareStarsTable(); + + JsonObject snapshot = Json.createObjectBuilder().build() + + JsonObject body1 = Json.createObjectBuilder() + .add("id", 1) + .add("name", "Taurus") + .add("radius", 123) + .build() + runAction(getStarsConfig(), body1, snapshot) + + JsonObject body2 = Json.createObjectBuilder() + .add("id", 1) + .add("name", "Eridanus") + .build() + runAction(getStarsConfig(), body2, snapshot) + + ArrayList records = getRecords("stars") + + expect: + records.size() == 1 + records.get(0) == '{id=1, name=Eridanus, date=null, radius=123, destination=null, visible=null, visibledate=null}' + } + + + def getPersonsConfig() { + JsonObject config = Json.createObjectBuilder() + .add("tableName", "persons") + .add("user", user) + .add("password", password) + .add("dbEngine", dbEngine) + .add("host", host) + .add("port", port) + .add("databaseName", databaseName) + .build() + return config + } + + def preparePersonsTable() { + String sql = "DROP TABLE IF EXISTS persons;" + connection.createStatement().execute(sql); + connection.createStatement().execute("CREATE TABLE persons (id int, name varchar(255) NOT NULL, " + + "email varchar(255) NOT NULL PRIMARY KEY)"); + } + + def "one insert, name with quote"() { + + preparePersonsTable(); + + JsonObject snapshot = Json.createObjectBuilder().build() + + JsonObject body1 = Json.createObjectBuilder() + .add("id", 1) + .add("name", "O'Henry") + .add("email", "ohenry@elastic.io") + .build() + runAction(getPersonsConfig(), body1, snapshot) + + ArrayList records = getRecords("persons") + + expect: + records.size() == 1 + records.get(0) == '{id=1, name=O\'Henry, email=ohenry@elastic.io}' + } + + def "two inserts, one update by email"() { + + preparePersonsTable(); + + JsonObject snapshot = Json.createObjectBuilder().build() + + JsonObject body1 = Json.createObjectBuilder() + .add("id", 1) + .add("name", "User1") + .add("email", "user1@elastic.io") + .build() + runAction(getPersonsConfig(), body1, snapshot) + + JsonObject body2 = Json.createObjectBuilder() + .add("id", 2) + .add("name", "User2") + .add("email", "user2@elastic.io") + .build() + runAction(getPersonsConfig(), body2, snapshot) + + JsonObject body3 = Json.createObjectBuilder() + .add("id", 3) + .add("name", "User3") + .add("email", "user2@elastic.io") + .build() + runAction(getPersonsConfig(), body3, snapshot) + + ArrayList records = getRecords("persons") + + expect: + records.size() == 2 + records.get(0) == '{id=1, name=User1, email=user1@elastic.io}' + records.get(1) == '{id=3, name=User3, email=user2@elastic.io}' + } +} From 01fff79621040405b2ff0176bb37550fe4124572 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Wed, 15 Aug 2018 10:09:26 +0300 Subject: [PATCH 16/56] Update unittest QueryColumnNamesProviderSpec --- .idea/uiDesigner.xml | 124 ++++++++++++++++++ .../jdbc/QueryColumnNamesProviderSpec.groovy | 11 +- 2 files changed, 130 insertions(+), 5 deletions(-) create mode 100644 .idea/uiDesigner.xml diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/groovy/io/elastic/jdbc/QueryColumnNamesProviderSpec.groovy b/src/test/groovy/io/elastic/jdbc/QueryColumnNamesProviderSpec.groovy index b32ae9d..5f4eebd 100644 --- a/src/test/groovy/io/elastic/jdbc/QueryColumnNamesProviderSpec.groovy +++ b/src/test/groovy/io/elastic/jdbc/QueryColumnNamesProviderSpec.groovy @@ -4,24 +4,25 @@ import spock.lang.* import javax.json.Json import javax.json.JsonObject +import javax.json.JsonObjectBuilder @Ignore class QueryColumnNamesProviderSpec extends Specification { - JsonObject configuration = Json.createObjectBuilder().build() - String sqlQuery; + JsonObjectBuilder configuration = Json.createObjectBuilder() + String sqlQuery def setup() { sqlQuery = "SELECT * FROM films WHERE watched = @watched:boolean AND created = @created:date" } def "get metadata model, given json object"() { - configuration.addProperty("sqlQuery", sqlQuery) + configuration.add("sqlQuery", sqlQuery) QueryColumnNamesProvider provider = new QueryColumnNamesProvider() - JsonObject meta = provider.getMetaModel((configuration)) + JsonObject meta = provider.getMetaModel(configuration.build()) print meta expect: meta.toString() == "{\"out\":{\"type\":\"object\",\"properties\":{\"watched\":{\"title\":\"watched\",\"type\":\"boolean\"},\"created\":{\"title\":\"created\",\"type\":\"date\"}}},\"in\":{\"type\":\"object\",\"properties\":{\"watched\":{\"title\":\"watched\",\"type\":\"boolean\"},\"created\":{\"title\":\"created\",\"type\":\"date\"}}}}" } -} +} \ No newline at end of file From 721a1a2b89856d6234dc63112ef124f8aaf8cb28 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Wed, 15 Aug 2018 10:36:11 +0300 Subject: [PATCH 17/56] Update unittest QueryColumnNamesProviderSpec --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7bc34ac..9f2ad08 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ Following actions are inside: ``LOOKUP BY PRIMARY KEY`` - this action will execute select query from specified table, as criteria can be used only [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY"). The action returns only one result (a primary key is unique). +``UPSERT BY PRIMARY KEY`` - this action will execute select query from specified table, as criteria can be used only [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY"), if result is nullable, then action will execute select query by [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY"), else - action will execute update query by [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY"). The action returns only one result (a primary key is unique). + ``DELETE BY PRIMARY KEY`` - this action will execute delete query from specified table, as criteria can be used only [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY"). The action returns an integer value that indicates the number of rows affected, the returned value can be 0 or 1 (a primary key is unique). ### How works From 7fb8f8d24d07f8ece1d82f5a94073a78ac01f769 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Wed, 15 Aug 2018 18:44:32 +0300 Subject: [PATCH 18/56] Edit after review --- src/main/java/io/elastic/jdbc/ColumnNamesProvider.java | 8 ++++---- .../java/io/elastic/jdbc/PrimaryColumnNamesProvider.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/ColumnNamesProvider.java b/src/main/java/io/elastic/jdbc/ColumnNamesProvider.java index 830b7b0..fd2317a 100755 --- a/src/main/java/io/elastic/jdbc/ColumnNamesProvider.java +++ b/src/main/java/io/elastic/jdbc/ColumnNamesProvider.java @@ -57,8 +57,8 @@ public JsonObject getColumns(JsonObject configuration) { ResultSet rs = null; String schemaName = null; boolean isEmpty = true; - Boolean isOracle = (configuration.getString("dbEngine").equals("oracle")) ? true : false; - Boolean isMssql = (configuration.getString("dbEngine").equals("mssql")) ? true : false; + Boolean isOracle = configuration.getString("dbEngine").equals("oracle"); + Boolean isMssql = configuration.getString("dbEngine").equals("mssql"); try { connection = Utils.getConnection(configuration); DatabaseMetaData dbMetaData = connection.getMetaData(); @@ -97,14 +97,14 @@ public JsonObject getColumns(JsonObject configuration) { try { rs.close(); } catch (SQLException e) { - logger.error("Failed to close result set {}", e.toString()); + logger.error("Failed to close result set {}", e); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { - logger.error("Failed to close connection {}", e.toString()); + logger.error("Failed to close connection {}", e); } } } diff --git a/src/main/java/io/elastic/jdbc/PrimaryColumnNamesProvider.java b/src/main/java/io/elastic/jdbc/PrimaryColumnNamesProvider.java index a61e717..6c65709 100644 --- a/src/main/java/io/elastic/jdbc/PrimaryColumnNamesProvider.java +++ b/src/main/java/io/elastic/jdbc/PrimaryColumnNamesProvider.java @@ -57,8 +57,8 @@ public JsonObject getPrimaryColumns(JsonObject configuration) { ResultSet rs = null; String schemaName = null; Boolean isEmpty = true; - Boolean isOracle = (configuration.getString("dbEngine").equals("oracle")) ? true : false; - Boolean isMssql = (configuration.getString("dbEngine").equals("mssql")) ? true : false; + Boolean isOracle = configuration.getString("dbEngine").equals("oracle"); + Boolean isMssql = configuration.getString("dbEngine").equals("mssql"); List primaryKeys = new ArrayList(); try { connection = Utils.getConnection(configuration); @@ -111,14 +111,14 @@ public JsonObject getPrimaryColumns(JsonObject configuration) { try { rs.close(); } catch (SQLException e) { - logger.error("Failed to close result set", e.toString()); + logger.error("Failed to close result set", e); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { - logger.error("Failed to close connection", e.toString()); + logger.error("Failed to close connection", e); } } } From 00b6e306ff847af5272309aa588334e009a1da12 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Thu, 16 Aug 2018 11:55:28 +0300 Subject: [PATCH 19/56] Edit after review MSSQL --- .../io/elastic/jdbc/QueryBuilders/MSSQL.java | 58 +++++++++++++++++-- 1 file changed, 53 insertions(+), 5 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java index af86532..379d870 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java @@ -15,21 +15,33 @@ public class MSSQL extends Query { public ResultSet executeSelectQuery(Connection connection, String sqlQuery, JsonObject body) throws SQLException { PreparedStatement stmt = connection.prepareStatement(sqlQuery); - int i = 1; - for (Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - i++; + try { + int i = 1; + for (Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, i, entry.getKey(), body); + i++; + } + return stmt.executeQuery(); + } + finally { + if (stmt!=null) + stmt.close(); } - return stmt.executeQuery(); } public ResultSet executeSelectTrigger(Connection connection, String sqlQuery) throws SQLException { PreparedStatement stmt = connection.prepareStatement(sqlQuery); + try{ if (pollingValue != null) { stmt.setTimestamp(1, pollingValue); } return stmt.executeQuery(); + } + finally { + if (stmt!=null) + stmt.close(); + } } public ResultSet executePolling(Connection connection) throws SQLException { @@ -47,10 +59,16 @@ public ResultSet executePolling(Connection connection) throws SQLException { " WHERE RowNum > ?" + " AND RowNum < ?"; PreparedStatement stmt = connection.prepareStatement(sql); + try{ stmt.setTimestamp(1, pollingValue); stmt.setInt(2, skipNumber); stmt.setInt(3, countNumber + skipNumber); return stmt.executeQuery(); + } + finally { + if (stmt!=null) + stmt.close(); + } } public ResultSet executeLookup(Connection connection, JsonObject body) throws SQLException { @@ -68,12 +86,18 @@ public ResultSet executeLookup(Connection connection, JsonObject body) throws SQ " WHERE RowNum > ?" + " AND RowNum < ?"; PreparedStatement stmt = connection.prepareStatement(sql); + try{ for (Map.Entry entry : body.entrySet()) { Utils.setStatementParam(stmt, 1, entry.getKey(), body); } stmt.setInt(2, skipNumber); stmt.setInt(3, countNumber + skipNumber); return stmt.executeQuery(); + } + finally { + if (stmt!=null) + stmt.close(); + } } public int executeDelete(Connection connection, JsonObject body) throws SQLException { @@ -82,8 +106,14 @@ public int executeDelete(Connection connection, JsonObject body) throws SQLExcep " FROM " + tableName + " WHERE " + lookupField + " = ?"; PreparedStatement stmt = connection.prepareStatement(sql); + try{ stmt.setString(1, lookupValue); return stmt.executeUpdate(); + } + finally { + if (stmt!=null) + stmt.close(); + } } public boolean executeRecordExists(Connection connection, JsonObject body) throws SQLException { @@ -92,10 +122,16 @@ public boolean executeRecordExists(Connection connection, JsonObject body) throw " FROM " + tableName + " WHERE " + lookupField + " = ?"; PreparedStatement stmt = connection.prepareStatement(sql); + try{ Utils.setStatementParam(stmt, 1, lookupField, body); ResultSet rs = stmt.executeQuery(); rs.next(); return rs.getInt(1) > 0; + } + finally { + if (stmt!=null) + stmt.close(); + } } public void executeInsert(Connection connection, String tableName, JsonObject body) @@ -117,12 +153,18 @@ public void executeInsert(Connection connection, String tableName, JsonObject bo " (" + keys.toString() + ")" + " VALUES (" + values.toString() + ")"; PreparedStatement stmt = connection.prepareStatement(sql); + try{ int i = 1; for (Map.Entry entry : body.entrySet()) { Utils.setStatementParam(stmt, i, entry.getKey(), body); i++; } stmt.execute(); + } + finally { + if (stmt!=null) + stmt.close(); + } } public void executeUpdate(Connection connection, String tableName, String idColumn, @@ -139,6 +181,7 @@ public void executeUpdate(Connection connection, String tableName, String idColu " SET " + setString.toString() + " WHERE " + idColumn + " = ?"; PreparedStatement stmt = connection.prepareStatement(sql); + try{ int i = 1; for (Map.Entry entry : body.entrySet()) { Utils.setStatementParam(stmt, i, entry.getKey(), body); @@ -146,5 +189,10 @@ public void executeUpdate(Connection connection, String tableName, String idColu } Utils.setStatementParam(stmt, i, idColumn, body); stmt.execute(); + } + finally { + if (stmt!=null) + stmt.close(); + } } } \ No newline at end of file From feb495e10576db4c19b3dcfd561bf574107b49eb Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Thu, 16 Aug 2018 12:18:31 +0300 Subject: [PATCH 20/56] Optimise Imports --- .../jdbc/actions/UpsertRowByPrimaryKey.java | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java b/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java index 3f03dc0..f1a4c97 100644 --- a/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java +++ b/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java @@ -3,22 +3,21 @@ import io.elastic.api.ExecutionParameters; import io.elastic.api.Message; import io.elastic.api.Module; +import io.elastic.jdbc.Engines; import io.elastic.jdbc.QueryBuilders.Query; import io.elastic.jdbc.QueryFactory; import io.elastic.jdbc.Utils; -import io.elastic.jdbc.Engines; - +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Map; import javax.json.Json; import javax.json.JsonObject; import javax.json.JsonValue; - - import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.sql.*; -import java.util.Map; - public class UpsertRowByPrimaryKey implements Module { private static final Logger logger = LoggerFactory.getLogger(UpsertRowByPrimaryKey.class); @@ -39,10 +38,10 @@ public void execute(ExecutionParameters parameters) { int primaryKeysCount = 0; if (configuration.containsKey(PROPERTY_TABLE_NAME) - && Utils.getNonNullString(configuration, PROPERTY_TABLE_NAME).length() != 0) { + && Utils.getNonNullString(configuration, PROPERTY_TABLE_NAME).length() != 0) { tableName = configuration.getString(PROPERTY_TABLE_NAME); } else if (snapshot.containsKey(PROPERTY_TABLE_NAME) - && Utils.getNonNullString(snapshot, PROPERTY_TABLE_NAME).length() != 0) { + && Utils.getNonNullString(snapshot, PROPERTY_TABLE_NAME).length() != 0) { tableName = snapshot.getString(PROPERTY_TABLE_NAME); } else { throw new RuntimeException("Table name is required field"); @@ -64,15 +63,15 @@ public void execute(ExecutionParameters parameters) { DatabaseMetaData dbMetaData = connection.getMetaData(); if (tableName.contains(".")) { schemaName = - (isOracle) ? tableName.split("\\.")[0].toUpperCase() : tableName.split("\\.")[0]; + (isOracle) ? tableName.split("\\.")[0].toUpperCase() : tableName.split("\\.")[0]; tableName = - (isOracle) ? tableName.split("\\.")[1].toUpperCase() : tableName.split("\\.")[1]; + (isOracle) ? tableName.split("\\.")[1].toUpperCase() : tableName.split("\\.")[1]; } rs = dbMetaData - .getPrimaryKeys(null, ((isOracle && !schemaName.isEmpty()) ? schemaName : null), - tableName); + .getPrimaryKeys(null, ((isOracle && !schemaName.isEmpty()) ? schemaName : null), + tableName); while (rs.next()) { - primaryKey=rs.getString("COLUMN_NAME"); + primaryKey = rs.getString("COLUMN_NAME"); primaryKeysCount++; } if (primaryKeysCount == 1) { From ac2c4ff9ca96ec7e18ec7948f947a4b0474c29cc Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Thu, 16 Aug 2018 14:29:32 +0300 Subject: [PATCH 21/56] Change sout to logger --- .../java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java b/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java index f1a4c97..3bdd573 100644 --- a/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java +++ b/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java @@ -111,14 +111,14 @@ public void execute(ExecutionParameters parameters) { try { rs.close(); } catch (SQLException e) { - System.out.println("Failed to close result set" + e.toString()); + logger.info("Failed to close result set {}",e); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { - System.out.println("Failed to close connection" + e.toString()); + logger.info("Failed to close connection {}", e); } } } From 6058b312bb2c62d5a41b78845899cecfb25ad038 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Mon, 20 Aug 2018 14:49:00 +0300 Subject: [PATCH 22/56] Fix bugs: 1. Oracle DB don't understand timestamp type (bug from ojdbc driver v6) 2. Required fields are not shown as required (no "*") for DBs: mySQL, postgreSQL, Oracle --- src/main/java/io/elastic/jdbc/ColumnNamesProvider.java | 6 +++--- src/main/java/io/elastic/jdbc/Utils.java | 9 +++++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/ColumnNamesProvider.java b/src/main/java/io/elastic/jdbc/ColumnNamesProvider.java index fd2317a..be4bae9 100755 --- a/src/main/java/io/elastic/jdbc/ColumnNamesProvider.java +++ b/src/main/java/io/elastic/jdbc/ColumnNamesProvider.java @@ -71,14 +71,14 @@ public JsonObject getColumns(JsonObject configuration) { while (rs.next()) { JsonObjectBuilder field = Json.createObjectBuilder(); String name = rs.getString("COLUMN_NAME"); - Boolean isRequired = false; + Boolean isRequired; + Integer isNullable = (rs.getObject("NULLABLE") != null) ? rs.getInt("NULLABLE") : 1; if (isMssql) { String isAutoincrement = (rs.getString("IS_AUTOINCREMENT") != null) ? rs.getString("IS_AUTOINCREMENT") : ""; - Integer isNullable = (rs.getObject("NULLABLE") != null) ? rs.getInt("NULLABLE") : 1; isRequired = isNullable == 0 && !isAutoincrement.equals("YES"); } else { - isRequired = false; + isRequired = isNullable == 0; } field.add("required", isRequired) .add("title", name) diff --git a/src/main/java/io/elastic/jdbc/Utils.java b/src/main/java/io/elastic/jdbc/Utils.java index fd3d5b5..777b2cc 100644 --- a/src/main/java/io/elastic/jdbc/Utils.java +++ b/src/main/java/io/elastic/jdbc/Utils.java @@ -141,7 +141,7 @@ public static void setStatementParam(PreparedStatement statement, int paramNumbe } } - private static String detectColumnType(Integer sqlType) { + private static String detectColumnType(Integer sqlType, String sqlTypeName) { if (sqlType == Types.NUMERIC || sqlType == Types.DECIMAL || sqlType == Types.TINYINT || sqlType == Types.SMALLINT || sqlType == Types.INTEGER || sqlType == Types.BIGINT || sqlType == Types.REAL || sqlType == Types.FLOAT || sqlType == Types.DOUBLE) { @@ -156,6 +156,11 @@ private static String detectColumnType(Integer sqlType) { if (sqlType == Types.BIT || sqlType == Types.BOOLEAN) { return "boolean"; } + if (sqlType==Types.OTHER) + if (sqlTypeName.toLowerCase().contains("timestamp")) + return "timestamp"; + else + return "string"; return "string"; } @@ -198,7 +203,7 @@ public static Map getColumnTypes(Connection connection, Boolean rs = md.getColumns(null, schemaName, tableName, "%"); while (rs.next()) { String name = rs.getString("COLUMN_NAME").toLowerCase(); - String type = detectColumnType(rs.getInt("DATA_TYPE")); + String type = detectColumnType(rs.getInt("DATA_TYPE"), rs.getString("TYPE_NAME")); columnTypes.put(name, type); } } catch (Exception e) { From 208c6d8e796fedbca1ba1d85853e90aea6a7bfa5 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Mon, 20 Aug 2018 14:57:58 +0300 Subject: [PATCH 23/56] Fix bugs: 1. Oracle DB don't understand timestamp type (bug from ojdbc driver v6) 2. Required fields are not shown as required (no "*") for DBs: mySQL, postgreSQL, Oracle --- src/main/java/io/elastic/jdbc/Utils.java | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/Utils.java b/src/main/java/io/elastic/jdbc/Utils.java index 777b2cc..4dbb2d4 100644 --- a/src/main/java/io/elastic/jdbc/Utils.java +++ b/src/main/java/io/elastic/jdbc/Utils.java @@ -156,11 +156,9 @@ private static String detectColumnType(Integer sqlType, String sqlTypeName) { if (sqlType == Types.BIT || sqlType == Types.BOOLEAN) { return "boolean"; } - if (sqlType==Types.OTHER) + if (sqlType == Types.OTHER) if (sqlTypeName.toLowerCase().contains("timestamp")) return "timestamp"; - else - return "string"; return "string"; } @@ -221,25 +219,19 @@ public static Map getColumnTypes(Connection connection, Boolean } public static Map getVariableTypes(String sqlQuery) { - JsonObject properties = Json.createObjectBuilder().build(); Map columnTypes = new HashMap(); Pattern pattern = Pattern.compile(Utils.VARS_REGEXP); Matcher matcher = pattern.matcher(sqlQuery); - Boolean isEmpty = true; + Boolean isEmpty; if (matcher.find()) { do { - JsonObject field = Json.createObjectBuilder().build(); String result[] = matcher.group().split(":"); String name = result[0].substring(1); String type = result[1]; - field = Json.createObjectBuilder().add("title", name) - .add("type", type).build(); - properties = Json.createObjectBuilder().add(name, field).build(); columnTypes.put(name, type); isEmpty = false; } while (matcher.find()); if (isEmpty) { - properties = Json.createObjectBuilder().add("empty dataset", "no columns").build(); columnTypes.put("empty dataset", "no columns"); } } From c6813ab10637c1b45aac2b4eba8258c3d6dec485 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Mon, 20 Aug 2018 16:44:20 +0300 Subject: [PATCH 24/56] New ColumnNamesWithPrimaryKeyProvider --- component.json | 2 +- .../ColumnNamesWithPrimaryKeyProvider.java | 138 ++++++++++++++++++ 2 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 src/main/java/io/elastic/jdbc/ColumnNamesWithPrimaryKeyProvider.java diff --git a/component.json b/component.json index c4f62d1..d6292eb 100755 --- a/component.json +++ b/component.json @@ -137,7 +137,7 @@ "model": "io.elastic.jdbc.TableNameProvider" } }, - "dynamicMetadata": "io.elastic.jdbc.ColumnNamesProvider" + "dynamicMetadata": "io.elastic.jdbc.ColumnNamesWithPrimaryKeyProvider" }, "deleteRowByPrimaryKey": { "main": "io.elastic.jdbc.actions.DeleteRowByPrimaryKey", diff --git a/src/main/java/io/elastic/jdbc/ColumnNamesWithPrimaryKeyProvider.java b/src/main/java/io/elastic/jdbc/ColumnNamesWithPrimaryKeyProvider.java new file mode 100644 index 0000000..b55b3dc --- /dev/null +++ b/src/main/java/io/elastic/jdbc/ColumnNamesWithPrimaryKeyProvider.java @@ -0,0 +1,138 @@ +package io.elastic.jdbc; + +import io.elastic.api.DynamicMetadataProvider; +import io.elastic.api.SelectModelProvider; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.Map; +import javax.json.Json; +import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; +import javax.json.JsonValue; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ColumnNamesWithPrimaryKeyProvider implements DynamicMetadataProvider, SelectModelProvider { + + private static final Logger logger = LoggerFactory.getLogger(ColumnNamesWithPrimaryKeyProvider.class); + + @Override + public JsonObject getSelectModel(JsonObject configuration) { + JsonObjectBuilder result = Json.createObjectBuilder(); + JsonObject properties = getColumns(configuration); + for (Map.Entry entry : properties.entrySet()) { + result.add(entry.getKey(), entry.getKey()); + } + return result.build(); + } + + /** + * Returns Columns list as metadata + */ + + @Override + public JsonObject getMetaModel(JsonObject configuration) { + JsonObjectBuilder result = Json.createObjectBuilder(); + JsonObjectBuilder inMetadata = Json.createObjectBuilder(); + JsonObjectBuilder outMetadata = Json.createObjectBuilder(); + JsonObject properties = getColumns(configuration); + inMetadata.add("type", "object").add("properties", properties); + outMetadata.add("type", "object").add("properties", properties); + result.add("out", outMetadata.build()).add("in", inMetadata.build()); + return result.build(); + } + + public JsonObject getColumns(JsonObject configuration) { + if (configuration.getString("tableName") == null || configuration.getString("tableName") + .isEmpty()) { + throw new RuntimeException("Table name is required"); + } + String tableName = configuration.getString("tableName"); + JsonObjectBuilder properties = Json.createObjectBuilder(); + Connection connection = null; + ResultSet rs = null; + ResultSet rsPrimaryKeys = null; + String schemaName = null; + boolean isEmpty = true; + Boolean isOracle = configuration.getString("dbEngine").equals("oracle"); + try { + connection = Utils.getConnection(configuration); + DatabaseMetaData dbMetaData = connection.getMetaData(); + if (tableName.contains(".")) { + schemaName = tableName.split("\\.")[0]; + tableName = tableName.split("\\.")[1]; + } + rsPrimaryKeys = dbMetaData + .getPrimaryKeys(null, ((isOracle && !schemaName.isEmpty()) ? schemaName : null), + tableName); + rs = dbMetaData.getColumns(null, schemaName, tableName, "%"); + while (rs.next()) { + JsonObjectBuilder field = Json.createObjectBuilder(); + String name = rs.getString("COLUMN_NAME"); + Boolean isRequired = false; + while (rsPrimaryKeys.next()){ + if (rsPrimaryKeys.getString("COLUMN_NAME").equals(name)) + { + isRequired = true; + break; + } + } + field.add("required", isRequired) + .add("title", name) + .add("type", convertType(rs.getInt("DATA_TYPE"))); + properties.add(name, field.build()); + isEmpty = false; + } + if (isEmpty) { + properties.add("empty dataset", "no columns"); + } + + } catch (SQLException e) { + throw new RuntimeException(e); + } finally { + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error("Failed to close result set {}", e); + } + } + if (rsPrimaryKeys!= null) { + try { + rsPrimaryKeys.close(); + } catch (SQLException e) { + logger.error("Failed to close result set {}", e); + } + } + if (connection != null) { + try { + connection.close(); + } catch (SQLException e) { + logger.error("Failed to close connection {}", e); + } + } + } + return properties.build(); + } + + /** + * Converts JDBC column type name to js type according to http://db.apache.org/ojb/docu/guides/jdbc-types.html + * + * @param sqlType JDBC column type + * @url http://db.apache.org/ojb/docu/guides/jdbc-types.html + */ + private String convertType(Integer sqlType) { + if (sqlType == Types.NUMERIC || sqlType == Types.DECIMAL || sqlType == Types.TINYINT + || sqlType == Types.SMALLINT || sqlType == Types.INTEGER || sqlType == Types.BIGINT + || sqlType == Types.REAL || sqlType == Types.FLOAT || sqlType == Types.DOUBLE) { + return "number"; + } + if (sqlType == Types.BIT || sqlType == Types.BOOLEAN) { + return "boolean"; + } + return "string"; + } +} From bd9768cf75b703b4046f3730db6b1c15597ef593 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Tue, 21 Aug 2018 12:22:44 +0300 Subject: [PATCH 25/56] Added .idea to gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index e36b60b..c58a5b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ out/ -.idea/checkstyle-idea.xml +.idea From 385edfa0449de00f5444d0ecbfd74fa031245e7c Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Tue, 21 Aug 2018 12:30:45 +0300 Subject: [PATCH 26/56] removed .idea from gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index c58a5b6..89f9ac0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ out/ -.idea From 7486402942faa79d3b8400325530b56757f48bb8 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Tue, 21 Aug 2018 12:33:22 +0300 Subject: [PATCH 27/56] removed idea files --- .idea/.name | 1 + .idea/checkstyle-idea.xml | 16 + .idea/compiler.xml | 9 + .idea/gradle.xml | 16 + .../Gradle__aopalliance_aopalliance_1_0.xml | 11 + ...__ch_qos_logback_logback_classic_1_2_1.xml | 11 + ...dle__ch_qos_logback_logback_core_1_2_1.xml | 11 + ...jackson_core_jackson_annotations_2_7_3.xml | 11 + ...terxml_jackson_core_jackson_core_2_7_3.xml | 11 + ...ml_jackson_core_jackson_databind_2_7_3.xml | 11 + .../Gradle__com_google_guava_guava_19_0.xml | 11 + ..._extensions_guice_assistedinject_4_1_0.xml | 11 + .../Gradle__com_google_inject_guice_4_1_0.xml | 11 + ...om_google_protobuf_protobuf_java_2_6_0.xml | 11 + ...rosoft_sqlserver_mssql_jdbc_6_4_0_jre8.xml | 11 + ...Gradle__com_rabbitmq_amqp_client_4_1_0.xml | 11 + ...adle__commons_codec_commons_codec_1_10.xml | 11 + ...e__commons_logging_commons_logging_1_2.xml | 11 + .../Gradle__io_elastic_java_api_2_1_0.xml | 11 + .../Gradle__io_elastic_sailor_jvm_2_1_0.xml | 11 + .../Gradle__javax_inject_javax_inject_1.xml | 11 + ..._javax_servlet_javax_servlet_api_3_1_0.xml | 11 + .idea/libraries/Gradle__junit_junit_4_12.xml | 11 + ...dle__mysql_mysql_connector_java_8_0_11.xml | 11 + ...apache_httpcomponents_httpclient_4_5_3.xml | 11 + ...g_apache_httpcomponents_httpcore_4_4_6.xml | 11 + ...__org_codehaus_groovy_groovy_all_2_4_9.xml | 11 + ...ipse_jetty_jetty_http_9_4_11_v20180605.xml | 11 + ...clipse_jetty_jetty_io_9_4_11_v20180605.xml | 11 + ..._jetty_jetty_security_9_4_11_v20180605.xml | 11 + ...se_jetty_jetty_server_9_4_11_v20180605.xml | 11 + ...e_jetty_jetty_servlet_9_4_11_v20180605.xml | 11 + ...ipse_jetty_jetty_util_9_4_11_v20180605.xml | 11 + ...Gradle__org_glassfish_javax_json_1_0_4.xml | 11 + ...Gradle__org_hamcrest_hamcrest_core_1_3.xml | 11 + .../Gradle__org_hsqldb_hsqldb_2_0_0.xml | 9 + ...adle__org_postgresql_postgresql_42_2_4.xml | 11 + .../Gradle__org_slf4j_slf4j_api_1_7_22.xml | 11 + ...ockframework_spock_core_1_1_groovy_2_4.xml | 11 + .idea/misc.xml | 6 + .idea/modules.xml | 10 + .idea/modules/jdbc.iml | 13 + .idea/modules/jdbc_main.iml | 44 + .idea/modules/jdbc_test.iml | 59 ++ .idea/vcs.xml | 6 + .idea/workspace.xml | 797 ++++++++++++++++++ 46 files changed, 1360 insertions(+) create mode 100644 .idea/.name create mode 100644 .idea/checkstyle-idea.xml create mode 100644 .idea/compiler.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/libraries/Gradle__aopalliance_aopalliance_1_0.xml create mode 100644 .idea/libraries/Gradle__ch_qos_logback_logback_classic_1_2_1.xml create mode 100644 .idea/libraries/Gradle__ch_qos_logback_logback_core_1_2_1.xml create mode 100644 .idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_annotations_2_7_3.xml create mode 100644 .idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_core_2_7_3.xml create mode 100644 .idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_databind_2_7_3.xml create mode 100644 .idea/libraries/Gradle__com_google_guava_guava_19_0.xml create mode 100644 .idea/libraries/Gradle__com_google_inject_extensions_guice_assistedinject_4_1_0.xml create mode 100644 .idea/libraries/Gradle__com_google_inject_guice_4_1_0.xml create mode 100644 .idea/libraries/Gradle__com_google_protobuf_protobuf_java_2_6_0.xml create mode 100644 .idea/libraries/Gradle__com_microsoft_sqlserver_mssql_jdbc_6_4_0_jre8.xml create mode 100644 .idea/libraries/Gradle__com_rabbitmq_amqp_client_4_1_0.xml create mode 100644 .idea/libraries/Gradle__commons_codec_commons_codec_1_10.xml create mode 100644 .idea/libraries/Gradle__commons_logging_commons_logging_1_2.xml create mode 100644 .idea/libraries/Gradle__io_elastic_java_api_2_1_0.xml create mode 100644 .idea/libraries/Gradle__io_elastic_sailor_jvm_2_1_0.xml create mode 100644 .idea/libraries/Gradle__javax_inject_javax_inject_1.xml create mode 100644 .idea/libraries/Gradle__javax_servlet_javax_servlet_api_3_1_0.xml create mode 100644 .idea/libraries/Gradle__junit_junit_4_12.xml create mode 100644 .idea/libraries/Gradle__mysql_mysql_connector_java_8_0_11.xml create mode 100644 .idea/libraries/Gradle__org_apache_httpcomponents_httpclient_4_5_3.xml create mode 100644 .idea/libraries/Gradle__org_apache_httpcomponents_httpcore_4_4_6.xml create mode 100644 .idea/libraries/Gradle__org_codehaus_groovy_groovy_all_2_4_9.xml create mode 100644 .idea/libraries/Gradle__org_eclipse_jetty_jetty_http_9_4_11_v20180605.xml create mode 100644 .idea/libraries/Gradle__org_eclipse_jetty_jetty_io_9_4_11_v20180605.xml create mode 100644 .idea/libraries/Gradle__org_eclipse_jetty_jetty_security_9_4_11_v20180605.xml create mode 100644 .idea/libraries/Gradle__org_eclipse_jetty_jetty_server_9_4_11_v20180605.xml create mode 100644 .idea/libraries/Gradle__org_eclipse_jetty_jetty_servlet_9_4_11_v20180605.xml create mode 100644 .idea/libraries/Gradle__org_eclipse_jetty_jetty_util_9_4_11_v20180605.xml create mode 100644 .idea/libraries/Gradle__org_glassfish_javax_json_1_0_4.xml create mode 100644 .idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml create mode 100644 .idea/libraries/Gradle__org_hsqldb_hsqldb_2_0_0.xml create mode 100644 .idea/libraries/Gradle__org_postgresql_postgresql_42_2_4.xml create mode 100644 .idea/libraries/Gradle__org_slf4j_slf4j_api_1_7_22.xml create mode 100644 .idea/libraries/Gradle__org_spockframework_spock_core_1_1_groovy_2_4.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/modules/jdbc.iml create mode 100644 .idea/modules/jdbc_main.iml create mode 100644 .idea/modules/jdbc_test.iml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..7fdc6a6 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +jdbc \ No newline at end of file diff --git a/.idea/checkstyle-idea.xml b/.idea/checkstyle-idea.xml new file mode 100644 index 0000000..8f4b34c --- /dev/null +++ b/.idea/checkstyle-idea.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..62a7b98 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..ba1ec5c --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__aopalliance_aopalliance_1_0.xml b/.idea/libraries/Gradle__aopalliance_aopalliance_1_0.xml new file mode 100644 index 0000000..dfd1af5 --- /dev/null +++ b/.idea/libraries/Gradle__aopalliance_aopalliance_1_0.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__ch_qos_logback_logback_classic_1_2_1.xml b/.idea/libraries/Gradle__ch_qos_logback_logback_classic_1_2_1.xml new file mode 100644 index 0000000..72a5e45 --- /dev/null +++ b/.idea/libraries/Gradle__ch_qos_logback_logback_classic_1_2_1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__ch_qos_logback_logback_core_1_2_1.xml b/.idea/libraries/Gradle__ch_qos_logback_logback_core_1_2_1.xml new file mode 100644 index 0000000..19a94e8 --- /dev/null +++ b/.idea/libraries/Gradle__ch_qos_logback_logback_core_1_2_1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_annotations_2_7_3.xml b/.idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_annotations_2_7_3.xml new file mode 100644 index 0000000..bff04a1 --- /dev/null +++ b/.idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_annotations_2_7_3.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_core_2_7_3.xml b/.idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_core_2_7_3.xml new file mode 100644 index 0000000..5a03608 --- /dev/null +++ b/.idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_core_2_7_3.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_databind_2_7_3.xml b/.idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_databind_2_7_3.xml new file mode 100644 index 0000000..4566850 --- /dev/null +++ b/.idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_databind_2_7_3.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_guava_guava_19_0.xml b/.idea/libraries/Gradle__com_google_guava_guava_19_0.xml new file mode 100644 index 0000000..7a74e8c --- /dev/null +++ b/.idea/libraries/Gradle__com_google_guava_guava_19_0.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_inject_extensions_guice_assistedinject_4_1_0.xml b/.idea/libraries/Gradle__com_google_inject_extensions_guice_assistedinject_4_1_0.xml new file mode 100644 index 0000000..7c07bc7 --- /dev/null +++ b/.idea/libraries/Gradle__com_google_inject_extensions_guice_assistedinject_4_1_0.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_inject_guice_4_1_0.xml b/.idea/libraries/Gradle__com_google_inject_guice_4_1_0.xml new file mode 100644 index 0000000..b294dd4 --- /dev/null +++ b/.idea/libraries/Gradle__com_google_inject_guice_4_1_0.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_protobuf_protobuf_java_2_6_0.xml b/.idea/libraries/Gradle__com_google_protobuf_protobuf_java_2_6_0.xml new file mode 100644 index 0000000..fa9370f --- /dev/null +++ b/.idea/libraries/Gradle__com_google_protobuf_protobuf_java_2_6_0.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_microsoft_sqlserver_mssql_jdbc_6_4_0_jre8.xml b/.idea/libraries/Gradle__com_microsoft_sqlserver_mssql_jdbc_6_4_0_jre8.xml new file mode 100644 index 0000000..f2a13a6 --- /dev/null +++ b/.idea/libraries/Gradle__com_microsoft_sqlserver_mssql_jdbc_6_4_0_jre8.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_rabbitmq_amqp_client_4_1_0.xml b/.idea/libraries/Gradle__com_rabbitmq_amqp_client_4_1_0.xml new file mode 100644 index 0000000..9a73a25 --- /dev/null +++ b/.idea/libraries/Gradle__com_rabbitmq_amqp_client_4_1_0.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__commons_codec_commons_codec_1_10.xml b/.idea/libraries/Gradle__commons_codec_commons_codec_1_10.xml new file mode 100644 index 0000000..c847961 --- /dev/null +++ b/.idea/libraries/Gradle__commons_codec_commons_codec_1_10.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__commons_logging_commons_logging_1_2.xml b/.idea/libraries/Gradle__commons_logging_commons_logging_1_2.xml new file mode 100644 index 0000000..d26e061 --- /dev/null +++ b/.idea/libraries/Gradle__commons_logging_commons_logging_1_2.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__io_elastic_java_api_2_1_0.xml b/.idea/libraries/Gradle__io_elastic_java_api_2_1_0.xml new file mode 100644 index 0000000..e296bd9 --- /dev/null +++ b/.idea/libraries/Gradle__io_elastic_java_api_2_1_0.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__io_elastic_sailor_jvm_2_1_0.xml b/.idea/libraries/Gradle__io_elastic_sailor_jvm_2_1_0.xml new file mode 100644 index 0000000..1458141 --- /dev/null +++ b/.idea/libraries/Gradle__io_elastic_sailor_jvm_2_1_0.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml b/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml new file mode 100644 index 0000000..d92a561 --- /dev/null +++ b/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__javax_servlet_javax_servlet_api_3_1_0.xml b/.idea/libraries/Gradle__javax_servlet_javax_servlet_api_3_1_0.xml new file mode 100644 index 0000000..aa298b2 --- /dev/null +++ b/.idea/libraries/Gradle__javax_servlet_javax_servlet_api_3_1_0.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__junit_junit_4_12.xml b/.idea/libraries/Gradle__junit_junit_4_12.xml new file mode 100644 index 0000000..04c10dd --- /dev/null +++ b/.idea/libraries/Gradle__junit_junit_4_12.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__mysql_mysql_connector_java_8_0_11.xml b/.idea/libraries/Gradle__mysql_mysql_connector_java_8_0_11.xml new file mode 100644 index 0000000..953a063 --- /dev/null +++ b/.idea/libraries/Gradle__mysql_mysql_connector_java_8_0_11.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_apache_httpcomponents_httpclient_4_5_3.xml b/.idea/libraries/Gradle__org_apache_httpcomponents_httpclient_4_5_3.xml new file mode 100644 index 0000000..de63f02 --- /dev/null +++ b/.idea/libraries/Gradle__org_apache_httpcomponents_httpclient_4_5_3.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_apache_httpcomponents_httpcore_4_4_6.xml b/.idea/libraries/Gradle__org_apache_httpcomponents_httpcore_4_4_6.xml new file mode 100644 index 0000000..e3ca788 --- /dev/null +++ b/.idea/libraries/Gradle__org_apache_httpcomponents_httpcore_4_4_6.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_codehaus_groovy_groovy_all_2_4_9.xml b/.idea/libraries/Gradle__org_codehaus_groovy_groovy_all_2_4_9.xml new file mode 100644 index 0000000..1d90989 --- /dev/null +++ b/.idea/libraries/Gradle__org_codehaus_groovy_groovy_all_2_4_9.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_eclipse_jetty_jetty_http_9_4_11_v20180605.xml b/.idea/libraries/Gradle__org_eclipse_jetty_jetty_http_9_4_11_v20180605.xml new file mode 100644 index 0000000..7fe853a --- /dev/null +++ b/.idea/libraries/Gradle__org_eclipse_jetty_jetty_http_9_4_11_v20180605.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_eclipse_jetty_jetty_io_9_4_11_v20180605.xml b/.idea/libraries/Gradle__org_eclipse_jetty_jetty_io_9_4_11_v20180605.xml new file mode 100644 index 0000000..365d470 --- /dev/null +++ b/.idea/libraries/Gradle__org_eclipse_jetty_jetty_io_9_4_11_v20180605.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_eclipse_jetty_jetty_security_9_4_11_v20180605.xml b/.idea/libraries/Gradle__org_eclipse_jetty_jetty_security_9_4_11_v20180605.xml new file mode 100644 index 0000000..9881c80 --- /dev/null +++ b/.idea/libraries/Gradle__org_eclipse_jetty_jetty_security_9_4_11_v20180605.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_eclipse_jetty_jetty_server_9_4_11_v20180605.xml b/.idea/libraries/Gradle__org_eclipse_jetty_jetty_server_9_4_11_v20180605.xml new file mode 100644 index 0000000..7b3ee84 --- /dev/null +++ b/.idea/libraries/Gradle__org_eclipse_jetty_jetty_server_9_4_11_v20180605.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_eclipse_jetty_jetty_servlet_9_4_11_v20180605.xml b/.idea/libraries/Gradle__org_eclipse_jetty_jetty_servlet_9_4_11_v20180605.xml new file mode 100644 index 0000000..63e18e8 --- /dev/null +++ b/.idea/libraries/Gradle__org_eclipse_jetty_jetty_servlet_9_4_11_v20180605.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_eclipse_jetty_jetty_util_9_4_11_v20180605.xml b/.idea/libraries/Gradle__org_eclipse_jetty_jetty_util_9_4_11_v20180605.xml new file mode 100644 index 0000000..5ee4fde --- /dev/null +++ b/.idea/libraries/Gradle__org_eclipse_jetty_jetty_util_9_4_11_v20180605.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_glassfish_javax_json_1_0_4.xml b/.idea/libraries/Gradle__org_glassfish_javax_json_1_0_4.xml new file mode 100644 index 0000000..a105805 --- /dev/null +++ b/.idea/libraries/Gradle__org_glassfish_javax_json_1_0_4.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml b/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml new file mode 100644 index 0000000..8262f72 --- /dev/null +++ b/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_hsqldb_hsqldb_2_0_0.xml b/.idea/libraries/Gradle__org_hsqldb_hsqldb_2_0_0.xml new file mode 100644 index 0000000..5bbd00f --- /dev/null +++ b/.idea/libraries/Gradle__org_hsqldb_hsqldb_2_0_0.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_postgresql_postgresql_42_2_4.xml b/.idea/libraries/Gradle__org_postgresql_postgresql_42_2_4.xml new file mode 100644 index 0000000..9b77df4 --- /dev/null +++ b/.idea/libraries/Gradle__org_postgresql_postgresql_42_2_4.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_slf4j_slf4j_api_1_7_22.xml b/.idea/libraries/Gradle__org_slf4j_slf4j_api_1_7_22.xml new file mode 100644 index 0000000..0c54512 --- /dev/null +++ b/.idea/libraries/Gradle__org_slf4j_slf4j_api_1_7_22.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_spockframework_spock_core_1_1_groovy_2_4.xml b/.idea/libraries/Gradle__org_spockframework_spock_core_1_1_groovy_2_4.xml new file mode 100644 index 0000000..e5b510c --- /dev/null +++ b/.idea/libraries/Gradle__org_spockframework_spock_core_1_1_groovy_2_4.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..44ae3bd --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..cfa93d5 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/jdbc.iml b/.idea/modules/jdbc.iml new file mode 100644 index 0000000..e8b584c --- /dev/null +++ b/.idea/modules/jdbc.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/jdbc_main.iml b/.idea/modules/jdbc_main.iml new file mode 100644 index 0000000..6f79178 --- /dev/null +++ b/.idea/modules/jdbc_main.iml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/jdbc_test.iml b/.idea/modules/jdbc_test.iml new file mode 100644 index 0000000..398637d --- /dev/null +++ b/.idea/modules/jdbc_test.iml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..c799421 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,797 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1534765177659 + + + 1534765740439 + + + 1534766278778 + + + 1534772660882 + + + 1534843364071 + + + 1534843845810 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No facets are configured + + + + + + + + + + + + + + + 1.8 + + + + + + + + jdbc + + + + + + + + 1.8 + + + + + + + + Gradle: aopalliance:aopalliance:1.0 + + + + + + + + \ No newline at end of file From 68d04718117b4a7698449a7284cae5723a6e61ee Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Tue, 21 Aug 2018 12:34:53 +0300 Subject: [PATCH 28/56] removed .idea --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 89f9ac0..a9af0ef 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ out/ +.idea \ No newline at end of file From 01ccee3c5770ea856663beef442409ae9f1b46ce Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Tue, 21 Aug 2018 12:35:22 +0300 Subject: [PATCH 29/56] removed .idea --- .idea/workspace.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index c799421..310cf98 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -496,7 +496,7 @@ - + From 916f2cf3699f5eaa515fa66762c4dd862710a3c1 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Tue, 21 Aug 2018 12:36:19 +0300 Subject: [PATCH 30/56] removed idea files --- .gitignore | 1 - .idea/workspace.xml | 42 ++++++++++++++++++++++++++++++------------ 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index a9af0ef..89f9ac0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ out/ -.idea \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 310cf98..78b5130 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,7 +1,9 @@ - + + + @@ -44,7 +46,7 @@ - + @@ -76,14 +78,14 @@ - + - + @@ -157,7 +159,7 @@ - + @@ -490,13 +492,13 @@ - - + @@ -610,10 +657,10 @@ - + - + @@ -719,8 +766,8 @@ - - + + From 573b8261985d6aad1c38eb6b2d2d78e55e3ff2f1 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Tue, 21 Aug 2018 12:45:33 +0300 Subject: [PATCH 34/56] removed .idea --- .idea/workspace.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 2fb1a1f..935dbf5 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -545,7 +545,7 @@ - + From 66cb0a11f96a79dde3b85b8573917f7139c42e8a Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Tue, 21 Aug 2018 12:47:27 +0300 Subject: [PATCH 35/56] removed idea --- .idea/.name | 1 - .idea/checkstyle-idea.xml | 16 - .idea/compiler.xml | 9 - .idea/gradle.xml | 16 - .../Gradle__aopalliance_aopalliance_1_0.xml | 11 - ...__ch_qos_logback_logback_classic_1_2_1.xml | 11 - ...dle__ch_qos_logback_logback_core_1_2_1.xml | 11 - ...jackson_core_jackson_annotations_2_7_3.xml | 11 - ...terxml_jackson_core_jackson_core_2_7_3.xml | 11 - ...ml_jackson_core_jackson_databind_2_7_3.xml | 11 - .../Gradle__com_google_guava_guava_19_0.xml | 11 - ..._extensions_guice_assistedinject_4_1_0.xml | 11 - .../Gradle__com_google_inject_guice_4_1_0.xml | 11 - ...om_google_protobuf_protobuf_java_2_6_0.xml | 11 - ...rosoft_sqlserver_mssql_jdbc_6_4_0_jre8.xml | 11 - ...Gradle__com_rabbitmq_amqp_client_4_1_0.xml | 11 - ...adle__commons_codec_commons_codec_1_10.xml | 11 - ...e__commons_logging_commons_logging_1_2.xml | 11 - .../Gradle__io_elastic_java_api_2_1_0.xml | 11 - .../Gradle__io_elastic_sailor_jvm_2_1_0.xml | 11 - .../Gradle__javax_inject_javax_inject_1.xml | 11 - ..._javax_servlet_javax_servlet_api_3_1_0.xml | 11 - .idea/libraries/Gradle__junit_junit_4_12.xml | 11 - ...dle__mysql_mysql_connector_java_8_0_11.xml | 11 - ...apache_httpcomponents_httpclient_4_5_3.xml | 11 - ...g_apache_httpcomponents_httpcore_4_4_6.xml | 11 - ...__org_codehaus_groovy_groovy_all_2_4_9.xml | 11 - ...ipse_jetty_jetty_http_9_4_11_v20180605.xml | 11 - ...clipse_jetty_jetty_io_9_4_11_v20180605.xml | 11 - ..._jetty_jetty_security_9_4_11_v20180605.xml | 11 - ...se_jetty_jetty_server_9_4_11_v20180605.xml | 11 - ...e_jetty_jetty_servlet_9_4_11_v20180605.xml | 11 - ...ipse_jetty_jetty_util_9_4_11_v20180605.xml | 11 - ...Gradle__org_glassfish_javax_json_1_0_4.xml | 11 - ...Gradle__org_hamcrest_hamcrest_core_1_3.xml | 11 - .../Gradle__org_hsqldb_hsqldb_2_0_0.xml | 9 - ...adle__org_postgresql_postgresql_42_2_4.xml | 11 - .../Gradle__org_slf4j_slf4j_api_1_7_22.xml | 11 - ...ockframework_spock_core_1_1_groovy_2_4.xml | 11 - .idea/misc.xml | 6 - .idea/modules.xml | 10 - .idea/modules/jdbc.iml | 13 - .idea/modules/jdbc_main.iml | 44 - .idea/modules/jdbc_test.iml | 59 -- .idea/uiDesigner.xml | 124 --- .idea/vcs.xml | 6 - .idea/workspace.xml | 862 ------------------ 47 files changed, 1549 deletions(-) delete mode 100644 .idea/.name delete mode 100644 .idea/checkstyle-idea.xml delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/gradle.xml delete mode 100644 .idea/libraries/Gradle__aopalliance_aopalliance_1_0.xml delete mode 100644 .idea/libraries/Gradle__ch_qos_logback_logback_classic_1_2_1.xml delete mode 100644 .idea/libraries/Gradle__ch_qos_logback_logback_core_1_2_1.xml delete mode 100644 .idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_annotations_2_7_3.xml delete mode 100644 .idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_core_2_7_3.xml delete mode 100644 .idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_databind_2_7_3.xml delete mode 100644 .idea/libraries/Gradle__com_google_guava_guava_19_0.xml delete mode 100644 .idea/libraries/Gradle__com_google_inject_extensions_guice_assistedinject_4_1_0.xml delete mode 100644 .idea/libraries/Gradle__com_google_inject_guice_4_1_0.xml delete mode 100644 .idea/libraries/Gradle__com_google_protobuf_protobuf_java_2_6_0.xml delete mode 100644 .idea/libraries/Gradle__com_microsoft_sqlserver_mssql_jdbc_6_4_0_jre8.xml delete mode 100644 .idea/libraries/Gradle__com_rabbitmq_amqp_client_4_1_0.xml delete mode 100644 .idea/libraries/Gradle__commons_codec_commons_codec_1_10.xml delete mode 100644 .idea/libraries/Gradle__commons_logging_commons_logging_1_2.xml delete mode 100644 .idea/libraries/Gradle__io_elastic_java_api_2_1_0.xml delete mode 100644 .idea/libraries/Gradle__io_elastic_sailor_jvm_2_1_0.xml delete mode 100644 .idea/libraries/Gradle__javax_inject_javax_inject_1.xml delete mode 100644 .idea/libraries/Gradle__javax_servlet_javax_servlet_api_3_1_0.xml delete mode 100644 .idea/libraries/Gradle__junit_junit_4_12.xml delete mode 100644 .idea/libraries/Gradle__mysql_mysql_connector_java_8_0_11.xml delete mode 100644 .idea/libraries/Gradle__org_apache_httpcomponents_httpclient_4_5_3.xml delete mode 100644 .idea/libraries/Gradle__org_apache_httpcomponents_httpcore_4_4_6.xml delete mode 100644 .idea/libraries/Gradle__org_codehaus_groovy_groovy_all_2_4_9.xml delete mode 100644 .idea/libraries/Gradle__org_eclipse_jetty_jetty_http_9_4_11_v20180605.xml delete mode 100644 .idea/libraries/Gradle__org_eclipse_jetty_jetty_io_9_4_11_v20180605.xml delete mode 100644 .idea/libraries/Gradle__org_eclipse_jetty_jetty_security_9_4_11_v20180605.xml delete mode 100644 .idea/libraries/Gradle__org_eclipse_jetty_jetty_server_9_4_11_v20180605.xml delete mode 100644 .idea/libraries/Gradle__org_eclipse_jetty_jetty_servlet_9_4_11_v20180605.xml delete mode 100644 .idea/libraries/Gradle__org_eclipse_jetty_jetty_util_9_4_11_v20180605.xml delete mode 100644 .idea/libraries/Gradle__org_glassfish_javax_json_1_0_4.xml delete mode 100644 .idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml delete mode 100644 .idea/libraries/Gradle__org_hsqldb_hsqldb_2_0_0.xml delete mode 100644 .idea/libraries/Gradle__org_postgresql_postgresql_42_2_4.xml delete mode 100644 .idea/libraries/Gradle__org_slf4j_slf4j_api_1_7_22.xml delete mode 100644 .idea/libraries/Gradle__org_spockframework_spock_core_1_1_groovy_2_4.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/modules/jdbc.iml delete mode 100644 .idea/modules/jdbc_main.iml delete mode 100644 .idea/modules/jdbc_test.iml delete mode 100644 .idea/uiDesigner.xml delete mode 100644 .idea/vcs.xml delete mode 100644 .idea/workspace.xml diff --git a/.idea/.name b/.idea/.name deleted file mode 100644 index 7fdc6a6..0000000 --- a/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -jdbc \ No newline at end of file diff --git a/.idea/checkstyle-idea.xml b/.idea/checkstyle-idea.xml deleted file mode 100644 index 8f4b34c..0000000 --- a/.idea/checkstyle-idea.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index 62a7b98..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index ba1ec5c..0000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__aopalliance_aopalliance_1_0.xml b/.idea/libraries/Gradle__aopalliance_aopalliance_1_0.xml deleted file mode 100644 index dfd1af5..0000000 --- a/.idea/libraries/Gradle__aopalliance_aopalliance_1_0.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__ch_qos_logback_logback_classic_1_2_1.xml b/.idea/libraries/Gradle__ch_qos_logback_logback_classic_1_2_1.xml deleted file mode 100644 index 72a5e45..0000000 --- a/.idea/libraries/Gradle__ch_qos_logback_logback_classic_1_2_1.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__ch_qos_logback_logback_core_1_2_1.xml b/.idea/libraries/Gradle__ch_qos_logback_logback_core_1_2_1.xml deleted file mode 100644 index 19a94e8..0000000 --- a/.idea/libraries/Gradle__ch_qos_logback_logback_core_1_2_1.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_annotations_2_7_3.xml b/.idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_annotations_2_7_3.xml deleted file mode 100644 index bff04a1..0000000 --- a/.idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_annotations_2_7_3.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_core_2_7_3.xml b/.idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_core_2_7_3.xml deleted file mode 100644 index 5a03608..0000000 --- a/.idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_core_2_7_3.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_databind_2_7_3.xml b/.idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_databind_2_7_3.xml deleted file mode 100644 index 4566850..0000000 --- a/.idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_databind_2_7_3.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_guava_guava_19_0.xml b/.idea/libraries/Gradle__com_google_guava_guava_19_0.xml deleted file mode 100644 index 7a74e8c..0000000 --- a/.idea/libraries/Gradle__com_google_guava_guava_19_0.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_inject_extensions_guice_assistedinject_4_1_0.xml b/.idea/libraries/Gradle__com_google_inject_extensions_guice_assistedinject_4_1_0.xml deleted file mode 100644 index 7c07bc7..0000000 --- a/.idea/libraries/Gradle__com_google_inject_extensions_guice_assistedinject_4_1_0.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_inject_guice_4_1_0.xml b/.idea/libraries/Gradle__com_google_inject_guice_4_1_0.xml deleted file mode 100644 index b294dd4..0000000 --- a/.idea/libraries/Gradle__com_google_inject_guice_4_1_0.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_protobuf_protobuf_java_2_6_0.xml b/.idea/libraries/Gradle__com_google_protobuf_protobuf_java_2_6_0.xml deleted file mode 100644 index fa9370f..0000000 --- a/.idea/libraries/Gradle__com_google_protobuf_protobuf_java_2_6_0.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_microsoft_sqlserver_mssql_jdbc_6_4_0_jre8.xml b/.idea/libraries/Gradle__com_microsoft_sqlserver_mssql_jdbc_6_4_0_jre8.xml deleted file mode 100644 index f2a13a6..0000000 --- a/.idea/libraries/Gradle__com_microsoft_sqlserver_mssql_jdbc_6_4_0_jre8.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_rabbitmq_amqp_client_4_1_0.xml b/.idea/libraries/Gradle__com_rabbitmq_amqp_client_4_1_0.xml deleted file mode 100644 index 9a73a25..0000000 --- a/.idea/libraries/Gradle__com_rabbitmq_amqp_client_4_1_0.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__commons_codec_commons_codec_1_10.xml b/.idea/libraries/Gradle__commons_codec_commons_codec_1_10.xml deleted file mode 100644 index c847961..0000000 --- a/.idea/libraries/Gradle__commons_codec_commons_codec_1_10.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__commons_logging_commons_logging_1_2.xml b/.idea/libraries/Gradle__commons_logging_commons_logging_1_2.xml deleted file mode 100644 index d26e061..0000000 --- a/.idea/libraries/Gradle__commons_logging_commons_logging_1_2.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__io_elastic_java_api_2_1_0.xml b/.idea/libraries/Gradle__io_elastic_java_api_2_1_0.xml deleted file mode 100644 index e296bd9..0000000 --- a/.idea/libraries/Gradle__io_elastic_java_api_2_1_0.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__io_elastic_sailor_jvm_2_1_0.xml b/.idea/libraries/Gradle__io_elastic_sailor_jvm_2_1_0.xml deleted file mode 100644 index 1458141..0000000 --- a/.idea/libraries/Gradle__io_elastic_sailor_jvm_2_1_0.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml b/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml deleted file mode 100644 index d92a561..0000000 --- a/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__javax_servlet_javax_servlet_api_3_1_0.xml b/.idea/libraries/Gradle__javax_servlet_javax_servlet_api_3_1_0.xml deleted file mode 100644 index aa298b2..0000000 --- a/.idea/libraries/Gradle__javax_servlet_javax_servlet_api_3_1_0.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__junit_junit_4_12.xml b/.idea/libraries/Gradle__junit_junit_4_12.xml deleted file mode 100644 index 04c10dd..0000000 --- a/.idea/libraries/Gradle__junit_junit_4_12.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__mysql_mysql_connector_java_8_0_11.xml b/.idea/libraries/Gradle__mysql_mysql_connector_java_8_0_11.xml deleted file mode 100644 index 953a063..0000000 --- a/.idea/libraries/Gradle__mysql_mysql_connector_java_8_0_11.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_apache_httpcomponents_httpclient_4_5_3.xml b/.idea/libraries/Gradle__org_apache_httpcomponents_httpclient_4_5_3.xml deleted file mode 100644 index de63f02..0000000 --- a/.idea/libraries/Gradle__org_apache_httpcomponents_httpclient_4_5_3.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_apache_httpcomponents_httpcore_4_4_6.xml b/.idea/libraries/Gradle__org_apache_httpcomponents_httpcore_4_4_6.xml deleted file mode 100644 index e3ca788..0000000 --- a/.idea/libraries/Gradle__org_apache_httpcomponents_httpcore_4_4_6.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_codehaus_groovy_groovy_all_2_4_9.xml b/.idea/libraries/Gradle__org_codehaus_groovy_groovy_all_2_4_9.xml deleted file mode 100644 index 1d90989..0000000 --- a/.idea/libraries/Gradle__org_codehaus_groovy_groovy_all_2_4_9.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_eclipse_jetty_jetty_http_9_4_11_v20180605.xml b/.idea/libraries/Gradle__org_eclipse_jetty_jetty_http_9_4_11_v20180605.xml deleted file mode 100644 index 7fe853a..0000000 --- a/.idea/libraries/Gradle__org_eclipse_jetty_jetty_http_9_4_11_v20180605.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_eclipse_jetty_jetty_io_9_4_11_v20180605.xml b/.idea/libraries/Gradle__org_eclipse_jetty_jetty_io_9_4_11_v20180605.xml deleted file mode 100644 index 365d470..0000000 --- a/.idea/libraries/Gradle__org_eclipse_jetty_jetty_io_9_4_11_v20180605.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_eclipse_jetty_jetty_security_9_4_11_v20180605.xml b/.idea/libraries/Gradle__org_eclipse_jetty_jetty_security_9_4_11_v20180605.xml deleted file mode 100644 index 9881c80..0000000 --- a/.idea/libraries/Gradle__org_eclipse_jetty_jetty_security_9_4_11_v20180605.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_eclipse_jetty_jetty_server_9_4_11_v20180605.xml b/.idea/libraries/Gradle__org_eclipse_jetty_jetty_server_9_4_11_v20180605.xml deleted file mode 100644 index 7b3ee84..0000000 --- a/.idea/libraries/Gradle__org_eclipse_jetty_jetty_server_9_4_11_v20180605.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_eclipse_jetty_jetty_servlet_9_4_11_v20180605.xml b/.idea/libraries/Gradle__org_eclipse_jetty_jetty_servlet_9_4_11_v20180605.xml deleted file mode 100644 index 63e18e8..0000000 --- a/.idea/libraries/Gradle__org_eclipse_jetty_jetty_servlet_9_4_11_v20180605.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_eclipse_jetty_jetty_util_9_4_11_v20180605.xml b/.idea/libraries/Gradle__org_eclipse_jetty_jetty_util_9_4_11_v20180605.xml deleted file mode 100644 index 5ee4fde..0000000 --- a/.idea/libraries/Gradle__org_eclipse_jetty_jetty_util_9_4_11_v20180605.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_glassfish_javax_json_1_0_4.xml b/.idea/libraries/Gradle__org_glassfish_javax_json_1_0_4.xml deleted file mode 100644 index a105805..0000000 --- a/.idea/libraries/Gradle__org_glassfish_javax_json_1_0_4.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml b/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml deleted file mode 100644 index 8262f72..0000000 --- a/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_hsqldb_hsqldb_2_0_0.xml b/.idea/libraries/Gradle__org_hsqldb_hsqldb_2_0_0.xml deleted file mode 100644 index 5bbd00f..0000000 --- a/.idea/libraries/Gradle__org_hsqldb_hsqldb_2_0_0.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_postgresql_postgresql_42_2_4.xml b/.idea/libraries/Gradle__org_postgresql_postgresql_42_2_4.xml deleted file mode 100644 index 9b77df4..0000000 --- a/.idea/libraries/Gradle__org_postgresql_postgresql_42_2_4.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_slf4j_slf4j_api_1_7_22.xml b/.idea/libraries/Gradle__org_slf4j_slf4j_api_1_7_22.xml deleted file mode 100644 index 0c54512..0000000 --- a/.idea/libraries/Gradle__org_slf4j_slf4j_api_1_7_22.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_spockframework_spock_core_1_1_groovy_2_4.xml b/.idea/libraries/Gradle__org_spockframework_spock_core_1_1_groovy_2_4.xml deleted file mode 100644 index e5b510c..0000000 --- a/.idea/libraries/Gradle__org_spockframework_spock_core_1_1_groovy_2_4.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 44ae3bd..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index cfa93d5..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/jdbc.iml b/.idea/modules/jdbc.iml deleted file mode 100644 index e8b584c..0000000 --- a/.idea/modules/jdbc.iml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/jdbc_main.iml b/.idea/modules/jdbc_main.iml deleted file mode 100644 index 6f79178..0000000 --- a/.idea/modules/jdbc_main.iml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/jdbc_test.iml b/.idea/modules/jdbc_test.iml deleted file mode 100644 index 398637d..0000000 --- a/.idea/modules/jdbc_test.iml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml deleted file mode 100644 index e96534f..0000000 --- a/.idea/uiDesigner.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100644 index 935dbf5..0000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,862 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1534765177659 - - - 1534765740439 - - - 1534766278778 - - - 1534772660882 - - - 1534843364071 - - - 1534843845810 - - - 1534844093418 - - - 1534844122117 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - No facets are configured - - - - - - - - - - - - - - - 1.8 - - - - - - - - jdbc - - - - - - - - 1.8 - - - - - - - - Gradle: aopalliance:aopalliance:1.0 - - - - - - - - \ No newline at end of file From d676a7a526a5f105fb925fea29bcea7a1d5b52a5 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Tue, 21 Aug 2018 12:48:04 +0300 Subject: [PATCH 36/56] added .idea to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 89f9ac0..c58a5b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ out/ +.idea From 4cdad32a2b3042c2326c81be35676e012911e3f4 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Tue, 21 Aug 2018 13:10:18 +0300 Subject: [PATCH 37/56] Changes after review --- README.md | 2 +- .../io/elastic/jdbc/QueryBuilders/MSSQL.java | 128 +++++++++--------- .../jdbc/QueryBuilders/PostgreSQL.java | 2 +- .../jdbc/actions/UpsertRowByPrimaryKey.java | 2 +- 4 files changed, 67 insertions(+), 67 deletions(-) diff --git a/README.md b/README.md index 9f2ad08..a296a66 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Following actions are inside: ``LOOKUP BY PRIMARY KEY`` - this action will execute select query from specified table, as criteria can be used only [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY"). The action returns only one result (a primary key is unique). -``UPSERT BY PRIMARY KEY`` - this action will execute select query from specified table, as criteria can be used only [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY"), if result is nullable, then action will execute select query by [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY"), else - action will execute update query by [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY"). The action returns only one result (a primary key is unique). +``UPSERT BY PRIMARY KEY`` - this action will execute select query from specified table, as criteria can be used only [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY"), if result is nullable, then action will execute insert query by [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY"), else - action will execute update query by [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY"). The action returns only one result row (a primary key is unique). ``DELETE BY PRIMARY KEY`` - this action will execute delete query from specified table, as criteria can be used only [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY"). The action returns an integer value that indicates the number of rows affected, the returned value can be 0 or 1 (a primary key is unique). ### How works diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java index 379d870..e123dcb 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java @@ -22,25 +22,25 @@ public ResultSet executeSelectQuery(Connection connection, String sqlQuery, Json i++; } return stmt.executeQuery(); - } - finally { - if (stmt!=null) + } finally { + if (stmt != null) { stmt.close(); + } } } public ResultSet executeSelectTrigger(Connection connection, String sqlQuery) throws SQLException { PreparedStatement stmt = connection.prepareStatement(sqlQuery); - try{ - if (pollingValue != null) { - stmt.setTimestamp(1, pollingValue); - } - return stmt.executeQuery(); - } - finally { - if (stmt!=null) + try { + if (pollingValue != null) { + stmt.setTimestamp(1, pollingValue); + } + return stmt.executeQuery(); + } finally { + if (stmt != null) { stmt.close(); + } } } @@ -59,15 +59,15 @@ public ResultSet executePolling(Connection connection) throws SQLException { " WHERE RowNum > ?" + " AND RowNum < ?"; PreparedStatement stmt = connection.prepareStatement(sql); - try{ - stmt.setTimestamp(1, pollingValue); - stmt.setInt(2, skipNumber); - stmt.setInt(3, countNumber + skipNumber); - return stmt.executeQuery(); - } - finally { - if (stmt!=null) + try { + stmt.setTimestamp(1, pollingValue); + stmt.setInt(2, skipNumber); + stmt.setInt(3, countNumber + skipNumber); + return stmt.executeQuery(); + } finally { + if (stmt != null) { stmt.close(); + } } } @@ -86,17 +86,17 @@ public ResultSet executeLookup(Connection connection, JsonObject body) throws SQ " WHERE RowNum > ?" + " AND RowNum < ?"; PreparedStatement stmt = connection.prepareStatement(sql); - try{ - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, 1, entry.getKey(), body); - } - stmt.setInt(2, skipNumber); - stmt.setInt(3, countNumber + skipNumber); - return stmt.executeQuery(); - } - finally { - if (stmt!=null) + try { + for (Map.Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, 1, entry.getKey(), body); + } + stmt.setInt(2, skipNumber); + stmt.setInt(3, countNumber + skipNumber); + return stmt.executeQuery(); + } finally { + if (stmt != null) { stmt.close(); + } } } @@ -106,13 +106,13 @@ public int executeDelete(Connection connection, JsonObject body) throws SQLExcep " FROM " + tableName + " WHERE " + lookupField + " = ?"; PreparedStatement stmt = connection.prepareStatement(sql); - try{ - stmt.setString(1, lookupValue); - return stmt.executeUpdate(); - } - finally { - if (stmt!=null) + try { + stmt.setString(1, lookupValue); + return stmt.executeUpdate(); + } finally { + if (stmt != null) { stmt.close(); + } } } @@ -122,15 +122,15 @@ public boolean executeRecordExists(Connection connection, JsonObject body) throw " FROM " + tableName + " WHERE " + lookupField + " = ?"; PreparedStatement stmt = connection.prepareStatement(sql); - try{ - Utils.setStatementParam(stmt, 1, lookupField, body); - ResultSet rs = stmt.executeQuery(); - rs.next(); - return rs.getInt(1) > 0; - } - finally { - if (stmt!=null) + try { + Utils.setStatementParam(stmt, 1, lookupField, body); + ResultSet rs = stmt.executeQuery(); + rs.next(); + return rs.getInt(1) > 0; + } finally { + if (stmt != null) { stmt.close(); + } } } @@ -153,17 +153,17 @@ public void executeInsert(Connection connection, String tableName, JsonObject bo " (" + keys.toString() + ")" + " VALUES (" + values.toString() + ")"; PreparedStatement stmt = connection.prepareStatement(sql); - try{ - int i = 1; - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - i++; - } - stmt.execute(); - } - finally { - if (stmt!=null) + try { + int i = 1; + for (Map.Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, i, entry.getKey(), body); + i++; + } + stmt.execute(); + } finally { + if (stmt != null) { stmt.close(); + } } } @@ -181,18 +181,18 @@ public void executeUpdate(Connection connection, String tableName, String idColu " SET " + setString.toString() + " WHERE " + idColumn + " = ?"; PreparedStatement stmt = connection.prepareStatement(sql); - try{ - int i = 1; - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - i++; - } - Utils.setStatementParam(stmt, i, idColumn, body); - stmt.execute(); - } - finally { - if (stmt!=null) + try { + int i = 1; + for (Map.Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, i, entry.getKey(), body); + i++; + } + Utils.setStatementParam(stmt, i, idColumn, body); + stmt.execute(); + } finally { + if (stmt != null) { stmt.close(); + } } } } \ No newline at end of file diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java index 521be6c..4453b3f 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java @@ -150,4 +150,4 @@ public void executeUpdate(Connection connection, String tableName, String idColu Utils.setStatementParam(stmt, i, idColumn, body); stmt.execute(); } -} \ No newline at end of file +} diff --git a/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java b/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java index 3bdd573..d35b9c3 100644 --- a/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java +++ b/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java @@ -123,4 +123,4 @@ public void execute(ExecutionParameters parameters) { } } } -} \ No newline at end of file +} From 17badfb1f8a283f7ec30d53e5030bfa0975861e8 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Tue, 21 Aug 2018 16:26:25 +0300 Subject: [PATCH 38/56] Add current limitations to readme --- README.md | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a296a66..ef3435e 100644 --- a/README.md +++ b/README.md @@ -31,10 +31,7 @@ You can add the authorisation methods during the integration flow design or by g ### DB Engine ![image](https://user-images.githubusercontent.com/40201204/43577772-6f85bdea-9655-11e8-96e1-368493a36c9d.png) You are able to choose one of existing database types -- ``MySQL`` - compatible with MySQL Server 5.5, 5.6, 5.7 and 8.0. -- ``PostgreSQL`` - compatible with PostgreSQL 8.2 and higher -- ``Oracle`` - compatible with Oracle Database 8.1.7 - 12.1.0.2 -- ``MSSQL`` - compatible with Microsoft SQL Server 2008 R2 and higher + ### Connection URI In the Connection URI field please provide hostname of the server, e.g. ``acme.com`` ### Connection port @@ -122,12 +119,20 @@ Component supports dynamic incoming metadata - as soon as your query is in place ### LOOKUP BY PRIMARY KEY ![image](https://user-images.githubusercontent.com/40201204/43592505-5b6bbfe8-967e-11e8-845e-2ce8ac707357.png) + The action will execute select query from a ``Table`` dropdown field, as criteria can be used only [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY"). The action returns only one result (a primary key is unique). Checkbox ``Don't throw Error on an Empty Result`` allows to emit an empty response, otherwise you will get an error on empty response. #### Input fields description ![image](https://user-images.githubusercontent.com/40201204/43644579-f593d1c8-9737-11e8-9b97-ee9e575a19f7.png) As an input metadata you will get a Primary Key field to provide the data inside as a clause value. +### UPSERT BY PRIMARY KEY +![image](https://user-images.githubusercontent.com/16806832/44396836-d3880280-a546-11e8-8fbd-efc1fd089d93.png) +The action will execute select query from a ``Tables`` dropdown field, as criteria can be used only [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY"), if result is nullable, then action will execute insert query by PRIMARY KEY with specified field, else - action will execute update query by PRIMARY KEY with specified field. The action returns only one result row (a primary key is unique). +#### Input fields description +As an input metadata you will get all fields of selected table. [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY") is required field (will mark as asterisk) and other input fields are optional. +![image](https://user-images.githubusercontent.com/16806832/44397461-1a76f780-a549-11e8-8247-9a6f9aa3f3b4.png) + ### DELETE BY PRIMARY KEY ![image](https://user-images.githubusercontent.com/40201204/43592505-5b6bbfe8-967e-11e8-845e-2ce8ac707357.png) The action will execute delete query from a ``Table`` dropdown field, as criteria can be used only [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY"). The action returns count of affected rows. @@ -136,6 +141,14 @@ Checkbox ``Don't throw Error on an Empty Result`` allows to emit an empty respon ![image](https://user-images.githubusercontent.com/40201204/43644579-f593d1c8-9737-11e8-9b97-ee9e575a19f7.png) As an input metadata you will get a Primary Key field to provide the data inside as a clause value. +## Current limitations +1. Composite primary key is not supported. +2. Only following versions of DataBase are supported: +- MySQL - compatible with MySQL Server 5.5, 5.6, 5.7 and 8.0. +- PostgreSQL - compatible with PostgreSQL 8.2 and higher +- Oracle - compatible with Oracle Database 8.1.7 - 12.1.0.2 +- MSSQL - compatible with Microsoft SQL Server 2008 R2 and higher + ## Known issues No known issues are there yet. From 82c0309012debf1e41556792af8580955c260c93 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Thu, 23 Aug 2018 15:41:50 +0300 Subject: [PATCH 39/56] Add error message about composite PK --- .../io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java b/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java index d35b9c3..a8b9949 100644 --- a/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java +++ b/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java @@ -100,9 +100,12 @@ public void execute(ExecutionParameters parameters) { snapshot = Json.createObjectBuilder().add(PROPERTY_TABLE_NAME, tableName).build(); logger.info("Emitting new snapshot {}", snapshot.toString()); parameters.getEventEmitter().emitSnapshot(snapshot); + } else if (primaryKeysCount == 0) { + logger.error("Error: Table has not Primary Key. Should be one Primary Key"); + throw new IllegalStateException("Table has not Primary Key. Should be one Primary Key"); } else { - logger.error("Error: Should be one Primary Key"); - throw new IllegalStateException("Should be one Primary Key"); + logger.error("Error: Composite Primary Key is not supported"); + throw new IllegalStateException("Composite Primary Key is not supported"); } } catch (SQLException e) { throw new RuntimeException(e); @@ -111,7 +114,7 @@ public void execute(ExecutionParameters parameters) { try { rs.close(); } catch (SQLException e) { - logger.info("Failed to close result set {}",e); + logger.info("Failed to close result set {}", e); } } if (connection != null) { From e5991f0821f5935ba1cb42c686cfd07bccb3e9c6 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Thu, 23 Aug 2018 18:54:25 +0300 Subject: [PATCH 40/56] Add error message about composite PK --- .../io/elastic/jdbc/QueryBuilders/MSSQL.java | 59 ++++++++++++++++++- .../io/elastic/jdbc/QueryBuilders/MySQL.java | 45 +++++++++++++- .../io/elastic/jdbc/QueryBuilders/Oracle.java | 54 +++++++++++++++++ .../jdbc/QueryBuilders/PostgreSQL.java | 50 ++++++++++++++++ .../io/elastic/jdbc/QueryBuilders/Query.java | 3 + .../jdbc/actions/UpsertRowByPrimaryKey.java | 11 +--- 6 files changed, 211 insertions(+), 11 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java index e123dcb..8af23b9 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java @@ -167,6 +167,63 @@ public void executeInsert(Connection connection, String tableName, JsonObject bo } } + public void executeUpsert(Connection connection, String idColumn, JsonObject body) throws SQLException { + validateQuery(); + + StringBuilder keys = new StringBuilder(); + StringBuilder values = new StringBuilder(); + StringBuilder setString = new StringBuilder(); + for (Map.Entry entry : body.entrySet()) { + if (!entry.getKey().equals(idColumn)) { + if (setString.length() > 0) { + setString.append(","); + } + setString.append(entry.getKey()).append(" = ?"); + } + if (keys.length() > 0) { + keys.append(","); + } + keys.append(entry.getKey()); + if (values.length() > 0) { + values.append(","); + } + values.append("?"); + } + String sql = "BEGIN TRANSACTION;" + + " IF EXISTS (SELECT * FROM " + tableName + + " WHERE " + idColumn + "= ?)" + + " UPDATE " + tableName + + " SET " + setString.toString() + + " WHERE " + idColumn + " = ?" + + " ELSE INSERT INTO "+ tableName + + " ("+ keys.toString() + ")" + + " VALUES (" + values.toString() + ")" + + " COMMIT;"; + PreparedStatement stmt = null; + try { + stmt = connection.prepareStatement(sql); + Utils.setStatementParam(stmt, 1, idColumn, body); + int i = 2; + for (Map.Entry entry : body.entrySet()) { + if (!entry.getKey().equals(idColumn)) { + Utils.setStatementParam(stmt, i, entry.getKey(), body); + i++; + } + } + Utils.setStatementParam(stmt, i, idColumn, body); + i++; + for (Map.Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, i, entry.getKey(), body); + i++; + } + stmt.execute(); + } finally { + if (stmt != null) { + stmt.close(); + } + } + } + public void executeUpdate(Connection connection, String tableName, String idColumn, String idValue, JsonObject body) throws SQLException { validateQuery(); @@ -195,4 +252,4 @@ public void executeUpdate(Connection connection, String tableName, String idColu } } } -} \ No newline at end of file +} diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java index 26dfff9..6fb60b0 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java @@ -143,4 +143,47 @@ public void executeUpdate(Connection connection, String tableName, String idColu stmt.execute(); } -} \ No newline at end of file + public void executeUpsert(Connection connection, String idColumn, JsonObject body) + throws SQLException { + validateQuery(); + StringBuilder keys = new StringBuilder(); + StringBuilder values = new StringBuilder(); + StringBuilder setString = new StringBuilder(); + for (Map.Entry entry : body.entrySet()) { + if (!entry.getKey().equals(idColumn)) { + if (setString.length() > 0) { + setString.append(","); + } + setString.append(entry.getKey()).append(" = ?"); + } + if (keys.length() > 0) { + keys.append(","); + } + keys.append(entry.getKey()); + if (values.length() > 0) { + values.append(","); + } + values.append("?"); + } + String sql = "INSERT INTO " + tableName + + " ("+ keys.toString() + ")" + + " VALUES (" + values.toString() + ")" + + " ON DUPLICATE KEY UPDATE " + idColumn + " = ?;"; + PreparedStatement stmt = null; + try { + stmt = connection.prepareStatement(sql); + int i = 1; + for (Map.Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, i, entry.getKey(), body); + i++; + } + Utils.setStatementParam(stmt, i, idColumn, body); + stmt.execute(); + } finally { + if (stmt != null) { + stmt.close(); + } + } + } + +} diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java index a713d75..6f61773 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java @@ -135,4 +135,58 @@ public void executeUpdate(Connection connection, String tableName, String idColu stmt.execute(); } + public void executeUpsert(Connection connection, String idColumn, JsonObject body) + throws SQLException { + validateQuery(); + StringBuilder keys = new StringBuilder(); + StringBuilder values = new StringBuilder(); + StringBuilder setString = new StringBuilder(); + for (Map.Entry entry : body.entrySet()) { + if (!entry.getKey().equals(idColumn)) { + if (setString.length() > 0) { + setString.append(","); + } + setString.append(entry.getKey()).append(" = ?"); + } + if (keys.length() > 0) { + keys.append(","); + } + keys.append(entry.getKey()); + if (values.length() > 0) { + values.append(","); + } + values.append("?"); + } + String sql = "BEGIN " + + " INSERT INTO " + tableName + + " ("+ keys.toString() + ")" + + " VALUES (" + values.toString() + ");" + + " EXCEPTION" + + " WHEN DUP_VAL_ON_INDEX THEN" + + " UPDATE " + tableName + + " SET " + setString.toString() + + " WHERE " + idColumn + " = ?;" + + " END;"; + PreparedStatement stmt = null; + try { + stmt = connection.prepareStatement(sql); + int i = 1; + for (Map.Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, i, entry.getKey(), body); + i++; + } + for (Map.Entry entry : body.entrySet()) { + if (!entry.getKey().equals(idColumn)) { + Utils.setStatementParam(stmt, i, entry.getKey(), body); + i++; + } + } + Utils.setStatementParam(stmt, i, idColumn, body); + stmt.execute(); + } finally { + if (stmt != null) { + stmt.close(); + } + } + } } diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java index 4453b3f..d428d6f 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java @@ -150,4 +150,54 @@ public void executeUpdate(Connection connection, String tableName, String idColu Utils.setStatementParam(stmt, i, idColumn, body); stmt.execute(); } + + public void executeUpsert(Connection connection, String idColumn, JsonObject body) + throws SQLException { + validateQuery(); + StringBuilder keys = new StringBuilder(); + StringBuilder values = new StringBuilder(); + StringBuilder setString = new StringBuilder(); + for (Map.Entry entry : body.entrySet()) { + if (!entry.getKey().equals(idColumn)) { + if (setString.length() > 0) { + setString.append(","); + } + setString.append(entry.getKey()).append(" = ?"); + } + if (keys.length() > 0) { + keys.append(","); + } + keys.append(entry.getKey()); + if (values.length() > 0) { + values.append(","); + } + values.append("?"); + } + String sql = "INSERT INTO " + tableName + + " ("+ keys.toString() + ")" + + " VALUES (" + values.toString() + ");" + + " ON CONFLICT (" + idColumn + ")" + + " DO UPDATE " + + " SET " + setString.toString(); + PreparedStatement stmt = null; + try { + stmt = connection.prepareStatement(sql); + int i = 1; + for (Map.Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, i, entry.getKey(), body); + i++; + } + for (Map.Entry entry : body.entrySet()) { + if (!entry.getKey().equals(idColumn)) { + Utils.setStatementParam(stmt, i, entry.getKey(), body); + i++; + } + } + stmt.execute(); + } finally { + if (stmt != null) { + stmt.close(); + } + } + } } diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java b/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java index 59935b0..01b3abb 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java @@ -65,6 +65,9 @@ abstract public void executeInsert(Connection connection, String tableName, Json abstract public void executeUpdate(Connection connection, String tableName, String idColumn, String idValue, JsonObject body) throws SQLException; + abstract public void executeUpsert(Connection connection, String idColumn, + JsonObject body) throws SQLException; + abstract public ResultSet executeSelectQuery(Connection connection, String sqlQuery, JsonObject body) throws SQLException; diff --git a/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java b/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java index a8b9949..a8de334 100644 --- a/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java +++ b/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java @@ -86,15 +86,8 @@ public void execute(ExecutionParameters parameters) { logger.info("Detected column types: " + Utils.columnTypes); QueryFactory queryFactory = new QueryFactory(); Query query = queryFactory.getQuery(dbEngine); - logger.info("Lookup parameters: {} = {}", primaryKey, primaryValue.toString()); - query.from(tableName).lookup(primaryKey, primaryValue.toString()); - if (query.executeRecordExists(connection, body)) { - logger.info("Update parameters: {} = {}", primaryKey, primaryValue.toString()); - query.executeUpdate(connection, tableName, primaryKey, primaryValue.toString(), body); - } else { - logger.info("Insert parameters: {} = {}", primaryKey, primaryValue.toString()); - query.executeInsert(connection, tableName, body); - } + logger.info("Execute upsert parameters by PK: {} = {}", primaryKey, primaryValue.toString()); + query.from(tableName).executeUpsert(connection, primaryKey, body); logger.info("Emit data= {}", body.toString()); parameters.getEventEmitter().emitData(new Message.Builder().body(body).build()); snapshot = Json.createObjectBuilder().add(PROPERTY_TABLE_NAME, tableName).build(); From 2869cd84cedd8119ab7864f950d1b8ecfbc19367 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Mon, 27 Aug 2018 13:15:49 +0300 Subject: [PATCH 41/56] Use one transactionfor UPSERT --- .../io/elastic/jdbc/QueryBuilders/MSSQL.java | 79 ++--- .../io/elastic/jdbc/QueryBuilders/MySQL.java | 307 +++++++++--------- .../io/elastic/jdbc/QueryBuilders/Oracle.java | 2 +- .../jdbc/QueryBuilders/PostgreSQL.java | 8 +- 4 files changed, 186 insertions(+), 210 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java index 8af23b9..8999efe 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java @@ -15,33 +15,21 @@ public class MSSQL extends Query { public ResultSet executeSelectQuery(Connection connection, String sqlQuery, JsonObject body) throws SQLException { PreparedStatement stmt = connection.prepareStatement(sqlQuery); - try { - int i = 1; - for (Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - i++; - } - return stmt.executeQuery(); - } finally { - if (stmt != null) { - stmt.close(); - } + int i = 1; + for (Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, i, entry.getKey(), body); + i++; } + return stmt.executeQuery(); } public ResultSet executeSelectTrigger(Connection connection, String sqlQuery) throws SQLException { PreparedStatement stmt = connection.prepareStatement(sqlQuery); - try { - if (pollingValue != null) { - stmt.setTimestamp(1, pollingValue); - } - return stmt.executeQuery(); - } finally { - if (stmt != null) { - stmt.close(); - } + if (pollingValue != null) { + stmt.setTimestamp(1, pollingValue); } + return stmt.executeQuery(); } public ResultSet executePolling(Connection connection) throws SQLException { @@ -59,16 +47,10 @@ public ResultSet executePolling(Connection connection) throws SQLException { " WHERE RowNum > ?" + " AND RowNum < ?"; PreparedStatement stmt = connection.prepareStatement(sql); - try { - stmt.setTimestamp(1, pollingValue); - stmt.setInt(2, skipNumber); - stmt.setInt(3, countNumber + skipNumber); - return stmt.executeQuery(); - } finally { - if (stmt != null) { - stmt.close(); - } - } + stmt.setTimestamp(1, pollingValue); + stmt.setInt(2, skipNumber); + stmt.setInt(3, countNumber + skipNumber); + return stmt.executeQuery(); } public ResultSet executeLookup(Connection connection, JsonObject body) throws SQLException { @@ -86,18 +68,12 @@ public ResultSet executeLookup(Connection connection, JsonObject body) throws SQ " WHERE RowNum > ?" + " AND RowNum < ?"; PreparedStatement stmt = connection.prepareStatement(sql); - try { - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, 1, entry.getKey(), body); - } - stmt.setInt(2, skipNumber); - stmt.setInt(3, countNumber + skipNumber); - return stmt.executeQuery(); - } finally { - if (stmt != null) { - stmt.close(); - } + for (Map.Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, 1, entry.getKey(), body); } + stmt.setInt(2, skipNumber); + stmt.setInt(3, countNumber + skipNumber); + return stmt.executeQuery(); } public int executeDelete(Connection connection, JsonObject body) throws SQLException { @@ -106,14 +82,8 @@ public int executeDelete(Connection connection, JsonObject body) throws SQLExcep " FROM " + tableName + " WHERE " + lookupField + " = ?"; PreparedStatement stmt = connection.prepareStatement(sql); - try { - stmt.setString(1, lookupValue); - return stmt.executeUpdate(); - } finally { - if (stmt != null) { - stmt.close(); - } - } + stmt.setString(1, lookupValue); + return stmt.executeUpdate(); } public boolean executeRecordExists(Connection connection, JsonObject body) throws SQLException { @@ -167,7 +137,8 @@ public void executeInsert(Connection connection, String tableName, JsonObject bo } } - public void executeUpsert(Connection connection, String idColumn, JsonObject body) throws SQLException { + public void executeUpsert(Connection connection, String idColumn, JsonObject body) + throws SQLException { validateQuery(); StringBuilder keys = new StringBuilder(); @@ -195,8 +166,8 @@ public void executeUpsert(Connection connection, String idColumn, JsonObject bod " UPDATE " + tableName + " SET " + setString.toString() + " WHERE " + idColumn + " = ?" + - " ELSE INSERT INTO "+ tableName + - " ("+ keys.toString() + ")" + + " ELSE INSERT INTO " + tableName + + " (" + keys.toString() + ")" + " VALUES (" + values.toString() + ")" + " COMMIT;"; PreparedStatement stmt = null; @@ -213,8 +184,8 @@ public void executeUpsert(Connection connection, String idColumn, JsonObject bod Utils.setStatementParam(stmt, i, idColumn, body); i++; for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - i++; + Utils.setStatementParam(stmt, i, entry.getKey(), body); + i++; } stmt.execute(); } finally { diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java index 6fb60b0..d5474c7 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java @@ -9,181 +9,186 @@ import java.util.Map.Entry; import javax.json.JsonObject; import javax.json.JsonValue; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class MySQL extends Query { - private static final Logger logger = LoggerFactory.getLogger(MySQL.class); - public ResultSet executeSelectQuery(Connection connection, String sqlQuery, JsonObject body) throws SQLException { - StringBuilder sql = new StringBuilder(sqlQuery); - PreparedStatement stmt = connection.prepareStatement(sql.toString()); - int i = 1; - for (Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), (entry.getValue() != null) ? body : null); - i++; - } - return stmt.executeQuery(); - } - public ResultSet executeSelectTrigger(Connection connection, String sqlQuery) throws SQLException { - StringBuilder sql = new StringBuilder(sqlQuery); - PreparedStatement stmt = connection.prepareStatement(sql.toString()); - if(pollingValue != null) { - stmt.setTimestamp(1, pollingValue); - } - return stmt.executeQuery(); + public ResultSet executeSelectQuery(Connection connection, String sqlQuery, JsonObject body) + throws SQLException { + StringBuilder sql = new StringBuilder(sqlQuery); + PreparedStatement stmt = connection.prepareStatement(sql.toString()); + int i = 1; + for (Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, i, entry.getKey(), (entry.getValue() != null) ? body : null); + i++; } + return stmt.executeQuery(); + } - public ResultSet executePolling(Connection connection) throws SQLException { - validateQuery(); - StringBuilder sql = new StringBuilder("SELECT * FROM "); - sql.append(tableName); - sql.append(" WHERE "); - sql.append(pollingField); - sql.append(" > ?"); - if (orderField != null) { - sql.append(" ORDER BY ").append(orderField); - } - sql.append(" ASC LIMIT ? OFFSET ?"); + public ResultSet executeSelectTrigger(Connection connection, String sqlQuery) + throws SQLException { + StringBuilder sql = new StringBuilder(sqlQuery); + PreparedStatement stmt = connection.prepareStatement(sql.toString()); + if (pollingValue != null) { + stmt.setTimestamp(1, pollingValue); + } + return stmt.executeQuery(); + } - PreparedStatement stmt = connection.prepareStatement(sql.toString()); - stmt.setTimestamp(1, pollingValue); - stmt.setInt(2, countNumber); - stmt.setInt(3, skipNumber); - return stmt.executeQuery(); + public ResultSet executePolling(Connection connection) throws SQLException { + validateQuery(); + StringBuilder sql = new StringBuilder("SELECT * FROM "); + sql.append(tableName); + sql.append(" WHERE "); + sql.append(pollingField); + sql.append(" > ?"); + if (orderField != null) { + sql.append(" ORDER BY ").append(orderField); } + sql.append(" ASC LIMIT ? OFFSET ?"); - public ResultSet executeLookup(Connection connection, JsonObject body) throws SQLException { - validateQuery(); - StringBuilder sql = new StringBuilder("SELECT * FROM "); - sql.append(tableName); - sql.append(" WHERE "); - sql.append(lookupField); - sql.append(" = ?"); - sql.append(" ORDER BY ").append(lookupField); - sql.append(" ASC LIMIT ? OFFSET ?"); + PreparedStatement stmt = connection.prepareStatement(sql.toString()); + stmt.setTimestamp(1, pollingValue); + stmt.setInt(2, countNumber); + stmt.setInt(3, skipNumber); + return stmt.executeQuery(); + } - PreparedStatement stmt = connection.prepareStatement(sql.toString()); - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, 1, entry.getKey(), body); - } - stmt.setInt(2, countNumber); - stmt.setInt(3, skipNumber); - return stmt.executeQuery(); - } + public ResultSet executeLookup(Connection connection, JsonObject body) throws SQLException { + validateQuery(); + StringBuilder sql = new StringBuilder("SELECT * FROM "); + sql.append(tableName); + sql.append(" WHERE "); + sql.append(lookupField); + sql.append(" = ?"); + sql.append(" ORDER BY ").append(lookupField); + sql.append(" ASC LIMIT ? OFFSET ?"); - public int executeDelete(Connection connection, JsonObject body) throws SQLException { - String sql = "DELETE" + - " FROM " + tableName + - " WHERE " + lookupField + " = ?"; - PreparedStatement stmt = connection.prepareStatement(sql); - stmt.setString(1, lookupValue); - return stmt.executeUpdate(); + PreparedStatement stmt = connection.prepareStatement(sql.toString()); + for (Map.Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, 1, entry.getKey(), body); } + stmt.setInt(2, countNumber); + stmt.setInt(3, skipNumber); + return stmt.executeQuery(); + } + + public int executeDelete(Connection connection, JsonObject body) throws SQLException { + String sql = "DELETE" + + " FROM " + tableName + + " WHERE " + lookupField + " = ?"; + PreparedStatement stmt = connection.prepareStatement(sql); + stmt.setString(1, lookupValue); + return stmt.executeUpdate(); + } - public boolean executeRecordExists(Connection connection, JsonObject body) throws SQLException { - validateQuery(); - String sql = "SELECT COUNT(*)" + - " FROM " + tableName + - " WHERE " + lookupField + " = ?"; - PreparedStatement stmt = connection.prepareStatement(sql); - Utils.setStatementParam(stmt, 1, lookupField, body); - ResultSet rs = stmt.executeQuery(); - rs.next(); - return rs.getInt(1) > 0; + public boolean executeRecordExists(Connection connection, JsonObject body) throws SQLException { + validateQuery(); + String sql = "SELECT COUNT(*)" + + " FROM " + tableName + + " WHERE " + lookupField + " = ?"; + PreparedStatement stmt = connection.prepareStatement(sql); + Utils.setStatementParam(stmt, 1, lookupField, body); + ResultSet rs = stmt.executeQuery(); + rs.next(); + return rs.getInt(1) > 0; + } + + public void executeInsert(Connection connection, String tableName, JsonObject body) + throws SQLException { + validateQuery(); + StringBuilder keys = new StringBuilder(); + StringBuilder values = new StringBuilder(); + for (Map.Entry entry : body.entrySet()) { + if (keys.length() > 0) { + keys.append(","); + } + keys.append(entry.getKey()); + if (values.length() > 0) { + values.append(","); + } + values.append("?"); + } + String sql = "INSERT INTO " + tableName + + " (" + keys.toString() + ")" + + " VALUES (" + values.toString() + ")"; + PreparedStatement stmt = connection.prepareStatement(sql); + int i = 1; + for (String key : body.keySet()) { + Utils.setStatementParam(stmt, i, key, body); + i++; } + stmt.execute(); + } - public void executeInsert(Connection connection, String tableName, JsonObject body) - throws SQLException { - validateQuery(); - StringBuilder keys = new StringBuilder(); - StringBuilder values = new StringBuilder(); - for (Map.Entry entry : body.entrySet()) { - if (keys.length() > 0) { - keys.append(","); - } - keys.append(entry.getKey()); - if (values.length() > 0) { - values.append(","); - } - values.append("?"); - } - String sql = "INSERT INTO " + tableName + - " (" + keys.toString() + ")" + - " VALUES (" + values.toString() + ")"; - PreparedStatement stmt = connection.prepareStatement(sql); - int i = 1; - for (String key : body.keySet()) { - Utils.setStatementParam(stmt, i, key, body); - i++; - } - stmt.execute(); + public void executeUpdate(Connection connection, String tableName, String idColumn, + String idValue, JsonObject body) throws SQLException { + validateQuery(); + StringBuilder setString = new StringBuilder(); + for (Map.Entry entry : body.entrySet()) { + if (setString.length() > 0) { + setString.append(","); + } + setString.append(entry.getKey()).append(" = ?"); } + String sql = "UPDATE " + tableName + + " SET " + setString.toString() + + " WHERE " + idColumn + " = ?"; + PreparedStatement stmt = connection.prepareStatement(sql); + int i = 1; + for (String key : body.keySet()) { + Utils.setStatementParam(stmt, i, key, body); + i++; + } + Utils.setStatementParam(stmt, i, idColumn, body); + stmt.execute(); + } - public void executeUpdate(Connection connection, String tableName, String idColumn, - String idValue, JsonObject body) throws SQLException { - validateQuery(); - StringBuilder setString = new StringBuilder(); - for (Map.Entry entry : body.entrySet()) { - if (setString.length() > 0) { - setString.append(","); - } - setString.append(entry.getKey()).append(" = ?"); - } - String sql = "UPDATE " + tableName + - " SET " + setString.toString() + - " WHERE " + idColumn + " = ?"; - PreparedStatement stmt = connection.prepareStatement(sql); - int i = 1; - for (String key : body.keySet()) { - Utils.setStatementParam(stmt, i, key, body); - i++; + public void executeUpsert(Connection connection, String idColumn, JsonObject body) + throws SQLException { + validateQuery(); + StringBuilder keys = new StringBuilder(); + StringBuilder values = new StringBuilder(); + StringBuilder setString = new StringBuilder(); + for (Map.Entry entry : body.entrySet()) { + if (!entry.getKey().equals(idColumn)) { + if (setString.length() > 0) { + setString.append(","); } - Utils.setStatementParam(stmt, i, idColumn, body); - stmt.execute(); + setString.append(entry.getKey()).append(" = ?"); + } + if (keys.length() > 0) { + keys.append(","); + } + keys.append(entry.getKey()); + if (values.length() > 0) { + values.append(","); + } + values.append("?"); } - - public void executeUpsert(Connection connection, String idColumn, JsonObject body) - throws SQLException { - validateQuery(); - StringBuilder keys = new StringBuilder(); - StringBuilder values = new StringBuilder(); - StringBuilder setString = new StringBuilder(); + String sql = "INSERT INTO " + tableName + + " (" + keys.toString() + ")" + + " VALUES (" + values.toString() + ")" + + " ON DUPLICATE KEY UPDATE " + setString + ";"; + PreparedStatement stmt = null; + try { + stmt = connection.prepareStatement(sql); + int i = 1; for (Map.Entry entry : body.entrySet()) { - if (!entry.getKey().equals(idColumn)) { - if (setString.length() > 0) { - setString.append(","); - } - setString.append(entry.getKey()).append(" = ?"); - } - if (keys.length() > 0) { - keys.append(","); - } - keys.append(entry.getKey()); - if (values.length() > 0) { - values.append(","); - } - values.append("?"); + Utils.setStatementParam(stmt, i, entry.getKey(), body); + i++; } - String sql = "INSERT INTO " + tableName + - " ("+ keys.toString() + ")" + - " VALUES (" + values.toString() + ")" + - " ON DUPLICATE KEY UPDATE " + idColumn + " = ?;"; - PreparedStatement stmt = null; - try { - stmt = connection.prepareStatement(sql); - int i = 1; - for (Map.Entry entry : body.entrySet()) { + for (Map.Entry entry : body.entrySet()) { + if (!entry.getKey().equals(idColumn)) { Utils.setStatementParam(stmt, i, entry.getKey(), body); i++; } - Utils.setStatementParam(stmt, i, idColumn, body); - stmt.execute(); - } finally { - if (stmt != null) { - stmt.close(); - } + } + stmt.execute(); + } finally { + if (stmt != null) { + stmt.close(); } } + } } diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java index 6f61773..c0e838c 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java @@ -159,7 +159,7 @@ public void executeUpsert(Connection connection, String idColumn, JsonObject bod } String sql = "BEGIN " + " INSERT INTO " + tableName + - " ("+ keys.toString() + ")" + + " (" + keys.toString() + ")" + " VALUES (" + values.toString() + ");" + " EXCEPTION" + " WHEN DUP_VAL_ON_INDEX THEN" + diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java index d428d6f..4814792 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java @@ -95,7 +95,7 @@ public boolean executeRecordExists(Connection connection, JsonObject body) throw " FROM " + tableName + " WHERE " + lookupField + " = ?"; PreparedStatement stmt = connection.prepareStatement(sql); - Utils.setStatementParam(stmt, 1, lookupField, body); + Utils.setStatementParam(stmt, 1, lookupField, body); ResultSet rs = stmt.executeQuery(); rs.next(); return rs.getInt(1) > 0; @@ -174,11 +174,11 @@ public void executeUpsert(Connection connection, String idColumn, JsonObject bod values.append("?"); } String sql = "INSERT INTO " + tableName + - " ("+ keys.toString() + ")" + - " VALUES (" + values.toString() + ");" + + " (" + keys.toString() + ")" + + " VALUES (" + values.toString() + ")" + " ON CONFLICT (" + idColumn + ")" + " DO UPDATE " + - " SET " + setString.toString(); + " SET " + setString.toString() + ";"; PreparedStatement stmt = null; try { stmt = connection.prepareStatement(sql); From 7711d4a28b1c54d08aca4dda8caeb21158feb8f9 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Tue, 28 Aug 2018 17:56:00 +0300 Subject: [PATCH 42/56] Use one transaction for Upsert action Add limitation in Readme --- README.md | 13 ++++++++----- .../java/io/elastic/jdbc/QueryBuilders/MSSQL.java | 4 ---- .../java/io/elastic/jdbc/QueryBuilders/MySQL.java | 4 ---- .../java/io/elastic/jdbc/QueryBuilders/Oracle.java | 4 ---- .../io/elastic/jdbc/QueryBuilders/PostgreSQL.java | 4 ---- 5 files changed, 8 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index ef3435e..8c92fca 100644 --- a/README.md +++ b/README.md @@ -142,12 +142,15 @@ Checkbox ``Don't throw Error on an Empty Result`` allows to emit an empty respon As an input metadata you will get a Primary Key field to provide the data inside as a clause value. ## Current limitations -1. Composite primary key is not supported. +1. Only tables with one [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY") is supported. Message ``Table has not Primary Key. Should be one Primary Key +`` should be displayed if the table without any primary key will be selected and message ``Composite Primary Key is not supported +`` should be displayed if the table with composite primary key will be selected. 2. Only following versions of DataBase are supported: -- MySQL - compatible with MySQL Server 5.5, 5.6, 5.7 and 8.0. -- PostgreSQL - compatible with PostgreSQL 8.2 and higher -- Oracle - compatible with Oracle Database 8.1.7 - 12.1.0.2 -- MSSQL - compatible with Microsoft SQL Server 2008 R2 and higher +- ``MySQL`` - compatible with MySQL Server 5.5, 5.6, 5.7 and 8.0. +- ``PostgreSQL`` - compatible with PostgreSQL 8.2 and higher +- ``Oracle`` - compatible with Oracle Database 8.1.7 - 12.1.0.2 +- ``MSSQL`` - compatible with Microsoft SQL Server 2008 R2 and higher +3. For Action "Upsert by primary key" metadata analysis ignores nullable/non-nullable fields, it will be throw SQL Server exception ``Cannot insert the value NULL into...`` if non-nullable fields don't fill for Insert operation. ## Known issues No known issues are there yet. diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java index 8999efe..ccfed95 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java @@ -145,12 +145,10 @@ public void executeUpsert(Connection connection, String idColumn, JsonObject bod StringBuilder values = new StringBuilder(); StringBuilder setString = new StringBuilder(); for (Map.Entry entry : body.entrySet()) { - if (!entry.getKey().equals(idColumn)) { if (setString.length() > 0) { setString.append(","); } setString.append(entry.getKey()).append(" = ?"); - } if (keys.length() > 0) { keys.append(","); } @@ -176,10 +174,8 @@ public void executeUpsert(Connection connection, String idColumn, JsonObject bod Utils.setStatementParam(stmt, 1, idColumn, body); int i = 2; for (Map.Entry entry : body.entrySet()) { - if (!entry.getKey().equals(idColumn)) { Utils.setStatementParam(stmt, i, entry.getKey(), body); i++; - } } Utils.setStatementParam(stmt, i, idColumn, body); i++; diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java index d5474c7..9502507 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java @@ -150,12 +150,10 @@ public void executeUpsert(Connection connection, String idColumn, JsonObject bod StringBuilder values = new StringBuilder(); StringBuilder setString = new StringBuilder(); for (Map.Entry entry : body.entrySet()) { - if (!entry.getKey().equals(idColumn)) { if (setString.length() > 0) { setString.append(","); } setString.append(entry.getKey()).append(" = ?"); - } if (keys.length() > 0) { keys.append(","); } @@ -178,10 +176,8 @@ public void executeUpsert(Connection connection, String idColumn, JsonObject bod i++; } for (Map.Entry entry : body.entrySet()) { - if (!entry.getKey().equals(idColumn)) { Utils.setStatementParam(stmt, i, entry.getKey(), body); i++; - } } stmt.execute(); } finally { diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java index c0e838c..0df2fae 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java @@ -142,12 +142,10 @@ public void executeUpsert(Connection connection, String idColumn, JsonObject bod StringBuilder values = new StringBuilder(); StringBuilder setString = new StringBuilder(); for (Map.Entry entry : body.entrySet()) { - if (!entry.getKey().equals(idColumn)) { if (setString.length() > 0) { setString.append(","); } setString.append(entry.getKey()).append(" = ?"); - } if (keys.length() > 0) { keys.append(","); } @@ -176,10 +174,8 @@ public void executeUpsert(Connection connection, String idColumn, JsonObject bod i++; } for (Map.Entry entry : body.entrySet()) { - if (!entry.getKey().equals(idColumn)) { Utils.setStatementParam(stmt, i, entry.getKey(), body); i++; - } } Utils.setStatementParam(stmt, i, idColumn, body); stmt.execute(); diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java index 4814792..c0eec5a 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java @@ -158,12 +158,10 @@ public void executeUpsert(Connection connection, String idColumn, JsonObject bod StringBuilder values = new StringBuilder(); StringBuilder setString = new StringBuilder(); for (Map.Entry entry : body.entrySet()) { - if (!entry.getKey().equals(idColumn)) { if (setString.length() > 0) { setString.append(","); } setString.append(entry.getKey()).append(" = ?"); - } if (keys.length() > 0) { keys.append(","); } @@ -188,10 +186,8 @@ public void executeUpsert(Connection connection, String idColumn, JsonObject bod i++; } for (Map.Entry entry : body.entrySet()) { - if (!entry.getKey().equals(idColumn)) { Utils.setStatementParam(stmt, i, entry.getKey(), body); i++; - } } stmt.execute(); } finally { From d3457eade37dbf8e4c6cd8460e1771499fd3c156 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Mon, 3 Sep 2018 14:16:32 +0300 Subject: [PATCH 43/56] Update Readme for Upsert action --- README.md | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 55 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 8c92fca..586afd2 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Following actions are inside: ``LOOKUP BY PRIMARY KEY`` - this action will execute select query from specified table, as criteria can be used only [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY"). The action returns only one result (a primary key is unique). -``UPSERT BY PRIMARY KEY`` - this action will execute select query from specified table, as criteria can be used only [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY"), if result is nullable, then action will execute insert query by [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY"), else - action will execute update query by [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY"). The action returns only one result row (a primary key is unique). +``UPSERT BY PRIMARY KEY`` - this action will execute select command from specified table, as search criteria can be used only [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY"), and execute insert command by PRIMARY KEY with specified field, if result does not found, else - action will execute update command by PRIMARY KEY with specified field. The action returns only one result row (a primary key is unique). ``DELETE BY PRIMARY KEY`` - this action will execute delete query from specified table, as criteria can be used only [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY"). The action returns an integer value that indicates the number of rows affected, the returned value can be 0 or 1 (a primary key is unique). ### How works @@ -22,15 +22,39 @@ Following actions are inside: ### Requirements Before you can deploy any code into elastic.io **you must be a registered elastic.io platform user**. Please see our home page at [http://www.elastic.io](http://www.elastic.io) to learn how. #### Environment variables -For unit-testing +For unit-testing is needed specify following environment variables: +1. Connection to MSSQL: + - ``CONN_USER_MSSQL`` - user login + - ``CONN_PASSWORD_MSSQL`` - user password + - ``CONN_DBNAME_MSSQL`` - DataBase name + - ``CONN_HOST_MSSQL`` - DataBase host + - ``CONN_PORT_MSSQL`` - DataBase port +2. Connection to MySQL: + - ``CONN_USER_MYSQL`` - user login + - ``CONN_PASSWORD_MYSQL`` - user password + - ``CONN_DBNAME_MYSQL`` - DataBase name + - ``CONN_HOST_MYSQL`` - DataBase host + - ``CONN_PORT_MYSQL`` - DataBase port +3. Connection to Oracle: + - ``CONN_USER_ORACLE`` - user login + - ``CONN_PASSWORD_ORACLE`` - user password + - ``CONN_DBNAME_ORACLE`` - DataBase name + - ``CONN_HOST_ORACLE`` - DataBase host + - ``CONN_PORT_ORACLE`` - DataBase port +4. Connection to PostgreSQL: + - ``CONN_USER_POSTGRESQL`` - user login + - ``CONN_PASSWORD_POSTGRESQL`` - user password + - ``CONN_DBNAME_POSTGRESQL`` - DataBase name + - ``CONN_HOST_POSTGRESQL`` - DataBase host + - ``CONN_PORT_POSTGRESQL`` - DataBase port #### Others ## Credentials You may use following properties to configure a connection: ![image](https://user-images.githubusercontent.com/40201204/43577550-ce99efe6-9654-11e8-87ed-f3e0839d618a.png) You can add the authorisation methods during the integration flow design or by going to your Settings > Security credentials > REST client and adding there. ### DB Engine +You are able to choose one of existing database types: ![image](https://user-images.githubusercontent.com/40201204/43577772-6f85bdea-9655-11e8-96e1-368493a36c9d.png) -You are able to choose one of existing database types ### Connection URI In the Connection URI field please provide hostname of the server, e.g. ``acme.com`` @@ -127,8 +151,34 @@ Checkbox ``Don't throw Error on an Empty Result`` allows to emit an empty respon As an input metadata you will get a Primary Key field to provide the data inside as a clause value. ### UPSERT BY PRIMARY KEY -![image](https://user-images.githubusercontent.com/16806832/44396836-d3880280-a546-11e8-8fbd-efc1fd089d93.png) -The action will execute select query from a ``Tables`` dropdown field, as criteria can be used only [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY"), if result is nullable, then action will execute insert query by PRIMARY KEY with specified field, else - action will execute update query by PRIMARY KEY with specified field. The action returns only one result row (a primary key is unique). +The action will execute ``SELECT`` command from a ``Tables`` dropdown field, as search criteria can be used only [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY"), and execute ``INSERT`` command by PRIMARY KEY with specified field, if result does not found, else - action will execute ``UPDATE`` command by PRIMARY KEY with specified field. The action returns only one result row (a primary key is unique). +1. Find and select jdbc-component in the component repository +![image](https://user-images.githubusercontent.com/16806832/44981615-c70a9d80-af7b-11e8-8055-3b553abe8212.png) + +2. Create new or select existing credentials +![image](https://user-images.githubusercontent.com/16806832/44981652-e86b8980-af7b-11e8-897e-04d1fc9a93cf.png) + +3. Select action "Upsert Row By Primary Key" from list +![image](https://user-images.githubusercontent.com/16806832/44981700-0d5ffc80-af7c-11e8-9ac3-aedb16e1d788.png) + +4. Select table from ``Table`` dropdown list +![image](https://user-images.githubusercontent.com/16806832/44981754-38e2e700-af7c-11e8-87d3-f029a7fec8fa.png) + +5. Specify input data (field with red asterisk is Primary key), and click "Continue" +![image](https://user-images.githubusercontent.com/16806832/44981854-83fcfa00-af7c-11e8-9ef2-8c06e77fed1e.png) + +6. Retrieving sample +![image](https://user-images.githubusercontent.com/16806832/44983059-86f9e980-af80-11e8-8178-77e463488c7a.png) + +7. Retrieve sample result +![image](https://user-images.githubusercontent.com/16806832/44982952-2ec2e780-af80-11e8-98b1-58c3adbc15b9.png) + +8. Click "Continue" +![image](https://user-images.githubusercontent.com/16806832/44983101-b0b31080-af80-11e8-82d8-0e70e4b4ff97.png) + +9. Finish component configuration +![image](https://user-images.githubusercontent.com/16806832/44983365-90378600-af81-11e8-9be4-4dbb39af0fdc.png) + #### Input fields description As an input metadata you will get all fields of selected table. [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY") is required field (will mark as asterisk) and other input fields are optional. ![image](https://user-images.githubusercontent.com/16806832/44397461-1a76f780-a549-11e8-8247-9a6f9aa3f3b4.png) From 115f82a15828d7d083ca862d3f2cc8c8b274b46b Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Mon, 3 Sep 2018 14:32:36 +0300 Subject: [PATCH 44/56] Fixed double entry of forEach of Upsert method --- .../io/elastic/jdbc/QueryBuilders/Oracle.java | 25 +++++++------------ .../jdbc/QueryBuilders/PostgreSQL.java | 23 ++++++----------- 2 files changed, 17 insertions(+), 31 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java index 0df2fae..6126bcd 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java @@ -142,10 +142,10 @@ public void executeUpsert(Connection connection, String idColumn, JsonObject bod StringBuilder values = new StringBuilder(); StringBuilder setString = new StringBuilder(); for (Map.Entry entry : body.entrySet()) { - if (setString.length() > 0) { - setString.append(","); - } - setString.append(entry.getKey()).append(" = ?"); + if (setString.length() > 0) { + setString.append(","); + } + setString.append(entry.getKey()).append(" = ?"); if (keys.length() > 0) { keys.append(","); } @@ -165,24 +165,17 @@ public void executeUpsert(Connection connection, String idColumn, JsonObject bod " SET " + setString.toString() + " WHERE " + idColumn + " = ?;" + " END;"; - PreparedStatement stmt = null; - try { - stmt = connection.prepareStatement(sql); + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + //set Statement parameters for Insert (i) and Update operation (i + countBodyEntry) int i = 1; + int countBodyEntry = body.size(); for (Map.Entry entry : body.entrySet()) { Utils.setStatementParam(stmt, i, entry.getKey(), body); + Utils.setStatementParam(stmt, i + countBodyEntry, entry.getKey(), body); i++; } - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - i++; - } - Utils.setStatementParam(stmt, i, idColumn, body); + Utils.setStatementParam(stmt, i + countBodyEntry, idColumn, body); stmt.execute(); - } finally { - if (stmt != null) { - stmt.close(); - } } } } diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java index c0eec5a..41f1a26 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java @@ -158,10 +158,10 @@ public void executeUpsert(Connection connection, String idColumn, JsonObject bod StringBuilder values = new StringBuilder(); StringBuilder setString = new StringBuilder(); for (Map.Entry entry : body.entrySet()) { - if (setString.length() > 0) { - setString.append(","); - } - setString.append(entry.getKey()).append(" = ?"); + if (setString.length() > 0) { + setString.append(","); + } + setString.append(entry.getKey()).append(" = ?"); if (keys.length() > 0) { keys.append(","); } @@ -177,23 +177,16 @@ public void executeUpsert(Connection connection, String idColumn, JsonObject bod " ON CONFLICT (" + idColumn + ")" + " DO UPDATE " + " SET " + setString.toString() + ";"; - PreparedStatement stmt = null; - try { - stmt = connection.prepareStatement(sql); + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + //set Statement parameters for Insert (i) and Update operation (i + countBodyEntry) int i = 1; + int countBodyEntry = body.size(); for (Map.Entry entry : body.entrySet()) { Utils.setStatementParam(stmt, i, entry.getKey(), body); + Utils.setStatementParam(stmt, i + countBodyEntry, entry.getKey(), body); i++; } - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - i++; - } stmt.execute(); - } finally { - if (stmt != null) { - stmt.close(); - } } } } From b2f58f572724edc98130ca3c1b7f69ef0dfb6490 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Mon, 3 Sep 2018 14:41:27 +0300 Subject: [PATCH 45/56] Reformated code and renamed logger to LOGGER --- .../io/elastic/jdbc/ColumnNamesProvider.java | 6 +-- .../ColumnNamesWithPrimaryKeyProvider.java | 19 +++---- .../elastic/jdbc/JdbcCredentialsVerifier.java | 10 ++-- .../jdbc/PrimaryColumnNamesProvider.java | 10 ++-- .../io/elastic/jdbc/QueryBuilders/MSSQL.java | 12 ++--- .../io/elastic/jdbc/QueryBuilders/MySQL.java | 12 ++--- .../io/elastic/jdbc/QueryBuilders/Query.java | 29 ++++++----- .../jdbc/QueryColumnNamesProvider.java | 6 +-- .../io/elastic/jdbc/TableNameProvider.java | 12 ++--- src/main/java/io/elastic/jdbc/Utils.java | 27 +++++----- .../jdbc/actions/DeleteRowByPrimaryKey.java | 35 ++++++------- .../jdbc/actions/LookupRowByPrimaryKey.java | 34 ++++++------ .../io/elastic/jdbc/actions/SelectAction.java | 22 ++++---- .../jdbc/actions/UpsertRowByPrimaryKey.java | 25 ++++----- .../jdbc/triggers/GetRowsPollingTrigger.java | 41 ++++++++------- .../elastic/jdbc/triggers/SelectTrigger.java | 52 +++++++++++-------- 16 files changed, 181 insertions(+), 171 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/ColumnNamesProvider.java b/src/main/java/io/elastic/jdbc/ColumnNamesProvider.java index be4bae9..4b5252a 100755 --- a/src/main/java/io/elastic/jdbc/ColumnNamesProvider.java +++ b/src/main/java/io/elastic/jdbc/ColumnNamesProvider.java @@ -17,7 +17,7 @@ public class ColumnNamesProvider implements DynamicMetadataProvider, SelectModelProvider { - private static final Logger logger = LoggerFactory.getLogger(ColumnNamesProvider.class); + private static final Logger LOGGER = LoggerFactory.getLogger(ColumnNamesProvider.class); @Override public JsonObject getSelectModel(JsonObject configuration) { @@ -97,14 +97,14 @@ public JsonObject getColumns(JsonObject configuration) { try { rs.close(); } catch (SQLException e) { - logger.error("Failed to close result set {}", e); + LOGGER.error("Failed to close result set {}", e); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { - logger.error("Failed to close connection {}", e); + LOGGER.error("Failed to close connection {}", e); } } } diff --git a/src/main/java/io/elastic/jdbc/ColumnNamesWithPrimaryKeyProvider.java b/src/main/java/io/elastic/jdbc/ColumnNamesWithPrimaryKeyProvider.java index b55b3dc..2fc0045 100644 --- a/src/main/java/io/elastic/jdbc/ColumnNamesWithPrimaryKeyProvider.java +++ b/src/main/java/io/elastic/jdbc/ColumnNamesWithPrimaryKeyProvider.java @@ -15,9 +15,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class ColumnNamesWithPrimaryKeyProvider implements DynamicMetadataProvider, SelectModelProvider { +public class ColumnNamesWithPrimaryKeyProvider implements DynamicMetadataProvider, + SelectModelProvider { - private static final Logger logger = LoggerFactory.getLogger(ColumnNamesWithPrimaryKeyProvider.class); + private static final Logger LOGGER = LoggerFactory + .getLogger(ColumnNamesWithPrimaryKeyProvider.class); @Override public JsonObject getSelectModel(JsonObject configuration) { @@ -73,9 +75,8 @@ public JsonObject getColumns(JsonObject configuration) { JsonObjectBuilder field = Json.createObjectBuilder(); String name = rs.getString("COLUMN_NAME"); Boolean isRequired = false; - while (rsPrimaryKeys.next()){ - if (rsPrimaryKeys.getString("COLUMN_NAME").equals(name)) - { + while (rsPrimaryKeys.next()) { + if (rsPrimaryKeys.getString("COLUMN_NAME").equals(name)) { isRequired = true; break; } @@ -97,21 +98,21 @@ public JsonObject getColumns(JsonObject configuration) { try { rs.close(); } catch (SQLException e) { - logger.error("Failed to close result set {}", e); + LOGGER.error("Failed to close result set {}", e); } } - if (rsPrimaryKeys!= null) { + if (rsPrimaryKeys != null) { try { rsPrimaryKeys.close(); } catch (SQLException e) { - logger.error("Failed to close result set {}", e); + LOGGER.error("Failed to close result set {}", e); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { - logger.error("Failed to close connection {}", e); + LOGGER.error("Failed to close connection {}", e); } } } diff --git a/src/main/java/io/elastic/jdbc/JdbcCredentialsVerifier.java b/src/main/java/io/elastic/jdbc/JdbcCredentialsVerifier.java index 162e041..e446246 100644 --- a/src/main/java/io/elastic/jdbc/JdbcCredentialsVerifier.java +++ b/src/main/java/io/elastic/jdbc/JdbcCredentialsVerifier.java @@ -10,27 +10,27 @@ public class JdbcCredentialsVerifier implements CredentialsVerifier { - private static final Logger logger = LoggerFactory.getLogger(JdbcCredentialsVerifier.class); + private static final Logger LOGGER = LoggerFactory.getLogger(JdbcCredentialsVerifier.class); @Override public void verify(JsonObject configuration) throws InvalidCredentialsException { - logger.info("About to connect to database using given credentials"); + LOGGER.info("About to connect to database using given credentials"); Connection connection = null; try { connection = Utils.getConnection(configuration); - logger.info("Successfully connected to database. Credentials verified."); + LOGGER.info("Successfully connected to database. Credentials verified."); } catch (Exception e) { throw new InvalidCredentialsException("Failed to connect to database", e); } finally { if (connection != null) { - logger.info("Closing database connection"); + LOGGER.info("Closing database connection"); try { connection.close(); } catch (SQLException e) { - logger.error("Failed to closed database connection", e); + LOGGER.error("Failed to closed database connection", e); } } } diff --git a/src/main/java/io/elastic/jdbc/PrimaryColumnNamesProvider.java b/src/main/java/io/elastic/jdbc/PrimaryColumnNamesProvider.java index 6c65709..01e86c0 100644 --- a/src/main/java/io/elastic/jdbc/PrimaryColumnNamesProvider.java +++ b/src/main/java/io/elastic/jdbc/PrimaryColumnNamesProvider.java @@ -19,7 +19,7 @@ public class PrimaryColumnNamesProvider implements DynamicMetadataProvider, SelectModelProvider { - private static final Logger logger = LoggerFactory.getLogger(PrimaryColumnNamesProvider.class); + private static final Logger LOGGER = LoggerFactory.getLogger(PrimaryColumnNamesProvider.class); public JsonObject getSelectModel(JsonObject configuration) { JsonObject result = Json.createObjectBuilder().build(); @@ -74,7 +74,7 @@ public JsonObject getPrimaryColumns(JsonObject configuration) { tableName); while (rs.next()) { primaryKeys.add(rs.getString("COLUMN_NAME")); - logger.info("Primary Key: {}", rs.getString("COLUMN_NAME")); + LOGGER.info("Primary Key: {}", rs.getString("COLUMN_NAME")); } rs = dbMetaData .getColumns(null, ((isOracle && !schemaName.isEmpty()) ? schemaName : null), tableName, @@ -100,7 +100,7 @@ public JsonObject getPrimaryColumns(JsonObject configuration) { } } if (isEmpty) { - logger.info("Empty PK list - no primary keys"); + LOGGER.info("Empty PK list - no primary keys"); throw new IllegalStateException("No Primary Keys"); } @@ -111,14 +111,14 @@ public JsonObject getPrimaryColumns(JsonObject configuration) { try { rs.close(); } catch (SQLException e) { - logger.error("Failed to close result set", e); + LOGGER.error("Failed to close result set", e); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { - logger.error("Failed to close connection", e); + LOGGER.error("Failed to close connection", e); } } } diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java index ccfed95..ecd44f4 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java @@ -145,10 +145,10 @@ public void executeUpsert(Connection connection, String idColumn, JsonObject bod StringBuilder values = new StringBuilder(); StringBuilder setString = new StringBuilder(); for (Map.Entry entry : body.entrySet()) { - if (setString.length() > 0) { - setString.append(","); - } - setString.append(entry.getKey()).append(" = ?"); + if (setString.length() > 0) { + setString.append(","); + } + setString.append(entry.getKey()).append(" = ?"); if (keys.length() > 0) { keys.append(","); } @@ -174,8 +174,8 @@ public void executeUpsert(Connection connection, String idColumn, JsonObject bod Utils.setStatementParam(stmt, 1, idColumn, body); int i = 2; for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - i++; + Utils.setStatementParam(stmt, i, entry.getKey(), body); + i++; } Utils.setStatementParam(stmt, i, idColumn, body); i++; diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java index 9502507..0eef058 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java @@ -150,10 +150,10 @@ public void executeUpsert(Connection connection, String idColumn, JsonObject bod StringBuilder values = new StringBuilder(); StringBuilder setString = new StringBuilder(); for (Map.Entry entry : body.entrySet()) { - if (setString.length() > 0) { - setString.append(","); - } - setString.append(entry.getKey()).append(" = ?"); + if (setString.length() > 0) { + setString.append(","); + } + setString.append(entry.getKey()).append(" = ?"); if (keys.length() > 0) { keys.append(","); } @@ -176,8 +176,8 @@ public void executeUpsert(Connection connection, String idColumn, JsonObject bod i++; } for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - i++; + Utils.setStatementParam(stmt, i, entry.getKey(), body); + i++; } stmt.execute(); } finally { diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java b/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java index 01b3abb..c58daaf 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java @@ -18,6 +18,19 @@ public abstract class Query { protected String lookupField = null; protected String lookupValue = null; + public static String preProcessSelect(String sqlQuery) { + sqlQuery = sqlQuery.trim(); + if (!isSelect(sqlQuery)) { + throw new RuntimeException("Unresolvable SELECT query"); + } + return sqlQuery.replaceAll(Utils.VARS_REGEXP, "?"); + } + + public static boolean isSelect(String sqlQuery) { + String pattern = "select"; + return sqlQuery.toLowerCase().startsWith(pattern); + } + public Query skip(Integer skip) { this.skipNumber = skip; return this; @@ -55,7 +68,8 @@ public Query selectPolling(String sqlQuery, Timestamp fieldValue) { abstract public ResultSet executeLookup(Connection connection, JsonObject body) throws SQLException; - abstract public boolean executeRecordExists(Connection connection, JsonObject body) throws SQLException; + abstract public boolean executeRecordExists(Connection connection, JsonObject body) + throws SQLException; abstract public int executeDelete(Connection connection, JsonObject body) throws SQLException; @@ -80,17 +94,4 @@ public void validateQuery() { } } - public static String preProcessSelect(String sqlQuery) { - sqlQuery = sqlQuery.trim(); - if (!isSelect(sqlQuery)) { - throw new RuntimeException("Unresolvable SELECT query"); - } - return sqlQuery.replaceAll(Utils.VARS_REGEXP, "?"); - } - - public static boolean isSelect(String sqlQuery) { - String pattern = "select"; - return sqlQuery.toLowerCase().startsWith(pattern); - } - } diff --git a/src/main/java/io/elastic/jdbc/QueryColumnNamesProvider.java b/src/main/java/io/elastic/jdbc/QueryColumnNamesProvider.java index 45c586f..503feb1 100644 --- a/src/main/java/io/elastic/jdbc/QueryColumnNamesProvider.java +++ b/src/main/java/io/elastic/jdbc/QueryColumnNamesProvider.java @@ -14,7 +14,7 @@ public class QueryColumnNamesProvider implements DynamicMetadataProvider, SelectModelProvider { - private static final Logger logger = LoggerFactory.getLogger(QueryColumnNamesProvider.class); + private static final Logger LOGGER = LoggerFactory.getLogger(QueryColumnNamesProvider.class); public JsonObject getSelectModel(JsonObject configuration) { JsonObject result = Json.createObjectBuilder().build(); @@ -49,13 +49,13 @@ public JsonObject getColumns(JsonObject configuration) { Boolean isEmpty = true; if (matcher.find()) { do { - logger.info("Var = {}", matcher.group()); + LOGGER.info("Var = {}", matcher.group()); JsonObjectBuilder field = Json.createObjectBuilder(); String result[] = matcher.group().split(":"); String name = result[0].substring(1); String type = result[1]; field.add("title", name) - .add("type", type); + .add("type", type); properties.add(name, field); isEmpty = false; } while (matcher.find()); diff --git a/src/main/java/io/elastic/jdbc/TableNameProvider.java b/src/main/java/io/elastic/jdbc/TableNameProvider.java index b8ed7cf..d1c6a8f 100755 --- a/src/main/java/io/elastic/jdbc/TableNameProvider.java +++ b/src/main/java/io/elastic/jdbc/TableNameProvider.java @@ -15,11 +15,11 @@ public class TableNameProvider implements SelectModelProvider { - private static final Logger logger = LoggerFactory.getLogger(TableNameProvider.class); + private static final Logger LOGGER = LoggerFactory.getLogger(TableNameProvider.class); @Override public JsonObject getSelectModel(JsonObject configuration) { - logger.info("About to retrieve table name"); + LOGGER.info("About to retrieve table name"); JsonObjectBuilder result = Json.createObjectBuilder(); Connection connection = null; @@ -27,7 +27,7 @@ public JsonObject getSelectModel(JsonObject configuration) { try { connection = Utils.getConnection(configuration); - logger.info("Successfully connected to DB"); + LOGGER.info("Successfully connected to DB"); // get metadata DatabaseMetaData md = connection.getMetaData(); @@ -58,21 +58,21 @@ && isOracleServiceSchema(schemaName)) { result.add("empty dataset", "no tables"); } } catch (SQLException e) { - logger.error("Unexpected error {}", e); + LOGGER.error("Unexpected error {}", e); throw new RuntimeException(e); } finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { - logger.error(e.toString()); + LOGGER.error(e.toString()); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { - logger.error(e.toString()); + LOGGER.error(e.toString()); } } } diff --git a/src/main/java/io/elastic/jdbc/Utils.java b/src/main/java/io/elastic/jdbc/Utils.java index 4dbb2d4..740715e 100644 --- a/src/main/java/io/elastic/jdbc/Utils.java +++ b/src/main/java/io/elastic/jdbc/Utils.java @@ -1,6 +1,5 @@ package io.elastic.jdbc; -import java.math.BigDecimal; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.Date; @@ -18,7 +17,6 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.json.Json; import javax.json.JsonObject; import javax.json.JsonObjectBuilder; import javax.json.JsonValue; @@ -27,16 +25,15 @@ public class Utils { - private static final Logger logger = LoggerFactory.getLogger(Utils.class); - public static final String CFG_DATABASE_NAME = "databaseName"; public static final String CFG_PASSWORD = "password"; public static final String CFG_PORT = "port"; public static final String CFG_DB_ENGINE = "dbEngine"; public static final String CFG_HOST = "host"; public static final String CFG_USER = "user"; - public static Map columnTypes = null; public static final String VARS_REGEXP = "@([\\w_$][\\d\\w_$]*(:(string|boolean|date|number|bigint|float|real))?)"; + private static final Logger LOGGER = LoggerFactory.getLogger(Utils.class); + public static Map columnTypes = null; public static Connection getConnection(final JsonObject config) { final String engine = getRequiredNonEmptyString(config, CFG_DB_ENGINE, "Engine is required") @@ -50,7 +47,7 @@ public static Connection getConnection(final JsonObject config) { "Database name is required"); engineType.loadDriverClass(); final String connectionString = engineType.getConnectionString(host, port, databaseName); - logger.info("Connecting to {}", connectionString); + LOGGER.info("Connecting to {}", connectionString); try { return DriverManager.getConnection(connectionString, user, password); } catch (Exception e) { @@ -86,7 +83,7 @@ public static String getNonNullString(final JsonObject config, final String key) } } } catch (NullPointerException | ClassCastException e) { - logger.info("key {} doesn't have any mapping: {}", key, e); + LOGGER.info("key {} doesn't have any mapping: {}", key, e); } return value.toString().replaceAll("\"", ""); } @@ -100,7 +97,7 @@ private static Integer getPort(final JsonObject config, final Engines engineType } public static void setStatementParam(PreparedStatement statement, int paramNumber, String colName, - JsonObject body) throws SQLException { + JsonObject body) throws SQLException { try { if (isNumeric(colName)) { if (body.get(colName) != null) { @@ -135,8 +132,8 @@ public static void setStatementParam(PreparedStatement statement, int paramNumbe } } catch (java.lang.NumberFormatException e) { String message = String - .format("Provided data: %s can't be cast to the column %s datatype",body.get(colName), - colName); + .format("Provided data: %s can't be cast to the column %s datatype", body.get(colName), + colName); throw new RuntimeException(message); } } @@ -156,9 +153,11 @@ private static String detectColumnType(Integer sqlType, String sqlTypeName) { if (sqlType == Types.BIT || sqlType == Types.BOOLEAN) { return "boolean"; } - if (sqlType == Types.OTHER) - if (sqlTypeName.toLowerCase().contains("timestamp")) + if (sqlType == Types.OTHER) { + if (sqlTypeName.toLowerCase().contains("timestamp")) { return "timestamp"; + } + } return "string"; } @@ -211,7 +210,7 @@ public static Map getColumnTypes(Connection connection, Boolean try { rs.close(); } catch (Exception e) { - logger.error(e.toString()); + LOGGER.error(e.toString()); } } } @@ -295,7 +294,7 @@ public static JsonObjectBuilder getColumnDataByType(ResultSet rs, ResultSetMetaD break; } } catch (SQLException | java.lang.NullPointerException e) { - logger.error("Failed to get data by type", e.toString()); + LOGGER.error("Failed to get data by type", e.toString()); throw new RuntimeException(e); } return row; diff --git a/src/main/java/io/elastic/jdbc/actions/DeleteRowByPrimaryKey.java b/src/main/java/io/elastic/jdbc/actions/DeleteRowByPrimaryKey.java index 8fa7a38..db9853d 100644 --- a/src/main/java/io/elastic/jdbc/actions/DeleteRowByPrimaryKey.java +++ b/src/main/java/io/elastic/jdbc/actions/DeleteRowByPrimaryKey.java @@ -21,16 +21,15 @@ public class DeleteRowByPrimaryKey implements Module { - private static final Logger logger = LoggerFactory.getLogger(LookupRowByPrimaryKey.class); + private static final Logger LOGGER = LoggerFactory.getLogger(LookupRowByPrimaryKey.class); private static final String PROPERTY_DB_ENGINE = "dbEngine"; private static final String PROPERTY_TABLE_NAME = "tableName"; private static final String PROPERTY_ID_COLUMN = "idColumn"; private static final String PROPERTY_LOOKUP_VALUE = "lookupValue"; private static final String PROPERTY_NULLABLE_RESULT = "nullableResult"; - + public boolean isOracle = false; private Connection connection = null; private Map columnTypes = null; - public boolean isOracle = false; @Override public void execute(ExecutionParameters parameters) { @@ -74,34 +73,34 @@ public void execute(ExecutionParameters parameters) { boolean isOracle = dbEngine.equals(Engines.ORACLE.name().toLowerCase()); for (Map.Entry entry : body.entrySet()) { - logger.info("{} = {}", entry.getKey(), entry.getValue()); + LOGGER.info("{} = {}", entry.getKey(), entry.getValue()); primaryKey.append(entry.getKey()); primaryValue.append(entry.getValue()); primaryKeysCount++; } if (primaryKeysCount == 1) { - logger.info("Executing delete row by primary key action"); + LOGGER.info("Executing delete row by primary key action"); Connection connection = Utils.getConnection(configuration); Utils.columnTypes = Utils.getColumnTypes(connection, isOracle, tableName); - logger.info("Detected column types: " + Utils.columnTypes); + LOGGER.info("Detected column types: " + Utils.columnTypes); try { QueryFactory queryFactory = new QueryFactory(); Query query = queryFactory.getQuery(dbEngine); - logger.info("Lookup parameters: {} = {}", primaryKey.toString(), primaryValue.toString()); + LOGGER.info("Lookup parameters: {} = {}", primaryKey.toString(), primaryValue.toString()); query.from(tableName).lookup(primaryKey.toString(), primaryValue.toString()); checkConfig(configuration); rs = query.executeLookup(connection, body); while (rs.next()) { rowsCount++; if (rowsCount > 1) { - logger.error("Error: the number of matching rows is not exactly one"); + LOGGER.error("Error: the number of matching rows is not exactly one"); throw new RuntimeException("Error: the number of matching rows is not exactly one"); } } for (Map.Entry entry : configuration.entrySet()) { - logger.info("Key = " + entry.getKey() + " Value = " + entry.getValue()); + LOGGER.info("Key = " + entry.getKey() + " Value = " + entry.getValue()); } if (rowsCount == 1) { @@ -109,18 +108,18 @@ public void execute(ExecutionParameters parameters) { if (result == 1) { row.add("result", result); - logger.info("Emitting data"); + LOGGER.info("Emitting data"); parameters.getEventEmitter().emitData(new Message.Builder().body(row.build()).build()); } else { - logger.info("Unexpected result"); + LOGGER.info("Unexpected result"); throw new RuntimeException("Unexpected result"); } } else if (rowsCount == 0 && nullableResult) { row.add("empty dataset", "nothing to delete"); - logger.info("Emitting data"); + LOGGER.info("Emitting data"); parameters.getEventEmitter().emitData(new Message.Builder().body(row.build()).build()); } else if (rowsCount == 0 && !nullableResult) { - logger.info("Empty response. Error message will be returned"); + LOGGER.info("Empty response. Error message will be returned"); throw new RuntimeException("Empty response"); } @@ -128,29 +127,29 @@ public void execute(ExecutionParameters parameters) { .add(PROPERTY_ID_COLUMN, primaryKey.toString()) .add(PROPERTY_LOOKUP_VALUE, primaryValue.toString()) .add(PROPERTY_NULLABLE_RESULT, nullableResult).build(); - logger.info("Emitting new snapshot {}", snapshot.toString()); + LOGGER.info("Emitting new snapshot {}", snapshot.toString()); parameters.getEventEmitter().emitSnapshot(snapshot); } catch (SQLException e) { - logger.error("Failed to make request", e.toString()); + LOGGER.error("Failed to make request", e.toString()); throw new RuntimeException(e); } finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { - logger.error("Failed to close result set", e.toString()); + LOGGER.error("Failed to close result set", e.toString()); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { - logger.error("Failed to close connection", e.toString()); + LOGGER.error("Failed to close connection", e.toString()); } } } } else { - logger.error("Error: Should be one Primary Key"); + LOGGER.error("Error: Should be one Primary Key"); throw new IllegalStateException("Should be one Primary Key"); } } diff --git a/src/main/java/io/elastic/jdbc/actions/LookupRowByPrimaryKey.java b/src/main/java/io/elastic/jdbc/actions/LookupRowByPrimaryKey.java index 5b3f9b6..0d77ac2 100644 --- a/src/main/java/io/elastic/jdbc/actions/LookupRowByPrimaryKey.java +++ b/src/main/java/io/elastic/jdbc/actions/LookupRowByPrimaryKey.java @@ -22,7 +22,7 @@ public class LookupRowByPrimaryKey implements Module { - private static final Logger logger = LoggerFactory.getLogger(LookupRowByPrimaryKey.class); + private static final Logger LOGGER = LoggerFactory.getLogger(LookupRowByPrimaryKey.class); private static final String PROPERTY_DB_ENGINE = "dbEngine"; private static final String PROPERTY_TABLE_NAME = "tableName"; private static final String PROPERTY_ID_COLUMN = "idColumn"; @@ -71,21 +71,21 @@ public void execute(ExecutionParameters parameters) { boolean isOracle = dbEngine.equals(Engines.ORACLE.name().toLowerCase()); for (Map.Entry entry : body.entrySet()) { - logger.info("{} = {}", entry.getKey(), entry.getValue()); + LOGGER.info("{} = {}", entry.getKey(), entry.getValue()); primaryKey.append(entry.getKey()); primaryValue.append(entry.getValue()); primaryKeysCount++; } if (primaryKeysCount == 1) { - logger.info("Executing lookup row by primary key action"); + LOGGER.info("Executing lookup row by primary key action"); Connection connection = Utils.getConnection(configuration); Utils.columnTypes = Utils.getColumnTypes(connection, isOracle, tableName); - logger.info("Detected column types: " + Utils.columnTypes); + LOGGER.info("Detected column types: " + Utils.columnTypes); try { QueryFactory queryFactory = new QueryFactory(); Query query = queryFactory.getQuery(dbEngine); - logger.info("Lookup parameters: {} = {}", primaryKey.toString(), primaryValue.toString()); + LOGGER.info("Lookup parameters: {} = {}", primaryKey.toString(), primaryValue.toString()); query.from(tableName).lookup(primaryKey.toString(), primaryValue.toString()); checkConfig(configuration); rs = query.executeLookup(connection, body); @@ -96,26 +96,26 @@ public void execute(ExecutionParameters parameters) { } rowsCount++; if (rowsCount > 1) { - logger.error("Error: the number of matching rows is not exactly one"); + LOGGER.error("Error: the number of matching rows is not exactly one"); throw new RuntimeException("Error: the number of matching rows is not exactly one"); } else { - logger.info("Emitting data"); - logger.info(row.toString()); + LOGGER.info("Emitting data"); + LOGGER.info(row.toString()); parameters.getEventEmitter().emitData(new Message.Builder().body(row.build()).build()); } } for (Map.Entry entry : configuration.entrySet()) { - logger.info("Key = " + entry.getKey() + " Value = " + entry.getValue()); + LOGGER.info("Key = " + entry.getKey() + " Value = " + entry.getValue()); } if (rowsCount == 0 && nullableResult) { row.add("empty dataset", "no data"); - logger.info("Emitting data"); - logger.info(row.toString()); + LOGGER.info("Emitting data"); + LOGGER.info(row.toString()); parameters.getEventEmitter().emitData(new Message.Builder().body(row.build()).build()); } else if (rowsCount == 0 && !nullableResult) { - logger.info("Empty response. Error message will be returned"); + LOGGER.info("Empty response. Error message will be returned"); throw new RuntimeException("Empty response"); } @@ -123,29 +123,29 @@ public void execute(ExecutionParameters parameters) { .add(PROPERTY_ID_COLUMN, primaryKey.toString()) .add(PROPERTY_LOOKUP_VALUE, primaryValue.toString()) .add(PROPERTY_NULLABLE_RESULT, nullableResult).build(); - logger.info("Emitting new snapshot {}", snapshot.toString()); + LOGGER.info("Emitting new snapshot {}", snapshot.toString()); parameters.getEventEmitter().emitSnapshot(snapshot); } catch (SQLException e) { - logger.error("Failed to make request", e.toString()); + LOGGER.error("Failed to make request", e.toString()); throw new RuntimeException(e); } finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { - logger.error("Failed to close result set", e.toString()); + LOGGER.error("Failed to close result set", e.toString()); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { - logger.error("Failed to close connection", e.toString()); + LOGGER.error("Failed to close connection", e.toString()); } } } } else { - logger.error("Error: Should be one Primary Key"); + LOGGER.error("Error: Should be one Primary Key"); throw new IllegalStateException("Should be one Primary Key"); } } diff --git a/src/main/java/io/elastic/jdbc/actions/SelectAction.java b/src/main/java/io/elastic/jdbc/actions/SelectAction.java index 83860d4..d74fe9e 100644 --- a/src/main/java/io/elastic/jdbc/actions/SelectAction.java +++ b/src/main/java/io/elastic/jdbc/actions/SelectAction.java @@ -19,7 +19,7 @@ public class SelectAction implements Module { - private static final Logger logger = LoggerFactory.getLogger(SelectAction.class); + private static final Logger LOGGER = LoggerFactory.getLogger(SelectAction.class); private static final String SQL_QUERY_VALUE = "sqlQuery"; private static final String PROPERTY_NULLABLE_RESULT = "nullableResult"; private static final String PROPERTY_SKIP_NUMBER = "skipNumber"; @@ -49,40 +49,40 @@ public void execute(ExecutionParameters parameters) { } Utils.columnTypes = Utils.getVariableTypes(sqlQuery); - logger.info("Detected column types: " + Utils.columnTypes); + LOGGER.info("Detected column types: " + Utils.columnTypes); ResultSet rs = null; - logger.info("Executing select trigger"); + LOGGER.info("Executing select trigger"); try { QueryFactory queryFactory = new QueryFactory(); Query query = queryFactory.getQuery(dbEngine); sqlQuery = Query.preProcessSelect(sqlQuery); - logger.info("SQL Query: {}", sqlQuery); + LOGGER.info("SQL Query: {}", sqlQuery); rs = query.executeSelectQuery(connection, sqlQuery, body); ResultSetMetaData metaData = rs.getMetaData(); while (rs.next()) { - logger.info("columns count: {} from {}", rowsCount, metaData.getColumnCount()); + LOGGER.info("columns count: {} from {}", rowsCount, metaData.getColumnCount()); for (int i = 1; i <= metaData.getColumnCount(); i++) { row = Utils.getColumnDataByType(rs, metaData, i, row); } rowsCount++; - logger.info("Emitting data"); - logger.info(row.toString()); + LOGGER.info("Emitting data"); + LOGGER.info(row.toString()); parameters.getEventEmitter().emitData(new Message.Builder().body(row.build()).build()); } if (rowsCount == 0 && nullableResult) { row.add("empty dataset", "no data"); - logger.info("Emitting data"); + LOGGER.info("Emitting data"); parameters.getEventEmitter().emitData(new Message.Builder().body(row.build()).build()); } else if (rowsCount == 0 && !nullableResult) { - logger.info("Empty response. Error message will be returned"); + LOGGER.info("Empty response. Error message will be returned"); throw new RuntimeException("Empty response"); } snapshot = Json.createObjectBuilder().add(PROPERTY_SKIP_NUMBER, skipNumber + rowsCount) .add(SQL_QUERY_VALUE, sqlQuery) .add(PROPERTY_NULLABLE_RESULT, nullableResult).build(); - logger.info("Emitting new snapshot {}", snapshot.toString()); + LOGGER.info("Emitting new snapshot {}", snapshot.toString()); parameters.getEventEmitter().emitSnapshot(snapshot); } catch (SQLException e) { throw new RuntimeException(e); @@ -91,7 +91,7 @@ public void execute(ExecutionParameters parameters) { try { connection.close(); } catch (SQLException e) { - logger.error(e.toString()); + LOGGER.error(e.toString()); } } } diff --git a/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java b/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java index a8de334..a058b2c 100644 --- a/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java +++ b/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java @@ -20,7 +20,7 @@ public class UpsertRowByPrimaryKey implements Module { - private static final Logger logger = LoggerFactory.getLogger(UpsertRowByPrimaryKey.class); + private static final Logger LOGGER = LoggerFactory.getLogger(UpsertRowByPrimaryKey.class); private static final String PROPERTY_DB_ENGINE = "dbEngine"; private static final String PROPERTY_TABLE_NAME = "tableName"; @@ -55,7 +55,7 @@ public void execute(ExecutionParameters parameters) { throw new RuntimeException("DB Engine is required field"); } - logger.info("Executing lookup primary key"); + LOGGER.info("Executing lookup primary key"); boolean isOracle = dbEngine.equals(Engines.ORACLE.name().toLowerCase()); Connection connection = Utils.getConnection(configuration); @@ -75,29 +75,30 @@ public void execute(ExecutionParameters parameters) { primaryKeysCount++; } if (primaryKeysCount == 1) { - logger.info("Executing upsert row by primary key action"); + LOGGER.info("Executing upsert row by primary key action"); for (Map.Entry entry : body.entrySet()) { if (entry.getKey().equals(primaryKey)) { - logger.info("Primary key{} = {}", entry.getKey(), entry.getValue()); + LOGGER.info("Primary key{} = {}", entry.getKey(), entry.getValue()); primaryValue.append(entry.getValue()); } } Utils.columnTypes = Utils.getColumnTypes(connection, isOracle, tableName); - logger.info("Detected column types: " + Utils.columnTypes); + LOGGER.info("Detected column types: " + Utils.columnTypes); QueryFactory queryFactory = new QueryFactory(); Query query = queryFactory.getQuery(dbEngine); - logger.info("Execute upsert parameters by PK: {} = {}", primaryKey, primaryValue.toString()); + LOGGER + .info("Execute upsert parameters by PK: {} = {}", primaryKey, primaryValue.toString()); query.from(tableName).executeUpsert(connection, primaryKey, body); - logger.info("Emit data= {}", body.toString()); + LOGGER.info("Emit data= {}", body.toString()); parameters.getEventEmitter().emitData(new Message.Builder().body(body).build()); snapshot = Json.createObjectBuilder().add(PROPERTY_TABLE_NAME, tableName).build(); - logger.info("Emitting new snapshot {}", snapshot.toString()); + LOGGER.info("Emitting new snapshot {}", snapshot.toString()); parameters.getEventEmitter().emitSnapshot(snapshot); } else if (primaryKeysCount == 0) { - logger.error("Error: Table has not Primary Key. Should be one Primary Key"); + LOGGER.error("Error: Table has not Primary Key. Should be one Primary Key"); throw new IllegalStateException("Table has not Primary Key. Should be one Primary Key"); } else { - logger.error("Error: Composite Primary Key is not supported"); + LOGGER.error("Error: Composite Primary Key is not supported"); throw new IllegalStateException("Composite Primary Key is not supported"); } } catch (SQLException e) { @@ -107,14 +108,14 @@ public void execute(ExecutionParameters parameters) { try { rs.close(); } catch (SQLException e) { - logger.info("Failed to close result set {}", e); + LOGGER.info("Failed to close result set {}", e); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { - logger.info("Failed to close connection {}", e); + LOGGER.info("Failed to close connection {}", e); } } } diff --git a/src/main/java/io/elastic/jdbc/triggers/GetRowsPollingTrigger.java b/src/main/java/io/elastic/jdbc/triggers/GetRowsPollingTrigger.java index e90e44f..bfa93db 100644 --- a/src/main/java/io/elastic/jdbc/triggers/GetRowsPollingTrigger.java +++ b/src/main/java/io/elastic/jdbc/triggers/GetRowsPollingTrigger.java @@ -14,7 +14,6 @@ import java.text.SimpleDateFormat; import java.util.Calendar; import javax.json.Json; -import javax.json.JsonArray; import javax.json.JsonObject; import javax.json.JsonObjectBuilder; import javax.json.JsonValue; @@ -24,7 +23,7 @@ public class GetRowsPollingTrigger implements Module { - private static final Logger logger = LoggerFactory.getLogger(GetRowsPollingTrigger.class); + private static final Logger LOGGER = LoggerFactory.getLogger(GetRowsPollingTrigger.class); private static final String PROPERTY_TABLE_NAME = "tableName"; private static final String PROPERTY_POLLING_FIELD = "pollingField"; private static final String PROPERTY_POLLING_VALUE = "pollingValue"; @@ -32,10 +31,10 @@ public class GetRowsPollingTrigger implements Module { private static final String PROPERTY_SKIP_NUMBER = "skipNumber"; private static final String DATETIME_REGEX = "(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}):(\\d{2}):(\\d{2})(\\.(\\d{1,3}))?"; private static boolean isEmpty = true; - + @Override public final void execute(ExecutionParameters parameters) { - logger.info("About to execute select trigger"); + LOGGER.info("About to execute select trigger"); final JsonObject configuration = parameters.getConfiguration(); JsonObject snapshot = parameters.getSnapshot(); JsonObjectBuilder row = Json.createObjectBuilder(); @@ -50,7 +49,7 @@ public final void execute(ExecutionParameters parameters) { String dbEngine = configuration.getString(Utils.CFG_DB_ENGINE); String tableName = configuration.getString(PROPERTY_TABLE_NAME); - if(Utils.getNonNullString(configuration, PROPERTY_POLLING_FIELD).length() != 0) { + if (Utils.getNonNullString(configuration, PROPERTY_POLLING_FIELD).length() != 0) { pollingField = configuration.getString(PROPERTY_POLLING_FIELD); } Timestamp pollingValue; @@ -58,27 +57,31 @@ public final void execute(ExecutionParameters parameters) { Timestamp maxPollingValue = cts; String formattedDate = new SimpleDateFormat(PROPERTY_DATETIME_FORMAT).format(cts); - if (configuration.containsKey(PROPERTY_POLLING_VALUE) && Utils.getNonNullString(configuration, PROPERTY_POLLING_VALUE).matches(DATETIME_REGEX)) { + if (configuration.containsKey(PROPERTY_POLLING_VALUE) && Utils + .getNonNullString(configuration, PROPERTY_POLLING_VALUE).matches(DATETIME_REGEX)) { pollingValue = Timestamp.valueOf(configuration.getString(PROPERTY_POLLING_VALUE)); - } else if (snapshot.containsKey(PROPERTY_POLLING_VALUE) && Utils.getNonNullString(snapshot, PROPERTY_POLLING_VALUE).matches(DATETIME_REGEX)) { + } else if (snapshot.containsKey(PROPERTY_POLLING_VALUE) && Utils + .getNonNullString(snapshot, PROPERTY_POLLING_VALUE).matches(DATETIME_REGEX)) { pollingValue = Timestamp.valueOf(snapshot.getString(PROPERTY_POLLING_VALUE)); } else { - logger.info( + LOGGER.info( "There is an empty value for Start Polling From at the config and snapshot. So, we set Current Date = " + formattedDate); pollingValue = cts; } - if (snapshot.containsKey(PROPERTY_SKIP_NUMBER)) + if (snapshot.containsKey(PROPERTY_SKIP_NUMBER)) { skipNumber = snapshot.getInt(PROPERTY_SKIP_NUMBER); + } - if (snapshot.containsKey(PROPERTY_TABLE_NAME) && snapshot.get(PROPERTY_TABLE_NAME) != null && !snapshot.getString(PROPERTY_TABLE_NAME) + if (snapshot.containsKey(PROPERTY_TABLE_NAME) && snapshot.get(PROPERTY_TABLE_NAME) != null + && !snapshot.getString(PROPERTY_TABLE_NAME) .equals(tableName)) { skipNumber = 0; } ResultSet rs = null; - logger.info("Executing row polling trigger"); + LOGGER.info("Executing row polling trigger"); try { QueryFactory queryFactory = new QueryFactory(); Query query = queryFactory.getQuery(dbEngine); @@ -107,7 +110,7 @@ public final void execute(ExecutionParameters parameters) { if (rowsCount == 0) { row.add("empty dataset", "no data"); - logger.info("Emitting empty data"); + LOGGER.info("Emitting empty data"); maxPollingValue = new java.sql.Timestamp(System.currentTimeMillis()); parameters.getEventEmitter().emitData(new Message.Builder().body(row.build()).build()); } @@ -115,27 +118,27 @@ public final void execute(ExecutionParameters parameters) { formattedDate = new SimpleDateFormat(PROPERTY_DATETIME_FORMAT).format(maxPollingValue); snapshot = Json.createObjectBuilder().add(PROPERTY_SKIP_NUMBER, skipNumber + rowsCount) - .add(PROPERTY_TABLE_NAME, tableName) - .add(PROPERTY_POLLING_FIELD, pollingField) - .add(PROPERTY_POLLING_VALUE, formattedDate).build(); - logger.info("Emitting new snapshot {}", snapshot.toString()); + .add(PROPERTY_TABLE_NAME, tableName) + .add(PROPERTY_POLLING_FIELD, pollingField) + .add(PROPERTY_POLLING_VALUE, formattedDate).build(); + LOGGER.info("Emitting new snapshot {}", snapshot.toString()); parameters.getEventEmitter().emitSnapshot(snapshot); } catch (SQLException e) { - logger.error("Failed to make request", e.toString()); + LOGGER.error("Failed to make request", e.toString()); throw new RuntimeException(e); } finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { - logger.error("Failed to close result set", e.toString()); + LOGGER.error("Failed to close result set", e.toString()); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { - logger.error("Failed to close connection", e.toString()); + LOGGER.error("Failed to close connection", e.toString()); } } } diff --git a/src/main/java/io/elastic/jdbc/triggers/SelectTrigger.java b/src/main/java/io/elastic/jdbc/triggers/SelectTrigger.java index a2b4999..a94ae8e 100644 --- a/src/main/java/io/elastic/jdbc/triggers/SelectTrigger.java +++ b/src/main/java/io/elastic/jdbc/triggers/SelectTrigger.java @@ -6,6 +6,11 @@ import io.elastic.jdbc.QueryBuilders.Query; import io.elastic.jdbc.QueryFactory; import io.elastic.jdbc.Utils; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.Calendar; import javax.json.Json; @@ -15,11 +20,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.sql.*; - public class SelectTrigger implements Module { - private static final Logger logger = LoggerFactory.getLogger(SelectTrigger.class); + private static final Logger LOGGER = LoggerFactory.getLogger(SelectTrigger.class); private static final String PROPERTY_DB_ENGINE = "dbEngine"; private static final String LAST_POLL_PLACEHOLDER = "%%EIO_LAST_POLL%%"; private static final String SQL_QUERY_VALUE = "sqlQuery"; @@ -30,7 +33,7 @@ public class SelectTrigger implements Module { @Override public final void execute(ExecutionParameters parameters) { - logger.info("About to execute select trigger"); + LOGGER.info("About to execute select trigger"); final JsonObject configuration = parameters.getConfiguration(); JsonObject snapshot = parameters.getSnapshot(); JsonObjectBuilder row = Json.createObjectBuilder(); @@ -47,32 +50,35 @@ public final void execute(ExecutionParameters parameters) { Timestamp cts = new java.sql.Timestamp(cDate.getTimeInMillis()); String formattedDate = new SimpleDateFormat(PROPERTY_DATETIME_FORMAT).format(cts); - if (configuration.containsKey(PROPERTY_POLLING_VALUE) && Utils.getNonNullString(configuration, PROPERTY_POLLING_VALUE).matches(DATETIME_REGEX)) { + if (configuration.containsKey(PROPERTY_POLLING_VALUE) && Utils + .getNonNullString(configuration, PROPERTY_POLLING_VALUE).matches(DATETIME_REGEX)) { pollingValue = Timestamp.valueOf(configuration.getString(PROPERTY_POLLING_VALUE)); - } else if (snapshot.containsKey(PROPERTY_POLLING_VALUE) && Utils.getNonNullString(snapshot, LAST_POLL_PLACEHOLDER).matches(DATETIME_REGEX)) { + } else if (snapshot.containsKey(PROPERTY_POLLING_VALUE) && Utils + .getNonNullString(snapshot, LAST_POLL_PLACEHOLDER).matches(DATETIME_REGEX)) { pollingValue = Timestamp.valueOf(snapshot.getString(LAST_POLL_PLACEHOLDER)); } else { - logger.info( + LOGGER.info( "There is an empty value for Start Polling From at the config and snapshot. So, we set Current Date = " + formattedDate); pollingValue = cts; } - logger.info("EIO_LAST_POLL = {}", pollingValue); + LOGGER.info("EIO_LAST_POLL = {}", pollingValue); String sqlQuery = configuration.getString(SQL_QUERY_VALUE); - if (snapshot.get(PROPERTY_SKIP_NUMBER) != null) + if (snapshot.get(PROPERTY_SKIP_NUMBER) != null) { skipNumber = snapshot.getInt(PROPERTY_SKIP_NUMBER); - logger.info("SQL QUERY {} : ", sqlQuery); + } + LOGGER.info("SQL QUERY {} : ", sqlQuery); ResultSet rs = null; - logger.info("Executing select trigger"); + LOGGER.info("Executing select trigger"); try { QueryFactory queryFactory = new QueryFactory(); Query query = queryFactory.getQuery(dbEngine); sqlQuery = Query.preProcessSelect(sqlQuery); - if(sqlQuery.contains(LAST_POLL_PLACEHOLDER)) { + if (sqlQuery.contains(LAST_POLL_PLACEHOLDER)) { sqlQuery = sqlQuery.replace(LAST_POLL_PLACEHOLDER, "?"); query.selectPolling(sqlQuery, pollingValue); } - logger.info("SQL Query: {}", sqlQuery); + LOGGER.info("SQL Query: {}", sqlQuery); rs = query.executeSelectTrigger(connection, sqlQuery); ResultSetMetaData metaData = rs.getMetaData(); while (rs.next()) { @@ -80,39 +86,39 @@ public final void execute(ExecutionParameters parameters) { row = Utils.getColumnDataByType(rs, metaData, i, row); } rowsCount++; - logger.info("Emitting data"); - logger.info(row.toString()); + LOGGER.info("Emitting data"); + LOGGER.info(row.toString()); parameters.getEventEmitter().emitData(new Message.Builder().body(row.build()).build()); } if (rowsCount == 0) { row.add("empty dataset", "no data"); - logger.info("Emitting data"); - logger.info(row.toString()); + LOGGER.info("Emitting data"); + LOGGER.info(row.toString()); parameters.getEventEmitter().emitData(new Message.Builder().body(row.build()).build()); } snapshot = Json.createObjectBuilder().add(PROPERTY_SKIP_NUMBER, skipNumber + rowsCount) - .add(LAST_POLL_PLACEHOLDER, pollingValue.toString()) - .add(SQL_QUERY_VALUE, sqlQuery).build(); - logger.info("Emitting new snapshot {}", snapshot.toString()); + .add(LAST_POLL_PLACEHOLDER, pollingValue.toString()) + .add(SQL_QUERY_VALUE, sqlQuery).build(); + LOGGER.info("Emitting new snapshot {}", snapshot.toString()); parameters.getEventEmitter().emitSnapshot(snapshot); } catch (SQLException e) { - logger.error("Failed to make request", e.toString()); + LOGGER.error("Failed to make request", e.toString()); throw new RuntimeException(e); } finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { - logger.error("Failed to close result set", e.toString()); + LOGGER.error("Failed to close result set", e.toString()); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { - logger.error("Failed to close connection", e.toString()); + LOGGER.error("Failed to close connection", e.toString()); } } } From 5694a19bb9dbc93808b619a9935cb6934b171c44 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Mon, 3 Sep 2018 16:01:47 +0300 Subject: [PATCH 46/56] 1. Updated methods "executeLookup" and "executeDelete" 2. Updated actions DeleteRowByPrimaryKey and LookupRowByPrimaryKey 3. Add unittest for Delete action --- .../io/elastic/jdbc/QueryBuilders/MSSQL.java | 17 +- .../io/elastic/jdbc/QueryBuilders/MySQL.java | 18 +-- .../io/elastic/jdbc/QueryBuilders/Oracle.java | 17 +- .../jdbc/QueryBuilders/PostgreSQL.java | 20 +-- .../io/elastic/jdbc/QueryBuilders/Query.java | 2 +- src/main/java/io/elastic/jdbc/Utils.java | 29 ++++ .../jdbc/actions/DeleteRowByPrimaryKey.java | 116 +++++-------- .../jdbc/actions/LookupRowByPrimaryKey.java | 97 ++++------- .../jdbc/actions/DeleteActionMSSQLSpec.groovy | 145 +++++++++++++++++ .../jdbc/actions/DeleteActionMySQLSpec.groovy | 143 ++++++++++++++++ .../actions/DeleteActionOracleSpec.groovy | 153 ++++++++++++++++++ .../actions/DeleteActionPostrgeSpec.groovy | 143 ++++++++++++++++ 12 files changed, 716 insertions(+), 184 deletions(-) create mode 100644 src/test/groovy/io/elastic/jdbc/actions/DeleteActionMSSQLSpec.groovy create mode 100644 src/test/groovy/io/elastic/jdbc/actions/DeleteActionMySQLSpec.groovy create mode 100644 src/test/groovy/io/elastic/jdbc/actions/DeleteActionOracleSpec.groovy create mode 100644 src/test/groovy/io/elastic/jdbc/actions/DeleteActionPostrgeSpec.groovy diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java index ecd44f4..b251eff 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java @@ -53,7 +53,7 @@ public ResultSet executePolling(Connection connection) throws SQLException { return stmt.executeQuery(); } - public ResultSet executeLookup(Connection connection, JsonObject body) throws SQLException { + public JsonObject executeLookup(Connection connection, JsonObject body) throws SQLException { validateQuery(); String sql = "WITH Results_CTE AS" + "(" + @@ -67,13 +67,7 @@ public ResultSet executeLookup(Connection connection, JsonObject body) throws SQ " FROM Results_CTE" + " WHERE RowNum > ?" + " AND RowNum < ?"; - PreparedStatement stmt = connection.prepareStatement(sql); - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, 1, entry.getKey(), body); - } - stmt.setInt(2, skipNumber); - stmt.setInt(3, countNumber + skipNumber); - return stmt.executeQuery(); + return Utils.getLookupRow(connection, body, sql, skipNumber, countNumber + skipNumber); } public int executeDelete(Connection connection, JsonObject body) throws SQLException { @@ -81,9 +75,10 @@ public int executeDelete(Connection connection, JsonObject body) throws SQLExcep String sql = "DELETE" + " FROM " + tableName + " WHERE " + lookupField + " = ?"; - PreparedStatement stmt = connection.prepareStatement(sql); - stmt.setString(1, lookupValue); - return stmt.executeUpdate(); + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + stmt.setString(1, lookupValue); + return stmt.executeUpdate(); + } } public boolean executeRecordExists(Connection connection, JsonObject body) throws SQLException { diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java index 0eef058..8631672 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java @@ -53,7 +53,7 @@ public ResultSet executePolling(Connection connection) throws SQLException { return stmt.executeQuery(); } - public ResultSet executeLookup(Connection connection, JsonObject body) throws SQLException { + public JsonObject executeLookup(Connection connection, JsonObject body) throws SQLException { validateQuery(); StringBuilder sql = new StringBuilder("SELECT * FROM "); sql.append(tableName); @@ -62,23 +62,17 @@ public ResultSet executeLookup(Connection connection, JsonObject body) throws SQ sql.append(" = ?"); sql.append(" ORDER BY ").append(lookupField); sql.append(" ASC LIMIT ? OFFSET ?"); - - PreparedStatement stmt = connection.prepareStatement(sql.toString()); - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, 1, entry.getKey(), body); - } - stmt.setInt(2, countNumber); - stmt.setInt(3, skipNumber); - return stmt.executeQuery(); + return Utils.getLookupRow(connection, body, sql.toString(), countNumber, skipNumber); } public int executeDelete(Connection connection, JsonObject body) throws SQLException { String sql = "DELETE" + " FROM " + tableName + " WHERE " + lookupField + " = ?"; - PreparedStatement stmt = connection.prepareStatement(sql); - stmt.setString(1, lookupValue); - return stmt.executeUpdate(); + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + stmt.setString(1, lookupValue); + return stmt.executeUpdate(); + } } public boolean executeRecordExists(Connection connection, JsonObject body) throws SQLException { diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java index 6126bcd..6cac845 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java @@ -48,29 +48,24 @@ public ResultSet executePolling(Connection connection) throws SQLException { return stmt.executeQuery(); } - public ResultSet executeLookup(Connection connection, JsonObject body) throws SQLException { + public JsonObject executeLookup(Connection connection, JsonObject body) throws SQLException { validateQuery(); String sql = "SELECT * FROM " + "(SELECT b.*, rank() OVER (ORDER BY " + lookupField + ") AS rnk FROM " + tableName + " b) WHERE " + lookupField + " = ? " + "AND rnk BETWEEN ? AND ? " + "ORDER BY " + lookupField; - PreparedStatement stmt = connection.prepareStatement(sql); - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, 1, entry.getKey(), body); - } - stmt.setInt(2, skipNumber); - stmt.setInt(3, countNumber); - return stmt.executeQuery(); + return Utils.getLookupRow(connection, body, sql, skipNumber, countNumber); } public int executeDelete(Connection connection, JsonObject body) throws SQLException { String sql = "DELETE" + " FROM " + tableName + " WHERE " + lookupField + " = ?"; - PreparedStatement stmt = connection.prepareStatement(sql); - stmt.setString(1, lookupValue); - return stmt.executeUpdate(); + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + stmt.setString(1, lookupValue); + return stmt.executeUpdate(); + } } public boolean executeRecordExists(Connection connection, JsonObject body) throws SQLException { diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java index 41f1a26..51d2d7d 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java @@ -53,7 +53,7 @@ public ResultSet executePolling(Connection connection) throws SQLException { return stmt.executeQuery(); } - public ResultSet executeLookup(Connection connection, JsonObject body) throws SQLException { + public JsonObject executeLookup(Connection connection, JsonObject body) throws SQLException { validateQuery(); String sql = "WITH results_cte AS" + "(" + @@ -67,14 +67,7 @@ public ResultSet executeLookup(Connection connection, JsonObject body) throws SQ " FROM results_cte" + " WHERE rownum > ?" + " AND rownum < ?"; - PreparedStatement stmt = connection.prepareStatement(sql); - //stmt.setString(1, lookupValue); - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, 1, entry.getKey(), body); - } - stmt.setInt(2, skipNumber); - stmt.setInt(3, countNumber + skipNumber); - return stmt.executeQuery(); + return Utils.getLookupRow(connection, body, sql, skipNumber, countNumber + skipNumber); } public int executeDelete(Connection connection, JsonObject body) throws SQLException { @@ -82,11 +75,12 @@ public int executeDelete(Connection connection, JsonObject body) throws SQLExcep String sql = "DELETE" + " FROM " + tableName + " WHERE " + lookupField + " = ?"; - PreparedStatement stmt = connection.prepareStatement(sql); - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, 1, entry.getKey(), body); + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + for (Map.Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, 1, entry.getKey(), body); + } + return stmt.executeUpdate(); } - return stmt.executeUpdate(); } public boolean executeRecordExists(Connection connection, JsonObject body) throws SQLException { diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java b/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java index c58daaf..76cd466 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java @@ -65,7 +65,7 @@ public Query selectPolling(String sqlQuery, Timestamp fieldValue) { abstract public ResultSet executePolling(Connection connection) throws SQLException; - abstract public ResultSet executeLookup(Connection connection, JsonObject body) + abstract public JsonObject executeLookup(Connection connection, JsonObject body) throws SQLException; abstract public boolean executeRecordExists(Connection connection, JsonObject body) diff --git a/src/main/java/io/elastic/jdbc/Utils.java b/src/main/java/io/elastic/jdbc/Utils.java index 740715e..6b78f22 100644 --- a/src/main/java/io/elastic/jdbc/Utils.java +++ b/src/main/java/io/elastic/jdbc/Utils.java @@ -17,6 +17,7 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; +import javax.json.Json; import javax.json.JsonObject; import javax.json.JsonObjectBuilder; import javax.json.JsonValue; @@ -300,4 +301,32 @@ public static JsonObjectBuilder getColumnDataByType(ResultSet rs, ResultSetMetaD return row; } + public static JsonObject getLookupRow(Connection connection, JsonObject body, String sql, + Integer secondParameter, Integer thirdParameter) + throws SQLException { + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + JsonObjectBuilder row = Json.createObjectBuilder(); + for (Map.Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, 1, entry.getKey(), body); + } + stmt.setInt(2, secondParameter); + stmt.setInt(3, thirdParameter); + try (ResultSet rs = stmt.executeQuery()) { + ResultSetMetaData metaData = rs.getMetaData(); + int rowsCount = 0; + while (rs.next()) { + for (int i = 1; i <= metaData.getColumnCount(); i++) { + row = Utils.getColumnDataByType(rs, metaData, i, row); + } + rowsCount++; + if (rowsCount > 1) { + LOGGER.error("Error: the number of matching rows is not exactly one"); + throw new RuntimeException("Error: the number of matching rows is not exactly one"); + } + } + return row.build(); + } + } + } + } diff --git a/src/main/java/io/elastic/jdbc/actions/DeleteRowByPrimaryKey.java b/src/main/java/io/elastic/jdbc/actions/DeleteRowByPrimaryKey.java index db9853d..e29b0b0 100644 --- a/src/main/java/io/elastic/jdbc/actions/DeleteRowByPrimaryKey.java +++ b/src/main/java/io/elastic/jdbc/actions/DeleteRowByPrimaryKey.java @@ -8,12 +8,10 @@ import io.elastic.jdbc.QueryFactory; import io.elastic.jdbc.Utils; import java.sql.Connection; -import java.sql.ResultSet; import java.sql.SQLException; import java.util.Map; import javax.json.Json; import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; import javax.json.JsonString; import javax.json.JsonValue; import org.slf4j.Logger; @@ -27,24 +25,18 @@ public class DeleteRowByPrimaryKey implements Module { private static final String PROPERTY_ID_COLUMN = "idColumn"; private static final String PROPERTY_LOOKUP_VALUE = "lookupValue"; private static final String PROPERTY_NULLABLE_RESULT = "nullableResult"; - public boolean isOracle = false; - private Connection connection = null; - private Map columnTypes = null; @Override public void execute(ExecutionParameters parameters) { final JsonObject body = parameters.getMessage().getBody(); final JsonObject configuration = parameters.getConfiguration(); JsonObject snapshot = parameters.getSnapshot(); - JsonObjectBuilder row = Json.createObjectBuilder(); - ResultSet rs = null; StringBuilder primaryKey = new StringBuilder(); StringBuilder primaryValue = new StringBuilder(); Integer primaryKeysCount = 0; String tableName = ""; String dbEngine = ""; Boolean nullableResult = false; - Integer rowsCount = 0; if (configuration.containsKey(PROPERTY_TABLE_NAME) && Utils.getNonNullString(configuration, PROPERTY_TABLE_NAME).length() != 0) { @@ -70,8 +62,6 @@ public void execute(ExecutionParameters parameters) { nullableResult = true; } - boolean isOracle = dbEngine.equals(Engines.ORACLE.name().toLowerCase()); - for (Map.Entry entry : body.entrySet()) { LOGGER.info("{} = {}", entry.getKey(), entry.getValue()); primaryKey.append(entry.getKey()); @@ -80,73 +70,55 @@ public void execute(ExecutionParameters parameters) { } if (primaryKeysCount == 1) { - LOGGER.info("Executing delete row by primary key action"); - Connection connection = Utils.getConnection(configuration); - Utils.columnTypes = Utils.getColumnTypes(connection, isOracle, tableName); - LOGGER.info("Detected column types: " + Utils.columnTypes); - try { - QueryFactory queryFactory = new QueryFactory(); - Query query = queryFactory.getQuery(dbEngine); - LOGGER.info("Lookup parameters: {} = {}", primaryKey.toString(), primaryValue.toString()); - query.from(tableName).lookup(primaryKey.toString(), primaryValue.toString()); - checkConfig(configuration); - rs = query.executeLookup(connection, body); - while (rs.next()) { - rowsCount++; - if (rowsCount > 1) { - LOGGER.error("Error: the number of matching rows is not exactly one"); - throw new RuntimeException("Error: the number of matching rows is not exactly one"); + try (Connection connection = Utils.getConnection(configuration)) { + LOGGER.info("Executing delete row by primary key action"); + boolean isOracle = dbEngine.equals(Engines.ORACLE.name().toLowerCase()); + Utils.columnTypes = Utils.getColumnTypes(connection, isOracle, tableName); + LOGGER.info("Detected column types: " + Utils.columnTypes); + try { + QueryFactory queryFactory = new QueryFactory(); + Query query = queryFactory.getQuery(dbEngine); + LOGGER.info("Lookup parameters: {} = {}", primaryKey.toString(), primaryValue.toString()); + query.from(tableName).lookup(primaryKey.toString(), primaryValue.toString()); + checkConfig(configuration); + JsonObject row = query.executeLookup(connection, body); + + for (Map.Entry entry : configuration.entrySet()) { + LOGGER.info("Key = " + entry.getKey() + " Value = " + entry.getValue()); } - } - - for (Map.Entry entry : configuration.entrySet()) { - LOGGER.info("Key = " + entry.getKey() + " Value = " + entry.getValue()); - } - - if (rowsCount == 1) { - int result = query.executeDelete(connection, body); - if (result == 1) { - row.add("result", result); - LOGGER.info("Emitting data"); - parameters.getEventEmitter().emitData(new Message.Builder().body(row.build()).build()); - } else { - LOGGER.info("Unexpected result"); - throw new RuntimeException("Unexpected result"); + if (row.size() != 0) { + int result = query.executeDelete(connection, body); + if (result == 1) { + LOGGER.info("Emitting data {}", row); + parameters.getEventEmitter().emitData(new Message.Builder().body(row).build()); + } else { + LOGGER.info("Unexpected result"); + throw new RuntimeException("Unexpected result"); + } + } else if (row.size() == 0 && nullableResult) { + JsonObject emptyRow = Json.createObjectBuilder() + .add("empty dataset", "nothing to delete") + .build(); + LOGGER.info("Emitting data {}", emptyRow); + parameters.getEventEmitter().emitData(new Message.Builder().body(emptyRow).build()); + } else if (row.size() == 0 && !nullableResult) { + LOGGER.info("Empty response. Error message will be returned"); + throw new RuntimeException("Empty response"); } - } else if (rowsCount == 0 && nullableResult) { - row.add("empty dataset", "nothing to delete"); - LOGGER.info("Emitting data"); - parameters.getEventEmitter().emitData(new Message.Builder().body(row.build()).build()); - } else if (rowsCount == 0 && !nullableResult) { - LOGGER.info("Empty response. Error message will be returned"); - throw new RuntimeException("Empty response"); - } - snapshot = Json.createObjectBuilder().add(PROPERTY_TABLE_NAME, tableName) - .add(PROPERTY_ID_COLUMN, primaryKey.toString()) - .add(PROPERTY_LOOKUP_VALUE, primaryValue.toString()) - .add(PROPERTY_NULLABLE_RESULT, nullableResult).build(); - LOGGER.info("Emitting new snapshot {}", snapshot.toString()); - parameters.getEventEmitter().emitSnapshot(snapshot); - } catch (SQLException e) { - LOGGER.error("Failed to make request", e.toString()); - throw new RuntimeException(e); - } finally { - if (rs != null) { - try { - rs.close(); - } catch (SQLException e) { - LOGGER.error("Failed to close result set", e.toString()); - } - } - if (connection != null) { - try { - connection.close(); - } catch (SQLException e) { - LOGGER.error("Failed to close connection", e.toString()); - } + snapshot = Json.createObjectBuilder().add(PROPERTY_TABLE_NAME, tableName) + .add(PROPERTY_ID_COLUMN, primaryKey.toString()) + .add(PROPERTY_LOOKUP_VALUE, primaryValue.toString()) + .add(PROPERTY_NULLABLE_RESULT, nullableResult).build(); + LOGGER.info("Emitting new snapshot {}", snapshot.toString()); + parameters.getEventEmitter().emitSnapshot(snapshot); + } catch (SQLException e) { + LOGGER.error("Failed to make request", e.toString()); + throw new RuntimeException(e); } + } catch (SQLException e) { + LOGGER.error("Failed to close connection", e.toString()); } } else { LOGGER.error("Error: Should be one Primary Key"); diff --git a/src/main/java/io/elastic/jdbc/actions/LookupRowByPrimaryKey.java b/src/main/java/io/elastic/jdbc/actions/LookupRowByPrimaryKey.java index 0d77ac2..de40b44 100644 --- a/src/main/java/io/elastic/jdbc/actions/LookupRowByPrimaryKey.java +++ b/src/main/java/io/elastic/jdbc/actions/LookupRowByPrimaryKey.java @@ -8,13 +8,10 @@ import io.elastic.jdbc.QueryFactory; import io.elastic.jdbc.Utils; import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.Map; import javax.json.Json; import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; import javax.json.JsonString; import javax.json.JsonValue; import org.slf4j.Logger; @@ -34,15 +31,12 @@ public void execute(ExecutionParameters parameters) { final JsonObject body = parameters.getMessage().getBody(); final JsonObject configuration = parameters.getConfiguration(); JsonObject snapshot = parameters.getSnapshot(); - JsonObjectBuilder row = Json.createObjectBuilder(); - ResultSet rs = null; StringBuilder primaryKey = new StringBuilder(); StringBuilder primaryValue = new StringBuilder(); Integer primaryKeysCount = 0; String tableName = ""; String dbEngine = ""; Boolean nullableResult = false; - Integer rowsCount = 0; if (configuration.containsKey(PROPERTY_TABLE_NAME) && Utils.getNonNullString(configuration, PROPERTY_TABLE_NAME).length() != 0) { @@ -78,71 +72,46 @@ public void execute(ExecutionParameters parameters) { } if (primaryKeysCount == 1) { - LOGGER.info("Executing lookup row by primary key action"); - Connection connection = Utils.getConnection(configuration); - Utils.columnTypes = Utils.getColumnTypes(connection, isOracle, tableName); - LOGGER.info("Detected column types: " + Utils.columnTypes); - try { - QueryFactory queryFactory = new QueryFactory(); - Query query = queryFactory.getQuery(dbEngine); - LOGGER.info("Lookup parameters: {} = {}", primaryKey.toString(), primaryValue.toString()); - query.from(tableName).lookup(primaryKey.toString(), primaryValue.toString()); - checkConfig(configuration); - rs = query.executeLookup(connection, body); - ResultSetMetaData metaData = rs.getMetaData(); - while (rs.next()) { - for (int i = 1; i <= metaData.getColumnCount(); i++) { - row = Utils.getColumnDataByType(rs, metaData, i, row); + + try (Connection connection = Utils.getConnection(configuration)) { + LOGGER.info("Executing lookup row by primary key action"); + Utils.columnTypes = Utils.getColumnTypes(connection, isOracle, tableName); + LOGGER.info("Detected column types: " + Utils.columnTypes); + try { + QueryFactory queryFactory = new QueryFactory(); + Query query = queryFactory.getQuery(dbEngine); + LOGGER.info("Lookup parameters: {} = {}", primaryKey.toString(), primaryValue.toString()); + query.from(tableName).lookup(primaryKey.toString(), primaryValue.toString()); + checkConfig(configuration); + + JsonObject row = query.executeLookup(connection, body); + if (row.size() != 0) { + LOGGER.info("Emitting data"); + LOGGER.info(row.toString()); + parameters.getEventEmitter().emitData(new Message.Builder().body(row).build()); } - rowsCount++; - if (rowsCount > 1) { - LOGGER.error("Error: the number of matching rows is not exactly one"); - throw new RuntimeException("Error: the number of matching rows is not exactly one"); - } else { + if (row.size() == 0 && nullableResult) { + row.put("empty dataset", null); LOGGER.info("Emitting data"); LOGGER.info(row.toString()); - parameters.getEventEmitter().emitData(new Message.Builder().body(row.build()).build()); + parameters.getEventEmitter().emitData(new Message.Builder().body(row).build()); + } else if (row.size() == 0 && !nullableResult) { + LOGGER.info("Empty response. Error message will be returned"); + throw new RuntimeException("Empty response"); } - } - - for (Map.Entry entry : configuration.entrySet()) { - LOGGER.info("Key = " + entry.getKey() + " Value = " + entry.getValue()); - } - if (rowsCount == 0 && nullableResult) { - row.add("empty dataset", "no data"); - LOGGER.info("Emitting data"); - LOGGER.info(row.toString()); - parameters.getEventEmitter().emitData(new Message.Builder().body(row.build()).build()); - } else if (rowsCount == 0 && !nullableResult) { - LOGGER.info("Empty response. Error message will be returned"); - throw new RuntimeException("Empty response"); + snapshot = Json.createObjectBuilder().add(PROPERTY_TABLE_NAME, tableName) + .add(PROPERTY_ID_COLUMN, primaryKey.toString()) + .add(PROPERTY_LOOKUP_VALUE, primaryValue.toString()) + .add(PROPERTY_NULLABLE_RESULT, nullableResult).build(); + LOGGER.info("Emitting new snapshot {}", snapshot.toString()); + parameters.getEventEmitter().emitSnapshot(snapshot); + } catch (SQLException e) { + LOGGER.error("Failed to make request", e.toString()); + throw new RuntimeException(e); } - - snapshot = Json.createObjectBuilder().add(PROPERTY_TABLE_NAME, tableName) - .add(PROPERTY_ID_COLUMN, primaryKey.toString()) - .add(PROPERTY_LOOKUP_VALUE, primaryValue.toString()) - .add(PROPERTY_NULLABLE_RESULT, nullableResult).build(); - LOGGER.info("Emitting new snapshot {}", snapshot.toString()); - parameters.getEventEmitter().emitSnapshot(snapshot); } catch (SQLException e) { - LOGGER.error("Failed to make request", e.toString()); - throw new RuntimeException(e); - } finally { - if (rs != null) { - try { - rs.close(); - } catch (SQLException e) { - LOGGER.error("Failed to close result set", e.toString()); - } - } - if (connection != null) { - try { - connection.close(); - } catch (SQLException e) { - LOGGER.error("Failed to close connection", e.toString()); - } - } + LOGGER.error("Failed to close connection", e.toString()); } } else { LOGGER.error("Error: Should be one Primary Key"); diff --git a/src/test/groovy/io/elastic/jdbc/actions/DeleteActionMSSQLSpec.groovy b/src/test/groovy/io/elastic/jdbc/actions/DeleteActionMSSQLSpec.groovy new file mode 100644 index 0000000..219fb84 --- /dev/null +++ b/src/test/groovy/io/elastic/jdbc/actions/DeleteActionMSSQLSpec.groovy @@ -0,0 +1,145 @@ +package io.elastic.jdbc.actions + +import io.elastic.api.EventEmitter +import io.elastic.api.ExecutionParameters +import io.elastic.api.Message +import spock.lang.Shared +import spock.lang.Specification + +import javax.json.Json +import javax.json.JsonObject +import java.sql.Connection +import java.sql.DriverManager +import java.sql.ResultSet + +//@Ignore +class DeleteActionMSSQLSpec extends Specification { + + @Shared + def user = "john"//System.getenv("CONN_USER_MSSQL") + @Shared + def password = "elastic123"//System.getenv("CONN_PASSWORD_MSSQL") + @Shared + def databaseName = "Test2"//System.getenv("CONN_DBNAME_MSSQL") + @Shared + def host = "eio-mssql-fra.c79g081qpeyv.eu-central-1.rds.amazonaws.com" +//System.getenv("CONN_HOST_MSSQL") + @Shared + def port = "1433"//System.getenv("CONN_PORT_MSSQL") + @Shared + def connectionString = "jdbc:sqlserver://" + host + ":" + port + ";database=" + databaseName + @Shared + Connection connection + + @Shared + EventEmitter.Callback errorCallback + @Shared + EventEmitter.Callback snapshotCallback + @Shared + EventEmitter.Callback dataCallback + @Shared + EventEmitter.Callback reboundCallback + @Shared + EventEmitter.Callback httpReplyCallback + @Shared + EventEmitter emitter + @Shared + DeleteRowByPrimaryKey action + + def setupSpec() { + connection = DriverManager.getConnection(connectionString, user, password) + } + + def setup() { + createAction() + } + + def createAction() { + errorCallback = Mock(EventEmitter.Callback) + snapshotCallback = Mock(EventEmitter.Callback) + dataCallback = Mock(EventEmitter.Callback) + reboundCallback = Mock(EventEmitter.Callback) + httpReplyCallback = Mock(EventEmitter.Callback) + emitter = new EventEmitter.Builder().onData(dataCallback).onSnapshot(snapshotCallback).onError(errorCallback) + .onRebound(reboundCallback).onHttpReplyCallback(httpReplyCallback).build() + action = new DeleteRowByPrimaryKey() + } + + def runAction(JsonObject config, JsonObject body, JsonObject snapshot) { + Message msg = new Message.Builder().body(body).build() + ExecutionParameters params = new ExecutionParameters(msg, emitter, config, snapshot) + action.execute(params); + } + + def getStarsConfig() { + JsonObject config = Json.createObjectBuilder() + .add("tableName", "stars") + .add("user", user) + .add("password", password) + .add("dbEngine", "mssql") + .add("host", host) + .add("port", port) + .add("databaseName", databaseName) + .add("nullableResult", "true") + .build(); + return config; + } + + def prepareStarsTable() { + connection.createStatement().execute("IF OBJECT_ID('stars', 'U') IS NOT NULL\n" + + " DROP TABLE stars;"); + connection.createStatement().execute("CREATE TABLE stars (id int PRIMARY KEY, name varchar(255) NOT NULL, " + + "date datetime, radius int, destination int, visible bit, visibledate date)"); + connection.createStatement().execute("INSERT INTO stars values (1,'Taurus', '2015-02-19 10:10:10.0'," + + " 123, 5, 0, '2015-02-19')") + connection.createStatement().execute("INSERT INTO stars values (2,'Eridanus', '2017-02-19 10:10:10.0'," + + " 852, 5, 0, '2015-07-19')") + } + + def getRecords(tableName) { + ArrayList records = new ArrayList(); + String sql = "SELECT * FROM " + tableName; + ResultSet rs = connection.createStatement().executeQuery(sql); + while (rs.next()) { + records.add(rs.toRowResult().toString()); + } + rs.close(); + return records; + } + + def cleanupSpec() { + String sql = "IF OBJECT_ID('persons', 'U') IS NOT NULL\n" + + " DROP TABLE persons;" + + connection.createStatement().execute(sql) + sql = "IF OBJECT_ID('stars', 'U') IS NOT NULL\n" + + " DROP TABLE stars;" + connection.createStatement().execute(sql) + connection.close() + } + + def "one delete"() { + + prepareStarsTable(); + + JsonObject snapshot = Json.createObjectBuilder().build() + + JsonObject body = Json.createObjectBuilder() + .add("id", 1) + .build(); + + runAction(getStarsConfig(), body, snapshot) + int first = getRecords("stars").size() + JsonObject body2 = Json.createObjectBuilder() + .add("id", 2) + .build() + runAction(getStarsConfig(), body2, snapshot) + int second = getRecords("stars").size() + + expect: + first == 1 + second == 0 + } + + +} diff --git a/src/test/groovy/io/elastic/jdbc/actions/DeleteActionMySQLSpec.groovy b/src/test/groovy/io/elastic/jdbc/actions/DeleteActionMySQLSpec.groovy new file mode 100644 index 0000000..69e71a2 --- /dev/null +++ b/src/test/groovy/io/elastic/jdbc/actions/DeleteActionMySQLSpec.groovy @@ -0,0 +1,143 @@ +package io.elastic.jdbc.actions + +import io.elastic.api.EventEmitter +import io.elastic.api.ExecutionParameters +import io.elastic.api.Message +import spock.lang.Shared +import spock.lang.Specification + +import javax.json.Json +import javax.json.JsonObject +import java.sql.Connection +import java.sql.DriverManager +import java.sql.ResultSet + +//@Ignore +class DeleteActionMySQLSpec extends Specification { + + @Shared + def user = "elasticio"//System.getenv("CONN_USER_MSSQL") + @Shared + def password = "lo4hDacS5L"//System.getenv("CONN_PASSWORD_MSSQL") + @Shared + def databaseName = "elasticio_testdb"//System.getenv("CONN_DBNAME_MSSQL") + @Shared + def host = "ec2-18-194-228-22.eu-central-1.compute.amazonaws.com" +//System.getenv("CONN_HOST_MSSQL") + @Shared + def port = "3306"//System.getenv("CONN_PORT_MSSQL") + @Shared + def dbEngine = "mysql"//System.getenv("CONN_DBENGINE_MSSQL") + @Shared + def connectionString = "jdbc:" + dbEngine + "://" + host + ":" + port + "/" + databaseName + "?useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC" + @Shared + Connection connection + + @Shared + EventEmitter.Callback errorCallback + @Shared + EventEmitter.Callback snapshotCallback + @Shared + EventEmitter.Callback dataCallback + @Shared + EventEmitter.Callback reboundCallback + @Shared + EventEmitter.Callback httpReplyCallback + @Shared + EventEmitter emitter + @Shared + DeleteRowByPrimaryKey action + + def setupSpec() { + connection = DriverManager.getConnection(connectionString, user, password) + } + + def setup() { + createAction() + } + + def createAction() { + errorCallback = Mock(EventEmitter.Callback) + snapshotCallback = Mock(EventEmitter.Callback) + dataCallback = Mock(EventEmitter.Callback) + reboundCallback = Mock(EventEmitter.Callback) + httpReplyCallback = Mock(EventEmitter.Callback) + emitter = new EventEmitter.Builder().onData(dataCallback).onSnapshot(snapshotCallback).onError(errorCallback) + .onRebound(reboundCallback).onHttpReplyCallback(httpReplyCallback).build() + action = new DeleteRowByPrimaryKey() + } + + def runAction(JsonObject config, JsonObject body, JsonObject snapshot) { + Message msg = new Message.Builder().body(body).build() + ExecutionParameters params = new ExecutionParameters(msg, emitter, config, snapshot) + action.execute(params); + } + + def getStarsConfig() { + JsonObject config = Json.createObjectBuilder() + .add("tableName", "stars") + .add("user", user) + .add("password", password) + .add("dbEngine", "mysql") + .add("host", host) + .add("port", port) + .add("databaseName", databaseName) + .add("nullableResult", "true") + .build(); + return config; + } + + def prepareStarsTable() { + String sql = "DROP TABLE IF EXISTS stars;" + connection.createStatement().execute(sql); + connection.createStatement().execute("CREATE TABLE stars (id int PRIMARY KEY, name varchar(255) NOT NULL, " + + "date datetime, radius int, destination int, visible bit, visibledate date)"); + connection.createStatement().execute("INSERT INTO stars values (1,'Taurus', '2015-02-19 10:10:10.0'," + + " 123, 5, 0, '2015-02-19')") + connection.createStatement().execute("INSERT INTO stars values (2,'Eridanus', '2017-02-19 10:10:10.0'," + + " 852, 5, 0, '2015-07-19')") + } + + def getRecords(tableName) { + ArrayList records = new ArrayList(); + String sql = "SELECT * FROM " + tableName; + ResultSet rs = connection.createStatement().executeQuery(sql); + while (rs.next()) { + records.add(rs.toRowResult().toString()); + } + rs.close(); + return records; + } + + def cleanupSpec() { + String sql = "DROP TABLE IF EXISTS persons;" + + connection.createStatement().execute(sql) + sql = "DROP TABLE IF EXISTS stars;" + connection.createStatement().execute(sql) + connection.close() + } + + def "one delete"() { + + prepareStarsTable(); + + JsonObject snapshot = Json.createObjectBuilder().build() + + JsonObject body = Json.createObjectBuilder() + .add("id", 1) + .build(); + + runAction(getStarsConfig(), body, snapshot) + int first = getRecords("stars").size() + JsonObject body2 = Json.createObjectBuilder() + .add("id", 2) + .build() + runAction(getStarsConfig(), body2, snapshot) + int second = getRecords("stars").size() + + expect: + first == 1 + second == 0 + } +} diff --git a/src/test/groovy/io/elastic/jdbc/actions/DeleteActionOracleSpec.groovy b/src/test/groovy/io/elastic/jdbc/actions/DeleteActionOracleSpec.groovy new file mode 100644 index 0000000..9bfe4a1 --- /dev/null +++ b/src/test/groovy/io/elastic/jdbc/actions/DeleteActionOracleSpec.groovy @@ -0,0 +1,153 @@ +package io.elastic.jdbc.actions + +import io.elastic.api.EventEmitter +import io.elastic.api.ExecutionParameters +import io.elastic.api.Message +import spock.lang.Shared +import spock.lang.Specification + +import javax.json.Json +import javax.json.JsonObject +import java.sql.Connection +import java.sql.DriverManager +import java.sql.ResultSet + +//@Ignore +class DeleteActionOracleSpec extends Specification { + + @Shared + def user = "elasticio"//System.getenv("CONN_USER_ORACLE") + @Shared + def password = "PeU13cbKtH"//System.getenv("CONN_PASSWORD_ORACLE") + @Shared + def databaseName = "elasticio_testdb"//System.getenv("CONN_DBNAME_ORACLE") + @Shared + def host = "ec2-18-194-228-22.eu-central-1.compute.amazonaws.com" +//System.getenv("CONN_HOST_ORACLE") + @Shared + def port = "1521"//System.getenv("CONN_PORT_ORACLE") + @Shared + def dbEngine = "oracle"//System.getenv("CONN_DBENGINE_ORACLE") + @Shared + def connectionString = "jdbc:oracle:thin:@//" + host + ":" + port + "/XE" + @Shared + Connection connection + + @Shared + EventEmitter.Callback errorCallback + @Shared + EventEmitter.Callback snapshotCallback + @Shared + EventEmitter.Callback dataCallback + @Shared + EventEmitter.Callback reboundCallback + @Shared + EventEmitter.Callback httpReplyCallback + @Shared + EventEmitter emitter + @Shared + DeleteRowByPrimaryKey action + + def setupSpec() { + connection = DriverManager.getConnection(connectionString, user, password) + } + + def setup() { + createAction() + } + + def createAction() { + errorCallback = Mock(EventEmitter.Callback) + snapshotCallback = Mock(EventEmitter.Callback) + dataCallback = Mock(EventEmitter.Callback) + reboundCallback = Mock(EventEmitter.Callback) + httpReplyCallback = Mock(EventEmitter.Callback) + emitter = new EventEmitter.Builder().onData(dataCallback).onSnapshot(snapshotCallback).onError(errorCallback) + .onRebound(reboundCallback).onHttpReplyCallback(httpReplyCallback).build() + action = new DeleteRowByPrimaryKey() + } + + def runAction(JsonObject config, JsonObject body, JsonObject snapshot) { + Message msg = new Message.Builder().body(body).build() + ExecutionParameters params = new ExecutionParameters(msg, emitter, config, snapshot) + action.execute(params); + } + + def getStarsConfig() { + JsonObject config = Json.createObjectBuilder() + .add("tableName", "STARS") + .add("user", user) + .add("password", password) + .add("dbEngine", "oracle") + .add("host", host) + .add("port", port) + .add("databaseName", databaseName) + .add("nullableResult", "true") + .build(); + return config; + } + + def prepareStarsTable() { + String sql = "BEGIN" + + " EXECUTE IMMEDIATE 'DROP TABLE stars';" + + "EXCEPTION" + + " WHEN OTHERS THEN" + + " IF SQLCODE != -942 THEN" + + " RAISE;" + + " END IF;" + + "END;" + connection.createStatement().execute(sql); + connection.createStatement().execute("CREATE TABLE stars (id number, name varchar(255) NOT NULL, " + + "radius number, destination float,visible number(1), " + + "CONSTRAINT pk_stars PRIMARY KEY (id))"); + connection.createStatement().execute("INSERT INTO stars (ID,NAME,RADIUS,DESTINATION, VISIBLE) VALUES (1,'Taurus',321,44.4,1)") + connection.createStatement().execute("INSERT INTO stars (ID,NAME,RADIUS,DESTINATION, VISIBLE) VALUES (2,'Boston',581,94.4,0)") + } + + def getRecords(tableName) { + ArrayList records = new ArrayList(); + String sql = "SELECT * FROM " + tableName; + ResultSet rs = connection.createStatement().executeQuery(sql); + while (rs.next()) { + records.add(rs.toRowResult().toString()); + } + rs.close(); + return records; + } + + def cleanupSpec() { + String sql = "BEGIN" + + " EXECUTE IMMEDIATE 'DROP TABLE stars';" + + "EXCEPTION" + + " WHEN OTHERS THEN" + + " IF SQLCODE != -942 THEN" + + " RAISE;" + + " END IF;" + + "END;" + connection.createStatement().execute(sql) + connection.close() + } + + def "one delete"() { + + prepareStarsTable(); + + JsonObject snapshot = Json.createObjectBuilder().build() + + JsonObject body = Json.createObjectBuilder() + .add("ID", 1) + .build(); + + runAction(getStarsConfig(), body, snapshot) + int first = getRecords("stars").size() + JsonObject body2 = Json.createObjectBuilder() + .add("ID", 2) + .build() + runAction(getStarsConfig(), body2, snapshot) + int second = getRecords("stars").size() + + expect: + first == 1 + second == 0 + } +} diff --git a/src/test/groovy/io/elastic/jdbc/actions/DeleteActionPostrgeSpec.groovy b/src/test/groovy/io/elastic/jdbc/actions/DeleteActionPostrgeSpec.groovy new file mode 100644 index 0000000..448f4ea --- /dev/null +++ b/src/test/groovy/io/elastic/jdbc/actions/DeleteActionPostrgeSpec.groovy @@ -0,0 +1,143 @@ +package io.elastic.jdbc.actions + +import io.elastic.api.EventEmitter +import io.elastic.api.ExecutionParameters +import io.elastic.api.Message +import spock.lang.Shared +import spock.lang.Specification + +import javax.json.Json +import javax.json.JsonObject +import java.sql.Connection +import java.sql.DriverManager +import java.sql.ResultSet + +//@Ignore +class DeleteActionPostrgeSpec extends Specification { + + @Shared + def user = "elasticio"//System.getenv("CONN_USER_ORACLE") + @Shared + def password = "2uDyG4hHxR"//System.getenv("CONN_PASSWORD_ORACLE") + @Shared + def databaseName = "elasticio_testdb"//System.getenv("CONN_DBNAME_ORACLE") + @Shared + def host = "ec2-18-194-228-22.eu-central-1.compute.amazonaws.com" +//System.getenv("CONN_HOST_ORACLE") + @Shared + def port = "5432"//System.getenv("CONN_PORT_ORACLE") + @Shared + def dbEngine = "postgresql" + @Shared + def connectionString = "jdbc:postgresql://" + host + ":" + port + "/" + databaseName + @Shared + Connection connection + + @Shared + EventEmitter.Callback errorCallback + @Shared + EventEmitter.Callback snapshotCallback + @Shared + EventEmitter.Callback dataCallback + @Shared + EventEmitter.Callback reboundCallback + @Shared + EventEmitter.Callback httpReplyCallback + @Shared + EventEmitter emitter + @Shared + DeleteRowByPrimaryKey action + + def setupSpec() { + connection = DriverManager.getConnection(connectionString, user, password) + } + + def setup() { + createAction() + } + + def createAction() { + errorCallback = Mock(EventEmitter.Callback) + snapshotCallback = Mock(EventEmitter.Callback) + dataCallback = Mock(EventEmitter.Callback) + reboundCallback = Mock(EventEmitter.Callback) + httpReplyCallback = Mock(EventEmitter.Callback) + emitter = new EventEmitter.Builder().onData(dataCallback).onSnapshot(snapshotCallback).onError(errorCallback) + .onRebound(reboundCallback).onHttpReplyCallback(httpReplyCallback).build() + action = new DeleteRowByPrimaryKey() + } + + def runAction(JsonObject config, JsonObject body, JsonObject snapshot) { + Message msg = new Message.Builder().body(body).build() + ExecutionParameters params = new ExecutionParameters(msg, emitter, config, snapshot) + action.execute(params); + } + + def getStarsConfig() { + JsonObject config = Json.createObjectBuilder() + .add("tableName", "stars") + .add("user", user) + .add("password", password) + .add("dbEngine", "postgresql") + .add("host", host) + .add("port", port) + .add("databaseName", databaseName) + .add("nullableResult", "true") + .build(); + return config; + } + + def prepareStarsTable() { + String sql = "DROP TABLE IF EXISTS stars;" + connection.createStatement().execute(sql); + connection.createStatement().execute("CREATE TABLE stars (id int, name varchar(255) NOT NULL, " + + "date timestamp, radius int, destination int, visible boolean, visibledate date, PRIMARY KEY(id))"); + connection.createStatement().execute("INSERT INTO stars values (1,'Taurus', '2015-02-19 10:10:10.0'," + + " 123, 5, 'true', '2015-02-19')") + connection.createStatement().execute("INSERT INTO stars values (2,'Eridanus', '2017-02-19 10:10:10.0'," + + " 852, 5, 'false', '2015-07-19')") + } + + def getRecords(tableName) { + ArrayList records = new ArrayList(); + String sql = "SELECT * FROM " + tableName; + ResultSet rs = connection.createStatement().executeQuery(sql); + while (rs.next()) { + records.add(rs.toRowResult().toString()); + } + rs.close(); + return records; + } + + def cleanupSpec() { + String sql = "DROP TABLE IF EXISTS persons;" + + connection.createStatement().execute(sql) + sql = "DROP TABLE IF EXISTS stars;" + connection.createStatement().execute(sql) + connection.close() + } + + def "one delete"() { + + prepareStarsTable(); + + JsonObject snapshot = Json.createObjectBuilder().build() + + JsonObject body = Json.createObjectBuilder() + .add("id", 1) + .build(); + + runAction(getStarsConfig(), body, snapshot) + int first = getRecords("stars").size() + JsonObject body2 = Json.createObjectBuilder() + .add("id", 2) + .build() + runAction(getStarsConfig(), body2, snapshot) + int second = getRecords("stars").size() + + expect: + first == 1 + second == 0 + } +} From 3117fd9598d51263a6751b29e7df993e2d009010 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Mon, 3 Sep 2018 16:14:47 +0300 Subject: [PATCH 47/56] Updated method "executeUpsert" --- .../io/elastic/jdbc/QueryBuilders/MSSQL.java | 63 ++++++++----------- .../io/elastic/jdbc/QueryBuilders/MySQL.java | 14 +---- .../{ => delete}/DeleteActionMSSQLSpec.groovy | 3 +- .../{ => delete}/DeleteActionMySQLSpec.groovy | 3 +- .../DeleteActionOracleSpec.groovy | 3 +- .../DeleteActionPostrgeSpec.groovy | 3 +- .../UpsertRowByPrimaryKeyMSSQLSpec.groovy | 15 ++--- .../UpsertRowByPrimaryKeyMySQLSpec.groovy | 3 +- .../UpsertRowByPrimaryKeyOracleSpec.groovy | 3 +- .../UpsertRowByPrimaryKeyPostgreSpec.groovy | 3 +- 10 files changed, 51 insertions(+), 62 deletions(-) rename src/test/groovy/io/elastic/jdbc/actions/{ => delete}/DeleteActionMSSQLSpec.groovy (97%) rename src/test/groovy/io/elastic/jdbc/actions/{ => delete}/DeleteActionMySQLSpec.groovy (97%) rename src/test/groovy/io/elastic/jdbc/actions/{ => delete}/DeleteActionOracleSpec.groovy (98%) rename src/test/groovy/io/elastic/jdbc/actions/{ => delete}/DeleteActionPostrgeSpec.groovy (97%) rename src/test/groovy/io/elastic/jdbc/actions/{ => upsert}/UpsertRowByPrimaryKeyMSSQLSpec.groovy (94%) rename src/test/groovy/io/elastic/jdbc/actions/{ => upsert}/UpsertRowByPrimaryKeyMySQLSpec.groovy (98%) rename src/test/groovy/io/elastic/jdbc/actions/{ => upsert}/UpsertRowByPrimaryKeyOracleSpec.groovy (98%) rename src/test/groovy/io/elastic/jdbc/actions/{ => upsert}/UpsertRowByPrimaryKeyPostgreSpec.groovy (98%) diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java index b251eff..09f3bba 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java @@ -132,6 +132,30 @@ public void executeInsert(Connection connection, String tableName, JsonObject bo } } + public void executeUpdate(Connection connection, String tableName, String idColumn, + String idValue, JsonObject body) throws SQLException { + validateQuery(); + StringBuilder setString = new StringBuilder(); + for (Map.Entry entry : body.entrySet()) { + if (setString.length() > 0) { + setString.append(","); + } + setString.append(entry.getKey()).append(" = ?"); + } + String sql = "UPDATE " + tableName + + " SET " + setString.toString() + + " WHERE " + idColumn + " = ?"; + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + int i = 1; + for (Map.Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, i, entry.getKey(), body); + i++; + } + Utils.setStatementParam(stmt, i, idColumn, body); + stmt.execute(); + } + } + public void executeUpsert(Connection connection, String idColumn, JsonObject body) throws SQLException { validateQuery(); @@ -163,55 +187,20 @@ public void executeUpsert(Connection connection, String idColumn, JsonObject bod " (" + keys.toString() + ")" + " VALUES (" + values.toString() + ")" + " COMMIT;"; - PreparedStatement stmt = null; - try { - stmt = connection.prepareStatement(sql); + try (PreparedStatement stmt = connection.prepareStatement(sql)) { Utils.setStatementParam(stmt, 1, idColumn, body); int i = 2; for (Map.Entry entry : body.entrySet()) { Utils.setStatementParam(stmt, i, entry.getKey(), body); i++; } - Utils.setStatementParam(stmt, i, idColumn, body); - i++; + Utils.setStatementParam(stmt, i++, idColumn, body); for (Map.Entry entry : body.entrySet()) { Utils.setStatementParam(stmt, i, entry.getKey(), body); i++; } stmt.execute(); - } finally { - if (stmt != null) { - stmt.close(); - } } } - public void executeUpdate(Connection connection, String tableName, String idColumn, - String idValue, JsonObject body) throws SQLException { - validateQuery(); - StringBuilder setString = new StringBuilder(); - for (Map.Entry entry : body.entrySet()) { - if (setString.length() > 0) { - setString.append(","); - } - setString.append(entry.getKey()).append(" = ?"); - } - String sql = "UPDATE " + tableName + - " SET " + setString.toString() + - " WHERE " + idColumn + " = ?"; - PreparedStatement stmt = connection.prepareStatement(sql); - try { - int i = 1; - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - i++; - } - Utils.setStatementParam(stmt, i, idColumn, body); - stmt.execute(); - } finally { - if (stmt != null) { - stmt.close(); - } - } - } } diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java index 8631672..61552fd 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java @@ -161,23 +161,15 @@ public void executeUpsert(Connection connection, String idColumn, JsonObject bod " (" + keys.toString() + ")" + " VALUES (" + values.toString() + ")" + " ON DUPLICATE KEY UPDATE " + setString + ";"; - PreparedStatement stmt = null; - try { - stmt = connection.prepareStatement(sql); + try (PreparedStatement stmt = connection.prepareStatement(sql)){ int i = 1; + int countBodyEntry = body.size(); for (Map.Entry entry : body.entrySet()) { Utils.setStatementParam(stmt, i, entry.getKey(), body); - i++; - } - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); + Utils.setStatementParam(stmt, i + countBodyEntry, entry.getKey(), body); i++; } stmt.execute(); - } finally { - if (stmt != null) { - stmt.close(); - } } } diff --git a/src/test/groovy/io/elastic/jdbc/actions/DeleteActionMSSQLSpec.groovy b/src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionMSSQLSpec.groovy similarity index 97% rename from src/test/groovy/io/elastic/jdbc/actions/DeleteActionMSSQLSpec.groovy rename to src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionMSSQLSpec.groovy index 219fb84..16c48c6 100644 --- a/src/test/groovy/io/elastic/jdbc/actions/DeleteActionMSSQLSpec.groovy +++ b/src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionMSSQLSpec.groovy @@ -1,8 +1,9 @@ -package io.elastic.jdbc.actions +package io.elastic.jdbc.actions.delete import io.elastic.api.EventEmitter import io.elastic.api.ExecutionParameters import io.elastic.api.Message +import io.elastic.jdbc.actions.DeleteRowByPrimaryKey import spock.lang.Shared import spock.lang.Specification diff --git a/src/test/groovy/io/elastic/jdbc/actions/DeleteActionMySQLSpec.groovy b/src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionMySQLSpec.groovy similarity index 97% rename from src/test/groovy/io/elastic/jdbc/actions/DeleteActionMySQLSpec.groovy rename to src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionMySQLSpec.groovy index 69e71a2..dee6798 100644 --- a/src/test/groovy/io/elastic/jdbc/actions/DeleteActionMySQLSpec.groovy +++ b/src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionMySQLSpec.groovy @@ -1,8 +1,9 @@ -package io.elastic.jdbc.actions +package io.elastic.jdbc.actions.delete import io.elastic.api.EventEmitter import io.elastic.api.ExecutionParameters import io.elastic.api.Message +import io.elastic.jdbc.actions.DeleteRowByPrimaryKey import spock.lang.Shared import spock.lang.Specification diff --git a/src/test/groovy/io/elastic/jdbc/actions/DeleteActionOracleSpec.groovy b/src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionOracleSpec.groovy similarity index 98% rename from src/test/groovy/io/elastic/jdbc/actions/DeleteActionOracleSpec.groovy rename to src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionOracleSpec.groovy index 9bfe4a1..ff34392 100644 --- a/src/test/groovy/io/elastic/jdbc/actions/DeleteActionOracleSpec.groovy +++ b/src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionOracleSpec.groovy @@ -1,8 +1,9 @@ -package io.elastic.jdbc.actions +package io.elastic.jdbc.actions.delete import io.elastic.api.EventEmitter import io.elastic.api.ExecutionParameters import io.elastic.api.Message +import io.elastic.jdbc.actions.DeleteRowByPrimaryKey import spock.lang.Shared import spock.lang.Specification diff --git a/src/test/groovy/io/elastic/jdbc/actions/DeleteActionPostrgeSpec.groovy b/src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionPostrgeSpec.groovy similarity index 97% rename from src/test/groovy/io/elastic/jdbc/actions/DeleteActionPostrgeSpec.groovy rename to src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionPostrgeSpec.groovy index 448f4ea..b9c2c3f 100644 --- a/src/test/groovy/io/elastic/jdbc/actions/DeleteActionPostrgeSpec.groovy +++ b/src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionPostrgeSpec.groovy @@ -1,8 +1,9 @@ -package io.elastic.jdbc.actions +package io.elastic.jdbc.actions.delete import io.elastic.api.EventEmitter import io.elastic.api.ExecutionParameters import io.elastic.api.Message +import io.elastic.jdbc.actions.DeleteRowByPrimaryKey import spock.lang.Shared import spock.lang.Specification diff --git a/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyMSSQLSpec.groovy b/src/test/groovy/io/elastic/jdbc/actions/upsert/UpsertRowByPrimaryKeyMSSQLSpec.groovy similarity index 94% rename from src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyMSSQLSpec.groovy rename to src/test/groovy/io/elastic/jdbc/actions/upsert/UpsertRowByPrimaryKeyMSSQLSpec.groovy index bdc1ad0..6967de5 100644 --- a/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyMSSQLSpec.groovy +++ b/src/test/groovy/io/elastic/jdbc/actions/upsert/UpsertRowByPrimaryKeyMSSQLSpec.groovy @@ -1,8 +1,9 @@ -package io.elastic.jdbc.actions +package io.elastic.jdbc.actions.upsert import io.elastic.api.EventEmitter import io.elastic.api.ExecutionParameters import io.elastic.api.Message +import io.elastic.jdbc.actions.UpsertRowByPrimaryKey import spock.lang.* import javax.json.Json @@ -11,19 +12,19 @@ import java.sql.Connection import java.sql.DriverManager import java.sql.ResultSet -@Ignore +//@Ignore class UpsertRowByPrimaryKeyMSSQLSpec extends Specification { @Shared - def user = System.getenv("CONN_USER_MSSQL") + def user = "john"//System.getenv("CONN_USER_MSSQL") @Shared - def password = System.getenv("CONN_PASSWORD_MSSQL") + def password = "elastic123"//System.getenv("CONN_PASSWORD_MSSQL") @Shared - def databaseName = System.getenv("CONN_DBNAME_MSSQL") + def databaseName = "Test2"//System.getenv("CONN_DBNAME_MSSQL") @Shared - def host = System.getenv("CONN_HOST_MSSQL") + def host = "eio-mssql-fra.c79g081qpeyv.eu-central-1.rds.amazonaws.com"//System.getenv("CONN_HOST_MSSQL") @Shared - def port = System.getenv("CONN_PORT_MSSQL") + def port = "1433"//System.getenv("CONN_PORT_MSSQL") @Shared def connectionString ="jdbc:sqlserver://" + host + ":" + port + ";database=" + databaseName @Shared diff --git a/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyMySQLSpec.groovy b/src/test/groovy/io/elastic/jdbc/actions/upsert/UpsertRowByPrimaryKeyMySQLSpec.groovy similarity index 98% rename from src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyMySQLSpec.groovy rename to src/test/groovy/io/elastic/jdbc/actions/upsert/UpsertRowByPrimaryKeyMySQLSpec.groovy index 9c570b5..115b3f0 100644 --- a/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyMySQLSpec.groovy +++ b/src/test/groovy/io/elastic/jdbc/actions/upsert/UpsertRowByPrimaryKeyMySQLSpec.groovy @@ -1,8 +1,9 @@ -package io.elastic.jdbc.actions +package io.elastic.jdbc.actions.upsert import io.elastic.api.EventEmitter import io.elastic.api.ExecutionParameters import io.elastic.api.Message +import io.elastic.jdbc.actions.UpsertRowByPrimaryKey import spock.lang.Ignore import spock.lang.Shared import spock.lang.Specification diff --git a/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyOracleSpec.groovy b/src/test/groovy/io/elastic/jdbc/actions/upsert/UpsertRowByPrimaryKeyOracleSpec.groovy similarity index 98% rename from src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyOracleSpec.groovy rename to src/test/groovy/io/elastic/jdbc/actions/upsert/UpsertRowByPrimaryKeyOracleSpec.groovy index 19b0156..182113a 100644 --- a/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyOracleSpec.groovy +++ b/src/test/groovy/io/elastic/jdbc/actions/upsert/UpsertRowByPrimaryKeyOracleSpec.groovy @@ -1,8 +1,9 @@ -package io.elastic.jdbc.actions +package io.elastic.jdbc.actions.upsert import io.elastic.api.EventEmitter import io.elastic.api.ExecutionParameters import io.elastic.api.Message +import io.elastic.jdbc.actions.UpsertRowByPrimaryKey import spock.lang.Ignore import spock.lang.Shared import spock.lang.Specification diff --git a/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyPostgreSpec.groovy b/src/test/groovy/io/elastic/jdbc/actions/upsert/UpsertRowByPrimaryKeyPostgreSpec.groovy similarity index 98% rename from src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyPostgreSpec.groovy rename to src/test/groovy/io/elastic/jdbc/actions/upsert/UpsertRowByPrimaryKeyPostgreSpec.groovy index 486fa04..829be62 100644 --- a/src/test/groovy/io/elastic/jdbc/actions/UpsertRowByPrimaryKeyPostgreSpec.groovy +++ b/src/test/groovy/io/elastic/jdbc/actions/upsert/UpsertRowByPrimaryKeyPostgreSpec.groovy @@ -1,8 +1,9 @@ -package io.elastic.jdbc.actions +package io.elastic.jdbc.actions.upsert import io.elastic.api.EventEmitter import io.elastic.api.ExecutionParameters import io.elastic.api.Message +import io.elastic.jdbc.actions.UpsertRowByPrimaryKey import spock.lang.Ignore import spock.lang.Shared import spock.lang.Specification From cb4d2e114bda8ee6d52dc6b895c6afc4c4a3f465 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Mon, 3 Sep 2018 16:48:38 +0300 Subject: [PATCH 48/56] Updated method "executeRecordExists" --- .../java/io/elastic/jdbc/QueryBuilders/MSSQL.java | 12 +----------- .../java/io/elastic/jdbc/QueryBuilders/MySQL.java | 6 +----- .../java/io/elastic/jdbc/QueryBuilders/Oracle.java | 6 +----- .../io/elastic/jdbc/QueryBuilders/PostgreSQL.java | 6 +----- src/main/java/io/elastic/jdbc/Utils.java | 10 ++++++++++ 5 files changed, 14 insertions(+), 26 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java index 09f3bba..89d7126 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java @@ -86,17 +86,7 @@ public boolean executeRecordExists(Connection connection, JsonObject body) throw String sql = "SELECT COUNT(*)" + " FROM " + tableName + " WHERE " + lookupField + " = ?"; - PreparedStatement stmt = connection.prepareStatement(sql); - try { - Utils.setStatementParam(stmt, 1, lookupField, body); - ResultSet rs = stmt.executeQuery(); - rs.next(); - return rs.getInt(1) > 0; - } finally { - if (stmt != null) { - stmt.close(); - } - } + return Utils.isRecordExists(connection, body, sql, lookupField); } public void executeInsert(Connection connection, String tableName, JsonObject body) diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java index 61552fd..ce48c3f 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java @@ -80,11 +80,7 @@ public boolean executeRecordExists(Connection connection, JsonObject body) throw String sql = "SELECT COUNT(*)" + " FROM " + tableName + " WHERE " + lookupField + " = ?"; - PreparedStatement stmt = connection.prepareStatement(sql); - Utils.setStatementParam(stmt, 1, lookupField, body); - ResultSet rs = stmt.executeQuery(); - rs.next(); - return rs.getInt(1) > 0; + return Utils.isRecordExists(connection, body, sql, lookupField); } public void executeInsert(Connection connection, String tableName, JsonObject body) diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java index 6cac845..a950e7f 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java @@ -73,11 +73,7 @@ public boolean executeRecordExists(Connection connection, JsonObject body) throw String sql = "SELECT COUNT(*)" + " FROM " + tableName + " WHERE " + lookupField + " = ?"; - PreparedStatement stmt = connection.prepareStatement(sql); - Utils.setStatementParam(stmt, 1, lookupField, body); - ResultSet rs = stmt.executeQuery(); - rs.next(); - return rs.getInt(1) > 0; + return Utils.isRecordExists(connection, body, sql, lookupField); } public void executeInsert(Connection connection, String tableName, JsonObject body) diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java index 51d2d7d..7ede2ad 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java @@ -88,11 +88,7 @@ public boolean executeRecordExists(Connection connection, JsonObject body) throw String sql = "SELECT COUNT(*)" + " FROM " + tableName + " WHERE " + lookupField + " = ?"; - PreparedStatement stmt = connection.prepareStatement(sql); - Utils.setStatementParam(stmt, 1, lookupField, body); - ResultSet rs = stmt.executeQuery(); - rs.next(); - return rs.getInt(1) > 0; + return Utils.isRecordExists(connection, body, sql, lookupField); } public void executeInsert(Connection connection, String tableName, JsonObject body) diff --git a/src/main/java/io/elastic/jdbc/Utils.java b/src/main/java/io/elastic/jdbc/Utils.java index 6b78f22..b9e313e 100644 --- a/src/main/java/io/elastic/jdbc/Utils.java +++ b/src/main/java/io/elastic/jdbc/Utils.java @@ -329,4 +329,14 @@ public static JsonObject getLookupRow(Connection connection, JsonObject body, St } } + public static boolean isRecordExists (Connection connection, JsonObject body, String sql, String lookupField) throws SQLException{ + try (PreparedStatement stmt = connection.prepareStatement(sql)){ + Utils.setStatementParam(stmt, 1, lookupField, body); + try (ResultSet rs = stmt.executeQuery()) { + rs.next(); + return rs.getInt(1) > 0; + } + } + } + } From 12c111be8f1b3a3644126ac37a7407367ba0e13a Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Mon, 3 Sep 2018 17:47:22 +0300 Subject: [PATCH 49/56] Updated method "executeSelectQueryNew" --- .../io/elastic/jdbc/QueryBuilders/MSSQL.java | 33 +++++++++-- .../io/elastic/jdbc/QueryBuilders/MySQL.java | 58 ++++++++++++++----- .../io/elastic/jdbc/QueryBuilders/Oracle.java | 55 +++++++++++++----- .../jdbc/QueryBuilders/PostgreSQL.java | 55 +++++++++++++----- .../io/elastic/jdbc/QueryBuilders/Query.java | 4 ++ 5 files changed, 159 insertions(+), 46 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java index 89d7126..53f76ad 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java @@ -4,10 +4,14 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; +import java.sql.ResultSetMetaData; import java.sql.SQLException; +import java.util.ArrayList; import java.util.Map; import java.util.Map.Entry; +import javax.json.Json; import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; import javax.json.JsonValue; public class MSSQL extends Query { @@ -23,6 +27,28 @@ public ResultSet executeSelectQuery(Connection connection, String sqlQuery, Json return stmt.executeQuery(); } + public ArrayList executeSelectQueryNew(Connection connection, String sqlQuery, JsonObject body) + throws SQLException { + try (PreparedStatement stmt = connection.prepareStatement(sqlQuery)) { + int i = 1; + for (Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, i, entry.getKey(), body); + i++; + } + try (ResultSet rs = stmt.executeQuery()) { + JsonObjectBuilder row = Json.createObjectBuilder(); + ArrayList listResult= new ArrayList(); + ResultSetMetaData metaData = rs.getMetaData(); + while (rs.next()) { + for (i = 1; i <= metaData.getColumnCount(); i++) { + row = Utils.getColumnDataByType(rs, metaData, i, row); + } + listResult.add(row.build()); + } + return listResult; + } + } + } public ResultSet executeSelectTrigger(Connection connection, String sqlQuery) throws SQLException { PreparedStatement stmt = connection.prepareStatement(sqlQuery); @@ -107,18 +133,13 @@ public void executeInsert(Connection connection, String tableName, JsonObject bo String sql = "INSERT INTO " + tableName + " (" + keys.toString() + ")" + " VALUES (" + values.toString() + ")"; - PreparedStatement stmt = connection.prepareStatement(sql); - try { + try (PreparedStatement stmt = connection.prepareStatement(sql)) { int i = 1; for (Map.Entry entry : body.entrySet()) { Utils.setStatementParam(stmt, i, entry.getKey(), body); i++; } stmt.execute(); - } finally { - if (stmt != null) { - stmt.close(); - } } } diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java index ce48c3f..6c3548d 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java @@ -4,10 +4,14 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; +import java.sql.ResultSetMetaData; import java.sql.SQLException; +import java.util.ArrayList; import java.util.Map; import java.util.Map.Entry; +import javax.json.Json; import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; import javax.json.JsonValue; public class MySQL extends Query { @@ -24,6 +28,30 @@ public ResultSet executeSelectQuery(Connection connection, String sqlQuery, Json return stmt.executeQuery(); } + public ArrayList executeSelectQueryNew(Connection connection, String sqlQuery, JsonObject body) + throws SQLException { + StringBuilder sql = new StringBuilder(sqlQuery); + try (PreparedStatement stmt = connection.prepareStatement(sql.toString())) { + int i = 1; + for (Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, i, entry.getKey(), (entry.getValue() != null) ? body : null); + i++; + } + try (ResultSet rs = stmt.executeQuery()) { + JsonObjectBuilder row = Json.createObjectBuilder(); + ArrayList listResult= new ArrayList(); + ResultSetMetaData metaData = rs.getMetaData(); + while (rs.next()) { + for (i = 1; i <= metaData.getColumnCount(); i++) { + row = Utils.getColumnDataByType(rs, metaData, i, row); + } + listResult.add(row.build()); + } + return listResult; + } + } + } + public ResultSet executeSelectTrigger(Connection connection, String sqlQuery) throws SQLException { StringBuilder sql = new StringBuilder(sqlQuery); @@ -101,13 +129,14 @@ public void executeInsert(Connection connection, String tableName, JsonObject bo String sql = "INSERT INTO " + tableName + " (" + keys.toString() + ")" + " VALUES (" + values.toString() + ")"; - PreparedStatement stmt = connection.prepareStatement(sql); - int i = 1; - for (String key : body.keySet()) { - Utils.setStatementParam(stmt, i, key, body); - i++; + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + int i = 1; + for (String key : body.keySet()) { + Utils.setStatementParam(stmt, i, key, body); + i++; + } + stmt.execute(); } - stmt.execute(); } public void executeUpdate(Connection connection, String tableName, String idColumn, @@ -123,14 +152,15 @@ public void executeUpdate(Connection connection, String tableName, String idColu String sql = "UPDATE " + tableName + " SET " + setString.toString() + " WHERE " + idColumn + " = ?"; - PreparedStatement stmt = connection.prepareStatement(sql); - int i = 1; - for (String key : body.keySet()) { - Utils.setStatementParam(stmt, i, key, body); - i++; + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + int i = 1; + for (String key : body.keySet()) { + Utils.setStatementParam(stmt, i, key, body); + i++; + } + Utils.setStatementParam(stmt, i, idColumn, body); + stmt.execute(); } - Utils.setStatementParam(stmt, i, idColumn, body); - stmt.execute(); } public void executeUpsert(Connection connection, String idColumn, JsonObject body) @@ -157,7 +187,7 @@ public void executeUpsert(Connection connection, String idColumn, JsonObject bod " (" + keys.toString() + ")" + " VALUES (" + values.toString() + ")" + " ON DUPLICATE KEY UPDATE " + setString + ";"; - try (PreparedStatement stmt = connection.prepareStatement(sql)){ + try (PreparedStatement stmt = connection.prepareStatement(sql)) { int i = 1; int countBodyEntry = body.size(); for (Map.Entry entry : body.entrySet()) { diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java index a950e7f..81e259a 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java @@ -4,10 +4,14 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; +import java.sql.ResultSetMetaData; import java.sql.SQLException; +import java.util.ArrayList; import java.util.Map; import java.util.Map.Entry; +import javax.json.Json; import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; import javax.json.JsonValue; public class Oracle extends Query { @@ -23,6 +27,29 @@ public ResultSet executeSelectQuery(Connection connection, String sqlQuery, Json return stmt.executeQuery(); } + public ArrayList executeSelectQueryNew(Connection connection, String sqlQuery, JsonObject body) + throws SQLException { + try (PreparedStatement stmt = connection.prepareStatement(sqlQuery)) { + int i = 1; + for (Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, i, entry.getKey(), body); + i++; + } + try (ResultSet rs = stmt.executeQuery()) { + JsonObjectBuilder row = Json.createObjectBuilder(); + ArrayList listResult= new ArrayList(); + ResultSetMetaData metaData = rs.getMetaData(); + while (rs.next()) { + for (i = 1; i <= metaData.getColumnCount(); i++) { + row = Utils.getColumnDataByType(rs, metaData, i, row); + } + listResult.add(row.build()); + } + return listResult; + } + } + } + public ResultSet executeSelectTrigger(Connection connection, String sqlQuery) throws SQLException { PreparedStatement stmt = connection.prepareStatement(sqlQuery); @@ -94,13 +121,14 @@ public void executeInsert(Connection connection, String tableName, JsonObject bo String sql = "INSERT INTO " + tableName + " (" + keys.toString() + ")" + " VALUES (" + values.toString() + ")"; - PreparedStatement stmt = connection.prepareStatement(sql); - int i = 1; - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - i++; + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + int i = 1; + for (Map.Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, i, entry.getKey(), body); + i++; + } + stmt.execute(); } - stmt.execute(); } public void executeUpdate(Connection connection, String tableName, String idColumn, @@ -116,14 +144,15 @@ public void executeUpdate(Connection connection, String tableName, String idColu String sql = "UPDATE " + tableName + " SET " + setString.toString() + " WHERE " + idColumn + " = ?"; - PreparedStatement stmt = connection.prepareStatement(sql); - int i = 1; - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - i++; + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + int i = 1; + for (Map.Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, i, entry.getKey(), body); + i++; + } + Utils.setStatementParam(stmt, i, idColumn, body); + stmt.execute(); } - Utils.setStatementParam(stmt, i, idColumn, body); - stmt.execute(); } public void executeUpsert(Connection connection, String idColumn, JsonObject body) diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java index 7ede2ad..f0a5377 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java @@ -4,10 +4,14 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; +import java.sql.ResultSetMetaData; import java.sql.SQLException; +import java.util.ArrayList; import java.util.Map; import java.util.Map.Entry; +import javax.json.Json; import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; import javax.json.JsonValue; public class PostgreSQL extends Query { @@ -23,6 +27,29 @@ public ResultSet executeSelectQuery(Connection connection, String sqlQuery, Json return stmt.executeQuery(); } + public ArrayList executeSelectQueryNew(Connection connection, String sqlQuery, JsonObject body) + throws SQLException { + try (PreparedStatement stmt = connection.prepareStatement(sqlQuery)) { + int i = 1; + for (Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, i, entry.getKey(), body); + i++; + } + try (ResultSet rs = stmt.executeQuery()) { + JsonObjectBuilder row = Json.createObjectBuilder(); + ArrayList listResult= new ArrayList(); + ResultSetMetaData metaData = rs.getMetaData(); + while (rs.next()) { + for (i = 1; i <= metaData.getColumnCount(); i++) { + row = Utils.getColumnDataByType(rs, metaData, i, row); + } + listResult.add(row.build()); + } + return listResult; + } + } + } + public ResultSet executeSelectTrigger(Connection connection, String sqlQuery) throws SQLException { PreparedStatement stmt = connection.prepareStatement(sqlQuery); @@ -109,13 +136,14 @@ public void executeInsert(Connection connection, String tableName, JsonObject bo String sql = "INSERT INTO " + tableName + " (" + keys.toString() + ")" + " VALUES (" + values.toString() + ")"; - PreparedStatement stmt = connection.prepareStatement(sql); - int i = 1; - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - i++; + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + int i = 1; + for (Map.Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, i, entry.getKey(), body); + i++; + } + stmt.execute(); } - stmt.execute(); } public void executeUpdate(Connection connection, String tableName, String idColumn, @@ -131,14 +159,15 @@ public void executeUpdate(Connection connection, String tableName, String idColu String sql = "UPDATE " + tableName + " SET " + setString.toString() + " WHERE " + idColumn + " = ?"; - PreparedStatement stmt = connection.prepareStatement(sql); - int i = 1; - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - i++; + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + int i = 1; + for (Map.Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, i, entry.getKey(), body); + i++; + } + Utils.setStatementParam(stmt, i, idColumn, body); + stmt.execute(); } - Utils.setStatementParam(stmt, i, idColumn, body); - stmt.execute(); } public void executeUpsert(Connection connection, String idColumn, JsonObject body) diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java b/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java index 76cd466..12a5853 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java @@ -5,6 +5,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; +import java.util.ArrayList; import javax.json.JsonObject; public abstract class Query { @@ -85,6 +86,9 @@ abstract public void executeUpsert(Connection connection, String idColumn, abstract public ResultSet executeSelectQuery(Connection connection, String sqlQuery, JsonObject body) throws SQLException; + abstract public ArrayList executeSelectQueryNew(Connection connection, String sqlQuery, + JsonObject body) throws SQLException; + abstract public ResultSet executeSelectTrigger(Connection connection, String sqlQuery) throws SQLException; From d0bf765211e60090f506ef62dc89801d62640080 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Tue, 4 Sep 2018 12:51:58 +0300 Subject: [PATCH 50/56] Updated method "executeSelectQuery", method has returned ArrayList --- .../io/elastic/jdbc/QueryBuilders/MSSQL.java | 13 +----- .../io/elastic/jdbc/QueryBuilders/MySQL.java | 14 +----- .../io/elastic/jdbc/QueryBuilders/Oracle.java | 13 +----- .../jdbc/QueryBuilders/PostgreSQL.java | 13 +----- .../io/elastic/jdbc/QueryBuilders/Query.java | 5 +-- .../io/elastic/jdbc/actions/SelectAction.java | 43 ++++++++----------- 6 files changed, 24 insertions(+), 77 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java index 53f76ad..3434ac1 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java @@ -16,18 +16,7 @@ public class MSSQL extends Query { - public ResultSet executeSelectQuery(Connection connection, String sqlQuery, JsonObject body) - throws SQLException { - PreparedStatement stmt = connection.prepareStatement(sqlQuery); - int i = 1; - for (Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - i++; - } - return stmt.executeQuery(); - } - - public ArrayList executeSelectQueryNew(Connection connection, String sqlQuery, JsonObject body) + public ArrayList executeSelectQuery(Connection connection, String sqlQuery, JsonObject body) throws SQLException { try (PreparedStatement stmt = connection.prepareStatement(sqlQuery)) { int i = 1; diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java index 6c3548d..96f6f3b 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java @@ -16,19 +16,7 @@ public class MySQL extends Query { - public ResultSet executeSelectQuery(Connection connection, String sqlQuery, JsonObject body) - throws SQLException { - StringBuilder sql = new StringBuilder(sqlQuery); - PreparedStatement stmt = connection.prepareStatement(sql.toString()); - int i = 1; - for (Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), (entry.getValue() != null) ? body : null); - i++; - } - return stmt.executeQuery(); - } - - public ArrayList executeSelectQueryNew(Connection connection, String sqlQuery, JsonObject body) + public ArrayList executeSelectQuery(Connection connection, String sqlQuery, JsonObject body) throws SQLException { StringBuilder sql = new StringBuilder(sqlQuery); try (PreparedStatement stmt = connection.prepareStatement(sql.toString())) { diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java index 81e259a..c2a36ef 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java @@ -16,18 +16,7 @@ public class Oracle extends Query { - public ResultSet executeSelectQuery(Connection connection, String sqlQuery, JsonObject body) - throws SQLException { - PreparedStatement stmt = connection.prepareStatement(sqlQuery); - int i = 1; - for (Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - i++; - } - return stmt.executeQuery(); - } - - public ArrayList executeSelectQueryNew(Connection connection, String sqlQuery, JsonObject body) + public ArrayList executeSelectQuery(Connection connection, String sqlQuery, JsonObject body) throws SQLException { try (PreparedStatement stmt = connection.prepareStatement(sqlQuery)) { int i = 1; diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java index f0a5377..4590537 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java @@ -16,18 +16,7 @@ public class PostgreSQL extends Query { - public ResultSet executeSelectQuery(Connection connection, String sqlQuery, JsonObject body) - throws SQLException { - PreparedStatement stmt = connection.prepareStatement(sqlQuery); - int i = 1; - for (Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - i++; - } - return stmt.executeQuery(); - } - - public ArrayList executeSelectQueryNew(Connection connection, String sqlQuery, JsonObject body) + public ArrayList executeSelectQuery(Connection connection, String sqlQuery, JsonObject body) throws SQLException { try (PreparedStatement stmt = connection.prepareStatement(sqlQuery)) { int i = 1; diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java b/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java index 12a5853..18f4cf1 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java @@ -83,10 +83,7 @@ abstract public void executeUpdate(Connection connection, String tableName, Stri abstract public void executeUpsert(Connection connection, String idColumn, JsonObject body) throws SQLException; - abstract public ResultSet executeSelectQuery(Connection connection, String sqlQuery, - JsonObject body) throws SQLException; - - abstract public ArrayList executeSelectQueryNew(Connection connection, String sqlQuery, + abstract public ArrayList executeSelectQuery(Connection connection, String sqlQuery, JsonObject body) throws SQLException; abstract public ResultSet executeSelectTrigger(Connection connection, String sqlQuery) diff --git a/src/main/java/io/elastic/jdbc/actions/SelectAction.java b/src/main/java/io/elastic/jdbc/actions/SelectAction.java index d74fe9e..ca521bc 100644 --- a/src/main/java/io/elastic/jdbc/actions/SelectAction.java +++ b/src/main/java/io/elastic/jdbc/actions/SelectAction.java @@ -7,12 +7,10 @@ import io.elastic.jdbc.QueryFactory; import io.elastic.jdbc.Utils; import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; import java.sql.SQLException; +import java.util.ArrayList; import javax.json.Json; import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; import javax.json.JsonString; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,14 +27,12 @@ public void execute(ExecutionParameters parameters) { final JsonObject body = parameters.getMessage().getBody(); final JsonObject configuration = parameters.getConfiguration(); JsonObject snapshot = parameters.getSnapshot(); - JsonObjectBuilder row = Json.createObjectBuilder(); checkConfig(configuration); Connection connection = Utils.getConnection(configuration); String dbEngine = configuration.getString("dbEngine"); String sqlQuery = configuration.getString("sqlQuery"); Integer skipNumber = 0; Boolean nullableResult = false; - Integer rowsCount = 0; if (Utils.getNonNullString(configuration, PROPERTY_NULLABLE_RESULT).equals("true")) { nullableResult = true; @@ -50,36 +46,35 @@ public void execute(ExecutionParameters parameters) { Utils.columnTypes = Utils.getVariableTypes(sqlQuery); LOGGER.info("Detected column types: " + Utils.columnTypes); - ResultSet rs = null; - LOGGER.info("Executing select trigger"); + LOGGER.info("Executing select action"); try { QueryFactory queryFactory = new QueryFactory(); Query query = queryFactory.getQuery(dbEngine); sqlQuery = Query.preProcessSelect(sqlQuery); LOGGER.info("SQL Query: {}", sqlQuery); - rs = query.executeSelectQuery(connection, sqlQuery, body); - ResultSetMetaData metaData = rs.getMetaData(); - while (rs.next()) { - LOGGER.info("columns count: {} from {}", rowsCount, metaData.getColumnCount()); - for (int i = 1; i <= metaData.getColumnCount(); i++) { - row = Utils.getColumnDataByType(rs, metaData, i, row); - } - rowsCount++; - LOGGER.info("Emitting data"); - LOGGER.info(row.toString()); - parameters.getEventEmitter().emitData(new Message.Builder().body(row.build()).build()); + + ArrayList resultList = query.executeSelectQuery(connection, sqlQuery, body); + for (int i = 0; i < resultList.size(); i++) { + LOGGER.info("Columns count: {} from {}", i + 1, resultList.size()); + LOGGER.info("Emitting data {}", resultList.get(i).toString()); + parameters.getEventEmitter() + .emitData(new Message.Builder().body(resultList.get(i)).build()); } - if (rowsCount == 0 && nullableResult) { - row.add("empty dataset", "no data"); - LOGGER.info("Emitting data"); - parameters.getEventEmitter().emitData(new Message.Builder().body(row.build()).build()); - } else if (rowsCount == 0 && !nullableResult) { + if (resultList.size() == 0 && nullableResult) { + resultList.add(Json.createObjectBuilder() + .add("empty dataset", "no data") + .build()); + LOGGER.info("Emitting data {}", resultList.get(0)); + parameters.getEventEmitter() + .emitData(new Message.Builder().body(resultList.get(0)).build()); + } else if (resultList.size() == 0 && !nullableResult) { LOGGER.info("Empty response. Error message will be returned"); throw new RuntimeException("Empty response"); } - snapshot = Json.createObjectBuilder().add(PROPERTY_SKIP_NUMBER, skipNumber + rowsCount) + snapshot = Json.createObjectBuilder() + .add(PROPERTY_SKIP_NUMBER, skipNumber + resultList.size()) .add(SQL_QUERY_VALUE, sqlQuery) .add(PROPERTY_NULLABLE_RESULT, nullableResult).build(); LOGGER.info("Emitting new snapshot {}", snapshot.toString()); From 74add4312f93cded825dbfe9b497c79e2dffba8e Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Tue, 4 Sep 2018 14:47:01 +0300 Subject: [PATCH 51/56] Updated method "executeSelectTrigger", method has returned ArrayList and common for all types of DB --- .../io/elastic/jdbc/QueryBuilders/MSSQL.java | 35 ------------- .../io/elastic/jdbc/QueryBuilders/MySQL.java | 39 -------------- .../io/elastic/jdbc/QueryBuilders/Oracle.java | 37 ------------- .../jdbc/QueryBuilders/PostgreSQL.java | 37 ------------- .../io/elastic/jdbc/QueryBuilders/Query.java | 52 +++++++++++++++++-- .../elastic/jdbc/triggers/SelectTrigger.java | 51 ++++++------------ 6 files changed, 64 insertions(+), 187 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java index 3434ac1..a4f7e06 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java @@ -4,48 +4,13 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; -import java.sql.ResultSetMetaData; import java.sql.SQLException; -import java.util.ArrayList; import java.util.Map; -import java.util.Map.Entry; -import javax.json.Json; import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; import javax.json.JsonValue; public class MSSQL extends Query { - public ArrayList executeSelectQuery(Connection connection, String sqlQuery, JsonObject body) - throws SQLException { - try (PreparedStatement stmt = connection.prepareStatement(sqlQuery)) { - int i = 1; - for (Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - i++; - } - try (ResultSet rs = stmt.executeQuery()) { - JsonObjectBuilder row = Json.createObjectBuilder(); - ArrayList listResult= new ArrayList(); - ResultSetMetaData metaData = rs.getMetaData(); - while (rs.next()) { - for (i = 1; i <= metaData.getColumnCount(); i++) { - row = Utils.getColumnDataByType(rs, metaData, i, row); - } - listResult.add(row.build()); - } - return listResult; - } - } - } - public ResultSet executeSelectTrigger(Connection connection, String sqlQuery) - throws SQLException { - PreparedStatement stmt = connection.prepareStatement(sqlQuery); - if (pollingValue != null) { - stmt.setTimestamp(1, pollingValue); - } - return stmt.executeQuery(); - } public ResultSet executePolling(Connection connection) throws SQLException { validateQuery(); diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java index 96f6f3b..5fddd42 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java @@ -4,52 +4,13 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; -import java.sql.ResultSetMetaData; import java.sql.SQLException; -import java.util.ArrayList; import java.util.Map; -import java.util.Map.Entry; -import javax.json.Json; import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; import javax.json.JsonValue; public class MySQL extends Query { - public ArrayList executeSelectQuery(Connection connection, String sqlQuery, JsonObject body) - throws SQLException { - StringBuilder sql = new StringBuilder(sqlQuery); - try (PreparedStatement stmt = connection.prepareStatement(sql.toString())) { - int i = 1; - for (Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), (entry.getValue() != null) ? body : null); - i++; - } - try (ResultSet rs = stmt.executeQuery()) { - JsonObjectBuilder row = Json.createObjectBuilder(); - ArrayList listResult= new ArrayList(); - ResultSetMetaData metaData = rs.getMetaData(); - while (rs.next()) { - for (i = 1; i <= metaData.getColumnCount(); i++) { - row = Utils.getColumnDataByType(rs, metaData, i, row); - } - listResult.add(row.build()); - } - return listResult; - } - } - } - - public ResultSet executeSelectTrigger(Connection connection, String sqlQuery) - throws SQLException { - StringBuilder sql = new StringBuilder(sqlQuery); - PreparedStatement stmt = connection.prepareStatement(sql.toString()); - if (pollingValue != null) { - stmt.setTimestamp(1, pollingValue); - } - return stmt.executeQuery(); - } - public ResultSet executePolling(Connection connection) throws SQLException { validateQuery(); StringBuilder sql = new StringBuilder("SELECT * FROM "); diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java index c2a36ef..7146d61 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java @@ -4,50 +4,13 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; -import java.sql.ResultSetMetaData; import java.sql.SQLException; -import java.util.ArrayList; import java.util.Map; -import java.util.Map.Entry; -import javax.json.Json; import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; import javax.json.JsonValue; public class Oracle extends Query { - public ArrayList executeSelectQuery(Connection connection, String sqlQuery, JsonObject body) - throws SQLException { - try (PreparedStatement stmt = connection.prepareStatement(sqlQuery)) { - int i = 1; - for (Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - i++; - } - try (ResultSet rs = stmt.executeQuery()) { - JsonObjectBuilder row = Json.createObjectBuilder(); - ArrayList listResult= new ArrayList(); - ResultSetMetaData metaData = rs.getMetaData(); - while (rs.next()) { - for (i = 1; i <= metaData.getColumnCount(); i++) { - row = Utils.getColumnDataByType(rs, metaData, i, row); - } - listResult.add(row.build()); - } - return listResult; - } - } - } - - public ResultSet executeSelectTrigger(Connection connection, String sqlQuery) - throws SQLException { - PreparedStatement stmt = connection.prepareStatement(sqlQuery); - if (pollingValue != null) { - stmt.setTimestamp(1, pollingValue); - } - return stmt.executeQuery(); - } - public ResultSet executePolling(Connection connection) throws SQLException { validateQuery(); String sql = "SELECT * FROM " + diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java index 4590537..03a2923 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java @@ -4,50 +4,13 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; -import java.sql.ResultSetMetaData; import java.sql.SQLException; -import java.util.ArrayList; import java.util.Map; -import java.util.Map.Entry; -import javax.json.Json; import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; import javax.json.JsonValue; public class PostgreSQL extends Query { - public ArrayList executeSelectQuery(Connection connection, String sqlQuery, JsonObject body) - throws SQLException { - try (PreparedStatement stmt = connection.prepareStatement(sqlQuery)) { - int i = 1; - for (Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - i++; - } - try (ResultSet rs = stmt.executeQuery()) { - JsonObjectBuilder row = Json.createObjectBuilder(); - ArrayList listResult= new ArrayList(); - ResultSetMetaData metaData = rs.getMetaData(); - while (rs.next()) { - for (i = 1; i <= metaData.getColumnCount(); i++) { - row = Utils.getColumnDataByType(rs, metaData, i, row); - } - listResult.add(row.build()); - } - return listResult; - } - } - } - - public ResultSet executeSelectTrigger(Connection connection, String sqlQuery) - throws SQLException { - PreparedStatement stmt = connection.prepareStatement(sqlQuery); - if (pollingValue != null) { - stmt.setTimestamp(1, pollingValue); - } - return stmt.executeQuery(); - } - public ResultSet executePolling(Connection connection) throws SQLException { validateQuery(); String sql = "WITH results_cte AS" + diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java b/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java index 18f4cf1..35c71a8 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java @@ -2,11 +2,17 @@ import io.elastic.jdbc.Utils; import java.sql.Connection; +import java.sql.PreparedStatement; import java.sql.ResultSet; +import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Timestamp; import java.util.ArrayList; +import java.util.Map.Entry; +import javax.json.Json; import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; +import javax.json.JsonValue; public abstract class Query { @@ -83,11 +89,49 @@ abstract public void executeUpdate(Connection connection, String tableName, Stri abstract public void executeUpsert(Connection connection, String idColumn, JsonObject body) throws SQLException; - abstract public ArrayList executeSelectQuery(Connection connection, String sqlQuery, - JsonObject body) throws SQLException; + public ArrayList executeSelectTrigger(Connection connection, String sqlQuery) + throws SQLException { + try (PreparedStatement stmt = connection.prepareStatement(sqlQuery)) { + if (pollingValue != null) { + stmt.setTimestamp(1, pollingValue); + } + try (ResultSet rs = stmt.executeQuery()) { + ArrayList listResult = new ArrayList(); + JsonObjectBuilder row = Json.createObjectBuilder(); + ResultSetMetaData metaData = rs.getMetaData(); + while (rs.next()) { + for (int i = 1; i <= metaData.getColumnCount(); i++) { + row = Utils.getColumnDataByType(rs, metaData, i, row); + } + listResult.add(row.build()); + } + return listResult; + } + } + } - abstract public ResultSet executeSelectTrigger(Connection connection, String sqlQuery) - throws SQLException; + public ArrayList executeSelectQuery(Connection connection, String sqlQuery, JsonObject body) + throws SQLException { + try (PreparedStatement stmt = connection.prepareStatement(sqlQuery)) { + int i = 1; + for (Entry entry : body.entrySet()) { + Utils.setStatementParam(stmt, i, entry.getKey(), body); + i++; + } + try (ResultSet rs = stmt.executeQuery()) { + JsonObjectBuilder row = Json.createObjectBuilder(); + ArrayList listResult = new ArrayList(); + ResultSetMetaData metaData = rs.getMetaData(); + while (rs.next()) { + for (i = 1; i <= metaData.getColumnCount(); i++) { + row = Utils.getColumnDataByType(rs, metaData, i, row); + } + listResult.add(row.build()); + } + return listResult; + } + } + } public void validateQuery() { if (tableName == null) { diff --git a/src/main/java/io/elastic/jdbc/triggers/SelectTrigger.java b/src/main/java/io/elastic/jdbc/triggers/SelectTrigger.java index a94ae8e..1155fb1 100644 --- a/src/main/java/io/elastic/jdbc/triggers/SelectTrigger.java +++ b/src/main/java/io/elastic/jdbc/triggers/SelectTrigger.java @@ -8,14 +8,13 @@ import io.elastic.jdbc.Utils; import java.sql.Connection; import java.sql.ResultSet; -import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Timestamp; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Calendar; import javax.json.Json; import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; import javax.json.JsonString; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -36,11 +35,9 @@ public final void execute(ExecutionParameters parameters) { LOGGER.info("About to execute select trigger"); final JsonObject configuration = parameters.getConfiguration(); JsonObject snapshot = parameters.getSnapshot(); - JsonObjectBuilder row = Json.createObjectBuilder(); checkConfig(configuration); Connection connection = Utils.getConnection(configuration); Integer skipNumber = 0; - Integer rowsCount = 0; Calendar cDate = Calendar.getInstance(); cDate.set(cDate.get(Calendar.YEAR), cDate.get(Calendar.MONTH), cDate.get(Calendar.DATE), 0, 0, @@ -79,26 +76,25 @@ public final void execute(ExecutionParameters parameters) { query.selectPolling(sqlQuery, pollingValue); } LOGGER.info("SQL Query: {}", sqlQuery); - rs = query.executeSelectTrigger(connection, sqlQuery); - ResultSetMetaData metaData = rs.getMetaData(); - while (rs.next()) { - for (int i = 1; i <= metaData.getColumnCount(); i++) { - row = Utils.getColumnDataByType(rs, metaData, i, row); - } - rowsCount++; - LOGGER.info("Emitting data"); - LOGGER.info(row.toString()); - parameters.getEventEmitter().emitData(new Message.Builder().body(row.build()).build()); + ArrayList resultList = query.executeSelectTrigger(connection, sqlQuery); + for (int i = 0; i < resultList.size(); i++) { + LOGGER.info("Columns count: {} from {}", i + 1, resultList.size()); + LOGGER.info("Emitting data {}", resultList.get(i).toString()); + parameters.getEventEmitter() + .emitData(new Message.Builder().body(resultList.get(i)).build()); } - if (rowsCount == 0) { - row.add("empty dataset", "no data"); - LOGGER.info("Emitting data"); - LOGGER.info(row.toString()); - parameters.getEventEmitter().emitData(new Message.Builder().body(row.build()).build()); + if (resultList.size() == 0) { + resultList.add(Json.createObjectBuilder() + .add("empty dataset", "no data") + .build()); + LOGGER.info("Emitting data {}", resultList.get(0).toString()); + parameters.getEventEmitter() + .emitData(new Message.Builder().body(resultList.get(0)).build()); } - snapshot = Json.createObjectBuilder().add(PROPERTY_SKIP_NUMBER, skipNumber + rowsCount) + snapshot = Json.createObjectBuilder() + .add(PROPERTY_SKIP_NUMBER, skipNumber + resultList.size()) .add(LAST_POLL_PLACEHOLDER, pollingValue.toString()) .add(SQL_QUERY_VALUE, sqlQuery).build(); LOGGER.info("Emitting new snapshot {}", snapshot.toString()); @@ -106,21 +102,6 @@ public final void execute(ExecutionParameters parameters) { } catch (SQLException e) { LOGGER.error("Failed to make request", e.toString()); throw new RuntimeException(e); - } finally { - if (rs != null) { - try { - rs.close(); - } catch (SQLException e) { - LOGGER.error("Failed to close result set", e.toString()); - } - } - if (connection != null) { - try { - connection.close(); - } catch (SQLException e) { - LOGGER.error("Failed to close connection", e.toString()); - } - } } } From 1c8ef95cf29e9ab7a97b3cf3fb067da83beefa90 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Tue, 4 Sep 2018 16:35:29 +0300 Subject: [PATCH 52/56] Updated method "executePolling", method has returned ArrayList --- .../io/elastic/jdbc/QueryBuilders/MSSQL.java | 39 +++++++++-- .../io/elastic/jdbc/QueryBuilders/MySQL.java | 39 +++++++++-- .../io/elastic/jdbc/QueryBuilders/Oracle.java | 42 +++++++++--- .../jdbc/QueryBuilders/PostgreSQL.java | 39 +++++++++-- .../io/elastic/jdbc/QueryBuilders/Query.java | 11 +++- .../jdbc/triggers/GetRowsPollingTrigger.java | 64 +++++++------------ 6 files changed, 165 insertions(+), 69 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java index a4f7e06..61dcc89 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java @@ -4,15 +4,19 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; +import java.sql.ResultSetMetaData; import java.sql.SQLException; +import java.util.ArrayList; import java.util.Map; +import javax.json.Json; import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; import javax.json.JsonValue; public class MSSQL extends Query { - public ResultSet executePolling(Connection connection) throws SQLException { + public ArrayList executePolling(Connection connection) throws SQLException { validateQuery(); String sql = "WITH Results_CTE AS" + "(" + @@ -26,11 +30,34 @@ public ResultSet executePolling(Connection connection) throws SQLException { " FROM Results_CTE" + " WHERE RowNum > ?" + " AND RowNum < ?"; - PreparedStatement stmt = connection.prepareStatement(sql); - stmt.setTimestamp(1, pollingValue); - stmt.setInt(2, skipNumber); - stmt.setInt(3, countNumber + skipNumber); - return stmt.executeQuery(); + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + stmt.setTimestamp(1, pollingValue); + stmt.setInt(2, skipNumber); + stmt.setInt(3, countNumber + skipNumber); + try (ResultSet rs = stmt.executeQuery()) { + ArrayList listResult = new ArrayList(); + JsonObjectBuilder row = Json.createObjectBuilder(); + ResultSetMetaData metaData = rs.getMetaData(); + while (rs.next()) { + for (int i = 1; i <= metaData.getColumnCount(); i++) { + row = Utils.getColumnDataByType(rs, metaData, i, row); + if (metaData.getColumnName(i).toUpperCase().equals(pollingField.toUpperCase())) { + if (maxPollingValue.before(rs.getTimestamp(i))) { + if (rs.getString(metaData.getColumnName(i)).length() > 10) { + maxPollingValue = java.sql.Timestamp + .valueOf(rs.getString(metaData.getColumnName(i))); + } else { + maxPollingValue = java.sql.Timestamp + .valueOf(rs.getString(metaData.getColumnName(i)) + " 00:00:00"); + } + } + } + } + listResult.add(row.build()); + } + return listResult; + } + } } public JsonObject executeLookup(Connection connection, JsonObject body) throws SQLException { diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java index 5fddd42..7f7ea47 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java @@ -4,14 +4,18 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; +import java.sql.ResultSetMetaData; import java.sql.SQLException; +import java.util.ArrayList; import java.util.Map; +import javax.json.Json; import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; import javax.json.JsonValue; public class MySQL extends Query { - public ResultSet executePolling(Connection connection) throws SQLException { + public ArrayList executePolling(Connection connection) throws SQLException { validateQuery(); StringBuilder sql = new StringBuilder("SELECT * FROM "); sql.append(tableName); @@ -23,11 +27,34 @@ public ResultSet executePolling(Connection connection) throws SQLException { } sql.append(" ASC LIMIT ? OFFSET ?"); - PreparedStatement stmt = connection.prepareStatement(sql.toString()); - stmt.setTimestamp(1, pollingValue); - stmt.setInt(2, countNumber); - stmt.setInt(3, skipNumber); - return stmt.executeQuery(); + try (PreparedStatement stmt = connection.prepareStatement(sql.toString())) { + stmt.setTimestamp(1, pollingValue); + stmt.setInt(2, countNumber); + stmt.setInt(3, skipNumber); + try (ResultSet rs = stmt.executeQuery()) { + ArrayList listResult = new ArrayList(); + JsonObjectBuilder row = Json.createObjectBuilder(); + ResultSetMetaData metaData = rs.getMetaData(); + while (rs.next()) { + for (int i = 1; i <= metaData.getColumnCount(); i++) { + row = Utils.getColumnDataByType(rs, metaData, i, row); + if (metaData.getColumnName(i).toUpperCase().equals(pollingField.toUpperCase())) { + if (maxPollingValue.before(rs.getTimestamp(i))) { + if (rs.getString(metaData.getColumnName(i)).length() > 10) { + maxPollingValue = java.sql.Timestamp + .valueOf(rs.getString(metaData.getColumnName(i))); + } else { + maxPollingValue = java.sql.Timestamp + .valueOf(rs.getString(metaData.getColumnName(i)) + " 00:00:00"); + } + } + } + } + listResult.add(row.build()); + } + return listResult; + } + } } public JsonObject executeLookup(Connection connection, JsonObject body) throws SQLException { diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java index 7146d61..dcb7807 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java @@ -4,27 +4,53 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; +import java.sql.ResultSetMetaData; import java.sql.SQLException; +import java.util.ArrayList; import java.util.Map; +import javax.json.Json; import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; import javax.json.JsonValue; public class Oracle extends Query { - public ResultSet executePolling(Connection connection) throws SQLException { + public ArrayList executePolling(Connection connection) throws SQLException { validateQuery(); String sql = "SELECT * FROM " + " (SELECT b.*, rank() over (order by " + pollingField + ") as rnk FROM " + tableName + " b) WHERE " + pollingField + " > ?" + " AND rnk BETWEEN ? AND ?" + " ORDER BY " + pollingField; - PreparedStatement stmt = connection.prepareStatement(sql); - - /* data types mapping https://docs.oracle.com/cd/B19306_01/java.102/b14188/datamap.htm */ - stmt.setTimestamp(1, pollingValue); - stmt.setInt(2, skipNumber); - stmt.setInt(3, countNumber); - return stmt.executeQuery(); + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + /* data types mapping https://docs.oracle.com/cd/B19306_01/java.102/b14188/datamap.htm */ + stmt.setTimestamp(1, pollingValue); + stmt.setInt(2, skipNumber); + stmt.setInt(3, countNumber); + try (ResultSet rs = stmt.executeQuery()) { + ArrayList listResult = new ArrayList(); + JsonObjectBuilder row = Json.createObjectBuilder(); + ResultSetMetaData metaData = rs.getMetaData(); + while (rs.next()) { + for (int i = 1; i <= metaData.getColumnCount(); i++) { + row = Utils.getColumnDataByType(rs, metaData, i, row); + if (metaData.getColumnName(i).toUpperCase().equals(pollingField.toUpperCase())) { + if (maxPollingValue.before(rs.getTimestamp(i))) { + if (rs.getString(metaData.getColumnName(i)).length() > 10) { + maxPollingValue = java.sql.Timestamp + .valueOf(rs.getString(metaData.getColumnName(i))); + } else { + maxPollingValue = java.sql.Timestamp + .valueOf(rs.getString(metaData.getColumnName(i)) + " 00:00:00"); + } + } + } + } + listResult.add(row.build()); + } + return listResult; + } + } } public JsonObject executeLookup(Connection connection, JsonObject body) throws SQLException { diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java index 03a2923..9b07e42 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java @@ -4,14 +4,18 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; +import java.sql.ResultSetMetaData; import java.sql.SQLException; +import java.util.ArrayList; import java.util.Map; +import javax.json.Json; import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; import javax.json.JsonValue; public class PostgreSQL extends Query { - public ResultSet executePolling(Connection connection) throws SQLException { + public ArrayList executePolling(Connection connection) throws SQLException { validateQuery(); String sql = "WITH results_cte AS" + "(" + @@ -25,11 +29,34 @@ public ResultSet executePolling(Connection connection) throws SQLException { " FROM results_cte" + " WHERE rownum > ?" + " AND rownum < ?"; - PreparedStatement stmt = connection.prepareStatement(sql); - stmt.setTimestamp(1, pollingValue); - stmt.setInt(2, skipNumber); - stmt.setInt(3, countNumber + skipNumber); - return stmt.executeQuery(); + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + stmt.setTimestamp(1, pollingValue); + stmt.setInt(2, skipNumber); + stmt.setInt(3, countNumber + skipNumber); + try (ResultSet rs = stmt.executeQuery()) { + ArrayList listResult = new ArrayList(); + JsonObjectBuilder row = Json.createObjectBuilder(); + ResultSetMetaData metaData = rs.getMetaData(); + while (rs.next()) { + for (int i = 1; i <= metaData.getColumnCount(); i++) { + row = Utils.getColumnDataByType(rs, metaData, i, row); + if (metaData.getColumnName(i).toUpperCase().equals(pollingField.toUpperCase())) { + if (maxPollingValue.before(rs.getTimestamp(i))) { + if (rs.getString(metaData.getColumnName(i)).length() > 10) { + maxPollingValue = java.sql.Timestamp + .valueOf(rs.getString(metaData.getColumnName(i))); + } else { + maxPollingValue = java.sql.Timestamp + .valueOf(rs.getString(metaData.getColumnName(i)) + " 00:00:00"); + } + } + } + } + listResult.add(row.build()); + } + return listResult; + } + } } public JsonObject executeLookup(Connection connection, JsonObject body) throws SQLException { diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java b/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java index 35c71a8..84b8b84 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java @@ -22,6 +22,7 @@ public abstract class Query { protected String orderField = null; protected String pollingField = null; protected Timestamp pollingValue = null; + protected Timestamp maxPollingValue = null; protected String lookupField = null; protected String lookupValue = null; @@ -70,7 +71,15 @@ public Query selectPolling(String sqlQuery, Timestamp fieldValue) { return this; } - abstract public ResultSet executePolling(Connection connection) throws SQLException; + public Timestamp getMaxPollingValue() { + return maxPollingValue; + } + + public void setMaxPollingValue(Timestamp maxPollingValue) { + this.maxPollingValue = maxPollingValue; + } + + abstract public ArrayList executePolling(Connection connection) throws SQLException; abstract public JsonObject executeLookup(Connection connection, JsonObject body) throws SQLException; diff --git a/src/main/java/io/elastic/jdbc/triggers/GetRowsPollingTrigger.java b/src/main/java/io/elastic/jdbc/triggers/GetRowsPollingTrigger.java index bfa93db..7004404 100644 --- a/src/main/java/io/elastic/jdbc/triggers/GetRowsPollingTrigger.java +++ b/src/main/java/io/elastic/jdbc/triggers/GetRowsPollingTrigger.java @@ -7,15 +7,13 @@ import io.elastic.jdbc.QueryFactory; import io.elastic.jdbc.Utils; import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Timestamp; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Calendar; import javax.json.Json; import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; import javax.json.JsonValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,31 +28,27 @@ public class GetRowsPollingTrigger implements Module { private static final String PROPERTY_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss.sss"; private static final String PROPERTY_SKIP_NUMBER = "skipNumber"; private static final String DATETIME_REGEX = "(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}):(\\d{2}):(\\d{2})(\\.(\\d{1,3}))?"; - private static boolean isEmpty = true; @Override public final void execute(ExecutionParameters parameters) { LOGGER.info("About to execute select trigger"); final JsonObject configuration = parameters.getConfiguration(); JsonObject snapshot = parameters.getSnapshot(); - JsonObjectBuilder row = Json.createObjectBuilder(); checkConfig(configuration); - Connection connection = Utils.getConnection(configuration); + Connection connection = null; Integer skipNumber = 0; - Integer rowsCount = 0; String pollingField = ""; Calendar cDate = Calendar.getInstance(); cDate.set(cDate.get(Calendar.YEAR), cDate.get(Calendar.MONTH), cDate.get(Calendar.DATE), 0, 0, 0); - String dbEngine = configuration.getString(Utils.CFG_DB_ENGINE); String tableName = configuration.getString(PROPERTY_TABLE_NAME); + if (Utils.getNonNullString(configuration, PROPERTY_POLLING_FIELD).length() != 0) { pollingField = configuration.getString(PROPERTY_POLLING_FIELD); } Timestamp pollingValue; Timestamp cts = new java.sql.Timestamp(cDate.getTimeInMillis()); - Timestamp maxPollingValue = cts; String formattedDate = new SimpleDateFormat(PROPERTY_DATETIME_FORMAT).format(cts); if (configuration.containsKey(PROPERTY_POLLING_VALUE) && Utils @@ -80,44 +74,37 @@ public final void execute(ExecutionParameters parameters) { skipNumber = 0; } - ResultSet rs = null; LOGGER.info("Executing row polling trigger"); try { + connection = Utils.getConnection(configuration); QueryFactory queryFactory = new QueryFactory(); Query query = queryFactory.getQuery(dbEngine); query.from(tableName).skip(skipNumber).orderBy(pollingField) .rowsPolling(pollingField, pollingValue); - rs = query.executePolling(connection); - ResultSetMetaData metaData = rs.getMetaData(); - while (rs.next()) { - for (int i = 1; i <= metaData.getColumnCount(); i++) { - row = Utils.getColumnDataByType(rs, metaData, i, row); - if (metaData.getColumnName(i).toUpperCase().equals(pollingField.toUpperCase())) { - if (maxPollingValue.before(rs.getTimestamp(i))) { - if (rs.getString(metaData.getColumnName(i)).length() > 10) { - maxPollingValue = java.sql.Timestamp - .valueOf(rs.getString(metaData.getColumnName(i))); - } else { - maxPollingValue = java.sql.Timestamp - .valueOf(rs.getString(metaData.getColumnName(i)) + " 00:00:00"); - } - } - } - } - parameters.getEventEmitter().emitData(new Message.Builder().body(row.build()).build()); - rowsCount++; + query.setMaxPollingValue(cts); + ArrayList resultList = query.executePolling(connection); + for (int i = 0; i < resultList.size(); i++) { + LOGGER.info("Columns count: {} from {}", i + 1, resultList.size()); + LOGGER.info("Emitting data {}", resultList.get(i).toString()); + parameters.getEventEmitter() + .emitData(new Message.Builder().body(resultList.get(i)).build()); } - if (rowsCount == 0) { - row.add("empty dataset", "no data"); + if (resultList.size() == 0) { + resultList.add(Json.createObjectBuilder() + .add("empty dataset", "no data") + .build()); LOGGER.info("Emitting empty data"); - maxPollingValue = new java.sql.Timestamp(System.currentTimeMillis()); - parameters.getEventEmitter().emitData(new Message.Builder().body(row.build()).build()); + query.setMaxPollingValue(new java.sql.Timestamp(System.currentTimeMillis())); + parameters.getEventEmitter() + .emitData(new Message.Builder().body(resultList.get(0)).build()); } - formattedDate = new SimpleDateFormat(PROPERTY_DATETIME_FORMAT).format(maxPollingValue); + formattedDate = new SimpleDateFormat(PROPERTY_DATETIME_FORMAT) + .format(query.getMaxPollingValue()); - snapshot = Json.createObjectBuilder().add(PROPERTY_SKIP_NUMBER, skipNumber + rowsCount) + snapshot = Json.createObjectBuilder() + .add(PROPERTY_SKIP_NUMBER, skipNumber + resultList.size()) .add(PROPERTY_TABLE_NAME, tableName) .add(PROPERTY_POLLING_FIELD, pollingField) .add(PROPERTY_POLLING_VALUE, formattedDate).build(); @@ -127,13 +114,6 @@ public final void execute(ExecutionParameters parameters) { LOGGER.error("Failed to make request", e.toString()); throw new RuntimeException(e); } finally { - if (rs != null) { - try { - rs.close(); - } catch (SQLException e) { - LOGGER.error("Failed to close result set", e.toString()); - } - } if (connection != null) { try { connection.close(); From 57abf30c5a0159999294da0f9ab15e0b357ba0d6 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Fri, 14 Sep 2018 14:50:45 +0300 Subject: [PATCH 53/56] Update Readme.md and Use one transaction for UpsertAction --- README.md | 12 +- .../io/elastic/jdbc/QueryBuilders/MSSQL.java | 47 ------- .../io/elastic/jdbc/QueryBuilders/MySQL.java | 36 ------ .../io/elastic/jdbc/QueryBuilders/Oracle.java | 43 ------- .../jdbc/QueryBuilders/PostgreSQL.java | 38 ------ .../io/elastic/jdbc/QueryBuilders/Query.java | 117 +++++++++++++++++- src/main/java/io/elastic/jdbc/Utils.java | 41 +++--- .../jdbc/actions/UpsertRowByPrimaryKey.java | 79 +++++------- .../delete/DeleteActionMSSQLSpec.groovy | 14 +-- .../delete/DeleteActionMySQLSpec.groovy | 18 +-- .../delete/DeleteActionOracleSpec.groovy | 18 +-- .../delete/DeleteActionPostrgeSpec.groovy | 16 +-- .../UpsertRowByPrimaryKeyMSSQLSpec.groovy | 10 +- 13 files changed, 207 insertions(+), 282 deletions(-) diff --git a/README.md b/README.md index 586afd2..65f5354 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Following actions are inside: ### Requirements Before you can deploy any code into elastic.io **you must be a registered elastic.io platform user**. Please see our home page at [http://www.elastic.io](http://www.elastic.io) to learn how. #### Environment variables -For unit-testing is needed specify following environment variables: +For unit-testing is needed to specify following environment variables: 1. Connection to MSSQL: - ``CONN_USER_MSSQL`` - user login - ``CONN_PASSWORD_MSSQL`` - user password @@ -192,15 +192,15 @@ Checkbox ``Don't throw Error on an Empty Result`` allows to emit an empty respon As an input metadata you will get a Primary Key field to provide the data inside as a clause value. ## Current limitations -1. Only tables with one [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY") is supported. Message ``Table has not Primary Key. Should be one Primary Key -`` should be displayed if the table without any primary key will be selected and message ``Composite Primary Key is not supported -`` should be displayed if the table with composite primary key will be selected. -2. Only following versions of DataBase are supported: +1. Only tables with one [PRIMARY KEY](https://en.wikipedia.org/wiki/Primary_key "PRIMARY KEY") is supported. You will see the message ``Table has not Primary Key. Should be one Primary Key +``, if the selected table doesn't have a primary key. Also, you will see the message ``Composite Primary Key is not supported +``, if the selected table has composite primary key. +2. Only following versions of database types are supported: - ``MySQL`` - compatible with MySQL Server 5.5, 5.6, 5.7 and 8.0. - ``PostgreSQL`` - compatible with PostgreSQL 8.2 and higher - ``Oracle`` - compatible with Oracle Database 8.1.7 - 12.1.0.2 - ``MSSQL`` - compatible with Microsoft SQL Server 2008 R2 and higher -3. For Action "Upsert by primary key" metadata analysis ignores nullable/non-nullable fields, it will be throw SQL Server exception ``Cannot insert the value NULL into...`` if non-nullable fields don't fill for Insert operation. +3. The current implementation of the action ``Upsert By Primary Key`` doesn't mark non-nullable fields as required fields at a dynamic metadata. In case of updating such fields with an empty value you will get SQL Exception ``Cannot insert the value NULL into...``. You should manually fill in all non-nullable fields with previous data, if you want to update part of columns in a row, even if data in that fields doesn't change. ## Known issues No known issues are there yet. diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java index 61dcc89..f849824 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MSSQL.java @@ -148,51 +148,4 @@ public void executeUpdate(Connection connection, String tableName, String idColu } } - public void executeUpsert(Connection connection, String idColumn, JsonObject body) - throws SQLException { - validateQuery(); - - StringBuilder keys = new StringBuilder(); - StringBuilder values = new StringBuilder(); - StringBuilder setString = new StringBuilder(); - for (Map.Entry entry : body.entrySet()) { - if (setString.length() > 0) { - setString.append(","); - } - setString.append(entry.getKey()).append(" = ?"); - if (keys.length() > 0) { - keys.append(","); - } - keys.append(entry.getKey()); - if (values.length() > 0) { - values.append(","); - } - values.append("?"); - } - String sql = "BEGIN TRANSACTION;" + - " IF EXISTS (SELECT * FROM " + tableName + - " WHERE " + idColumn + "= ?)" + - " UPDATE " + tableName + - " SET " + setString.toString() + - " WHERE " + idColumn + " = ?" + - " ELSE INSERT INTO " + tableName + - " (" + keys.toString() + ")" + - " VALUES (" + values.toString() + ")" + - " COMMIT;"; - try (PreparedStatement stmt = connection.prepareStatement(sql)) { - Utils.setStatementParam(stmt, 1, idColumn, body); - int i = 2; - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - i++; - } - Utils.setStatementParam(stmt, i++, idColumn, body); - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - i++; - } - stmt.execute(); - } - } - } diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java index 7f7ea47..c8e4441 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/MySQL.java @@ -139,40 +139,4 @@ public void executeUpdate(Connection connection, String tableName, String idColu } } - public void executeUpsert(Connection connection, String idColumn, JsonObject body) - throws SQLException { - validateQuery(); - StringBuilder keys = new StringBuilder(); - StringBuilder values = new StringBuilder(); - StringBuilder setString = new StringBuilder(); - for (Map.Entry entry : body.entrySet()) { - if (setString.length() > 0) { - setString.append(","); - } - setString.append(entry.getKey()).append(" = ?"); - if (keys.length() > 0) { - keys.append(","); - } - keys.append(entry.getKey()); - if (values.length() > 0) { - values.append(","); - } - values.append("?"); - } - String sql = "INSERT INTO " + tableName + - " (" + keys.toString() + ")" + - " VALUES (" + values.toString() + ")" + - " ON DUPLICATE KEY UPDATE " + setString + ";"; - try (PreparedStatement stmt = connection.prepareStatement(sql)) { - int i = 1; - int countBodyEntry = body.size(); - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - Utils.setStatementParam(stmt, i + countBodyEntry, entry.getKey(), body); - i++; - } - stmt.execute(); - } - } - } diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java index dcb7807..0027561 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/Oracle.java @@ -133,47 +133,4 @@ public void executeUpdate(Connection connection, String tableName, String idColu } } - public void executeUpsert(Connection connection, String idColumn, JsonObject body) - throws SQLException { - validateQuery(); - StringBuilder keys = new StringBuilder(); - StringBuilder values = new StringBuilder(); - StringBuilder setString = new StringBuilder(); - for (Map.Entry entry : body.entrySet()) { - if (setString.length() > 0) { - setString.append(","); - } - setString.append(entry.getKey()).append(" = ?"); - if (keys.length() > 0) { - keys.append(","); - } - keys.append(entry.getKey()); - if (values.length() > 0) { - values.append(","); - } - values.append("?"); - } - String sql = "BEGIN " + - " INSERT INTO " + tableName + - " (" + keys.toString() + ")" + - " VALUES (" + values.toString() + ");" + - " EXCEPTION" + - " WHEN DUP_VAL_ON_INDEX THEN" + - " UPDATE " + tableName + - " SET " + setString.toString() + - " WHERE " + idColumn + " = ?;" + - " END;"; - try (PreparedStatement stmt = connection.prepareStatement(sql)) { - //set Statement parameters for Insert (i) and Update operation (i + countBodyEntry) - int i = 1; - int countBodyEntry = body.size(); - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - Utils.setStatementParam(stmt, i + countBodyEntry, entry.getKey(), body); - i++; - } - Utils.setStatementParam(stmt, i + countBodyEntry, idColumn, body); - stmt.execute(); - } - } } diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java index 9b07e42..c666d95 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/PostgreSQL.java @@ -149,42 +149,4 @@ public void executeUpdate(Connection connection, String tableName, String idColu } } - public void executeUpsert(Connection connection, String idColumn, JsonObject body) - throws SQLException { - validateQuery(); - StringBuilder keys = new StringBuilder(); - StringBuilder values = new StringBuilder(); - StringBuilder setString = new StringBuilder(); - for (Map.Entry entry : body.entrySet()) { - if (setString.length() > 0) { - setString.append(","); - } - setString.append(entry.getKey()).append(" = ?"); - if (keys.length() > 0) { - keys.append(","); - } - keys.append(entry.getKey()); - if (values.length() > 0) { - values.append(","); - } - values.append("?"); - } - String sql = "INSERT INTO " + tableName + - " (" + keys.toString() + ")" + - " VALUES (" + values.toString() + ")" + - " ON CONFLICT (" + idColumn + ")" + - " DO UPDATE " + - " SET " + setString.toString() + ";"; - try (PreparedStatement stmt = connection.prepareStatement(sql)) { - //set Statement parameters for Insert (i) and Update operation (i + countBodyEntry) - int i = 1; - int countBodyEntry = body.size(); - for (Map.Entry entry : body.entrySet()) { - Utils.setStatementParam(stmt, i, entry.getKey(), body); - Utils.setStatementParam(stmt, i + countBodyEntry, entry.getKey(), body); - i++; - } - stmt.execute(); - } - } } diff --git a/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java b/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java index 84b8b84..b634631 100644 --- a/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java +++ b/src/main/java/io/elastic/jdbc/QueryBuilders/Query.java @@ -8,6 +8,7 @@ import java.sql.SQLException; import java.sql.Timestamp; import java.util.ArrayList; +import java.util.Map; import java.util.Map.Entry; import javax.json.Json; import javax.json.JsonObject; @@ -95,9 +96,6 @@ abstract public void executeInsert(Connection connection, String tableName, Json abstract public void executeUpdate(Connection connection, String tableName, String idColumn, String idValue, JsonObject body) throws SQLException; - abstract public void executeUpsert(Connection connection, String idColumn, - JsonObject body) throws SQLException; - public ArrayList executeSelectTrigger(Connection connection, String sqlQuery) throws SQLException { try (PreparedStatement stmt = connection.prepareStatement(sqlQuery)) { @@ -142,6 +140,119 @@ public ArrayList executeSelectQuery(Connection connection, String sqlQuery, Json } } + public JsonObject executeUpsert(Connection connection, String idColumn, + JsonObject body) throws SQLException { + validateQuery(); + JsonObject foundRow; + JsonObjectBuilder row = Json.createObjectBuilder(); + int rowsCount = 0; + int i; + ResultSet rs; + ResultSetMetaData metaData; + + StringBuilder keys = new StringBuilder(); + StringBuilder values = new StringBuilder(); + StringBuilder setString = new StringBuilder(); + for (Map.Entry entry : body.entrySet()) { + if (keys.length() > 0) { + keys.append(","); + } + keys.append(entry.getKey()); + if (values.length() > 0) { + values.append(","); + } + values.append("?"); + if (!entry.getKey().equals(idColumn)) { + if (setString.length() > 0) { + setString.append(","); + } + setString.append(entry.getKey()).append(" = ?"); + } + } + + String sqlSELECT = + " SELECT" + + " *" + + " FROM " + tableName + + " WHERE " + idColumn + " = ?"; + String sqlInsert = "INSERT INTO " + tableName + + " (" + keys.toString() + ")" + + " VALUES (" + values.toString() + ")"; + String sqlUpdate = "UPDATE " + tableName + + " SET " + setString.toString() + + " WHERE " + idColumn + " = ?"; + + PreparedStatement stmtSelect = null; + PreparedStatement stmtInsert = null; + PreparedStatement stmtUpdate = null; + + try { + connection.setAutoCommit(false); + + stmtSelect = connection.prepareStatement(sqlSELECT); + Utils.setStatementParam(stmtSelect, 1, idColumn, body); + rs = stmtSelect.executeQuery(); + metaData = rs.getMetaData(); + while (rs.next()) { + for (i = 1; i <= metaData.getColumnCount(); i++) { + row = Utils.getColumnDataByType(rs, metaData, i, row); + } + rowsCount++; + if (rowsCount > 1) { + throw new RuntimeException("Error: the number of matching rows is not exactly one"); + } + } + foundRow = row.build(); + + i = 1; + if (foundRow.size() == 0) { + stmtInsert = connection.prepareStatement(sqlInsert); + for (Map.Entry entry : body.entrySet()) { + Utils.setStatementParam(stmtInsert, i, entry.getKey(), body); + i++; + } + stmtInsert.execute(); + } else { + stmtUpdate = connection.prepareStatement(sqlUpdate); + for (Map.Entry entry : body.entrySet()) { + if (!entry.getKey().equals(idColumn)) { + Utils.setStatementParam(stmtUpdate, i, entry.getKey(), body); + i++; + } + } + Utils.setStatementParam(stmtUpdate, i, idColumn, body); + stmtUpdate.execute(); + } + + rs = stmtSelect.executeQuery(); + metaData = rs.getMetaData(); + rowsCount = 0; + while (rs.next()) { + for (i = 1; i <= metaData.getColumnCount(); i++) { + row = Utils.getColumnDataByType(rs, metaData, i, row); + } + rowsCount++; + if (rowsCount > 1) { + throw new RuntimeException("Error: the number of matching rows is not exactly one"); + } + } + connection.commit(); + + } finally { + if (stmtSelect != null) { + stmtSelect.close(); + } + if (stmtInsert != null) { + stmtInsert.close(); + } + if (stmtUpdate != null) { + stmtUpdate.close(); + } + connection.setAutoCommit(true); + } + return row.build(); + } + public void validateQuery() { if (tableName == null) { throw new RuntimeException("Table name is required field"); diff --git a/src/main/java/io/elastic/jdbc/Utils.java b/src/main/java/io/elastic/jdbc/Utils.java index b9e313e..5f1b3fe 100644 --- a/src/main/java/io/elastic/jdbc/Utils.java +++ b/src/main/java/io/elastic/jdbc/Utils.java @@ -241,61 +241,60 @@ public static Map getVariableTypes(String sqlQuery) { public static JsonObjectBuilder getColumnDataByType(ResultSet rs, ResultSetMetaData metaData, int i, JsonObjectBuilder row) { try { + final String columnName = metaData.getColumnName(i); + if(null==rs.getObject(columnName)){ + row.add(columnName, JsonValue.NULL); + return row; + } switch (metaData.getColumnType(i)) { case Types.BOOLEAN: case Types.BIT: - row.add(metaData.getColumnName(i), rs.getBoolean(metaData.getColumnName(i))); + row.add(columnName, rs.getBoolean(columnName)); break; case Types.BINARY: case Types.VARBINARY: case Types.LONGVARBINARY: - String floatString = Arrays.toString(rs.getBytes(metaData.getColumnName(i))); - row.add(metaData.getColumnName(i), floatString); + String floatString = Arrays.toString(rs.getBytes(columnName)); + row.add(columnName, floatString); break; case Types.INTEGER: - row.add(metaData.getColumnName(i), rs.getInt(metaData.getColumnName(i))); + row.add(columnName, rs.getInt(columnName)); break; case Types.NUMERIC: case Types.DECIMAL: - row.add(metaData.getColumnName(i), rs.getBigDecimal(metaData.getColumnName(i))); + row.add(columnName, (rs.getBigDecimal(columnName)!=null)); break; case Types.DOUBLE: - row.add(metaData.getColumnName(i), rs.getDouble(metaData.getColumnName(i))); + row.add(columnName, rs.getDouble(columnName)); break; case Types.FLOAT: case Types.REAL: - row.add(metaData.getColumnName(i), rs.getFloat(metaData.getColumnName(i))); + row.add(columnName, rs.getFloat(columnName)); break; case Types.SMALLINT: - row.add(metaData.getColumnName(i), rs.getShort(metaData.getColumnName(i))); + row.add(columnName, rs.getShort(columnName)); break; case Types.TINYINT: - row.add(metaData.getColumnName(i), rs.getByte(metaData.getColumnName(i))); + row.add(columnName, rs.getByte(columnName)); break; case Types.BIGINT: - row.add(metaData.getColumnName(i), rs.getLong(metaData.getColumnName(i))); + row.add(columnName, rs.getLong(columnName)); break; case Types.TIMESTAMP: - row.add(metaData.getColumnName(i), rs.getTimestamp(metaData.getColumnName(i)).toString()); + row.add(columnName, rs.getTimestamp(columnName).toString()); break; case Types.DATE: - row.add(metaData.getColumnName(i), (rs.getDate(metaData.getColumnName(i)) != null) ? rs - .getDate(metaData.getColumnName(i)).toString() : ""); + row.add(columnName, rs.getDate(columnName).toString()); break; case Types.TIME: - row.add(metaData.getColumnName(i), rs.getTime(metaData.getColumnName(i)).toString()); + row.add(columnName, rs.getTime(columnName).toString()); break; default: - String columnName = rs.getString(metaData.getColumnName(i)); - if (columnName != null) { - row.add(metaData.getColumnName(i), columnName); - } else { - row.add(metaData.getColumnName(i), ""); - } + row.add(columnName, rs.getString(columnName)); break; } } catch (SQLException | java.lang.NullPointerException e) { - LOGGER.error("Failed to get data by type", e.toString()); + LOGGER.error("Failed to get data by type", e); throw new RuntimeException(e); } return row; diff --git a/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java b/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java index a058b2c..c76172f 100644 --- a/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java +++ b/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java @@ -29,12 +29,11 @@ public void execute(ExecutionParameters parameters) { final JsonObject configuration = parameters.getConfiguration(); final JsonObject body = parameters.getMessage().getBody(); JsonObject snapshot = parameters.getSnapshot(); + JsonObject resultRow; String tableName; String dbEngine; String schemaName = ""; - ResultSet rs = null; String primaryKey = ""; - StringBuilder primaryValue = new StringBuilder(); int primaryKeysCount = 0; if (configuration.containsKey(PROPERTY_TABLE_NAME) @@ -57,9 +56,8 @@ public void execute(ExecutionParameters parameters) { LOGGER.info("Executing lookup primary key"); boolean isOracle = dbEngine.equals(Engines.ORACLE.name().toLowerCase()); - Connection connection = Utils.getConnection(configuration); - try { + try (Connection connection = Utils.getConnection(configuration)) { DatabaseMetaData dbMetaData = connection.getMetaData(); if (tableName.contains(".")) { schemaName = @@ -67,57 +65,38 @@ public void execute(ExecutionParameters parameters) { tableName = (isOracle) ? tableName.split("\\.")[1].toUpperCase() : tableName.split("\\.")[1]; } - rs = dbMetaData + try (ResultSet rs = dbMetaData .getPrimaryKeys(null, ((isOracle && !schemaName.isEmpty()) ? schemaName : null), - tableName); - while (rs.next()) { - primaryKey = rs.getString("COLUMN_NAME"); - primaryKeysCount++; - } - if (primaryKeysCount == 1) { - LOGGER.info("Executing upsert row by primary key action"); - for (Map.Entry entry : body.entrySet()) { - if (entry.getKey().equals(primaryKey)) { - LOGGER.info("Primary key{} = {}", entry.getKey(), entry.getValue()); - primaryValue.append(entry.getValue()); - } + tableName)) { + while (rs.next()) { + primaryKey = rs.getString("COLUMN_NAME"); + primaryKeysCount++; + } + if (primaryKeysCount == 1) { + LOGGER.info("Executing upsert row by primary key action"); + Utils.columnTypes = Utils.getColumnTypes(connection, isOracle, tableName); + LOGGER.info("Detected column types: " + Utils.columnTypes); + QueryFactory queryFactory = new QueryFactory(); + Query query = queryFactory.getQuery(dbEngine); + LOGGER + .info("Execute upsert parameters by PK: '{}' = {}", primaryKey, body.get(primaryKey)); + query.from(tableName); + resultRow = query.executeUpsert(connection, primaryKey, body); + LOGGER.info("Emit data= {}", resultRow); + parameters.getEventEmitter().emitData(new Message.Builder().body(resultRow).build()); + snapshot = Json.createObjectBuilder().add(PROPERTY_TABLE_NAME, tableName).build(); + LOGGER.info("Emitting new snapshot {}", snapshot.toString()); + parameters.getEventEmitter().emitSnapshot(snapshot); + } else if (primaryKeysCount == 0) { + LOGGER.error("Error: Table has not Primary Key. Should be one Primary Key"); + throw new IllegalStateException("Table has not Primary Key. Should be one Primary Key"); + } else { + LOGGER.error("Error: Composite Primary Key is not supported"); + throw new IllegalStateException("Composite Primary Key is not supported"); } - Utils.columnTypes = Utils.getColumnTypes(connection, isOracle, tableName); - LOGGER.info("Detected column types: " + Utils.columnTypes); - QueryFactory queryFactory = new QueryFactory(); - Query query = queryFactory.getQuery(dbEngine); - LOGGER - .info("Execute upsert parameters by PK: {} = {}", primaryKey, primaryValue.toString()); - query.from(tableName).executeUpsert(connection, primaryKey, body); - LOGGER.info("Emit data= {}", body.toString()); - parameters.getEventEmitter().emitData(new Message.Builder().body(body).build()); - snapshot = Json.createObjectBuilder().add(PROPERTY_TABLE_NAME, tableName).build(); - LOGGER.info("Emitting new snapshot {}", snapshot.toString()); - parameters.getEventEmitter().emitSnapshot(snapshot); - } else if (primaryKeysCount == 0) { - LOGGER.error("Error: Table has not Primary Key. Should be one Primary Key"); - throw new IllegalStateException("Table has not Primary Key. Should be one Primary Key"); - } else { - LOGGER.error("Error: Composite Primary Key is not supported"); - throw new IllegalStateException("Composite Primary Key is not supported"); } } catch (SQLException e) { throw new RuntimeException(e); - } finally { - if (rs != null) { - try { - rs.close(); - } catch (SQLException e) { - LOGGER.info("Failed to close result set {}", e); - } - } - if (connection != null) { - try { - connection.close(); - } catch (SQLException e) { - LOGGER.info("Failed to close connection {}", e); - } - } } } } diff --git a/src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionMSSQLSpec.groovy b/src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionMSSQLSpec.groovy index 16c48c6..3723658 100644 --- a/src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionMSSQLSpec.groovy +++ b/src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionMSSQLSpec.groovy @@ -4,6 +4,7 @@ import io.elastic.api.EventEmitter import io.elastic.api.ExecutionParameters import io.elastic.api.Message import io.elastic.jdbc.actions.DeleteRowByPrimaryKey +import org.junit.Ignore import spock.lang.Shared import spock.lang.Specification @@ -13,20 +14,19 @@ import java.sql.Connection import java.sql.DriverManager import java.sql.ResultSet -//@Ignore +@Ignore class DeleteActionMSSQLSpec extends Specification { @Shared - def user = "john"//System.getenv("CONN_USER_MSSQL") + def user = System.getenv("CONN_USER_MSSQL") @Shared - def password = "elastic123"//System.getenv("CONN_PASSWORD_MSSQL") + def password = System.getenv("CONN_PASSWORD_MSSQL") @Shared - def databaseName = "Test2"//System.getenv("CONN_DBNAME_MSSQL") + def databaseName = System.getenv("CONN_DBNAME_MSSQL") @Shared - def host = "eio-mssql-fra.c79g081qpeyv.eu-central-1.rds.amazonaws.com" -//System.getenv("CONN_HOST_MSSQL") + def host = System.getenv("CONN_HOST_MSSQL") @Shared - def port = "1433"//System.getenv("CONN_PORT_MSSQL") + def port = System.getenv("CONN_PORT_MSSQL") @Shared def connectionString = "jdbc:sqlserver://" + host + ":" + port + ";database=" + databaseName @Shared diff --git a/src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionMySQLSpec.groovy b/src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionMySQLSpec.groovy index dee6798..7fb6b50 100644 --- a/src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionMySQLSpec.groovy +++ b/src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionMySQLSpec.groovy @@ -4,6 +4,7 @@ import io.elastic.api.EventEmitter import io.elastic.api.ExecutionParameters import io.elastic.api.Message import io.elastic.jdbc.actions.DeleteRowByPrimaryKey +import org.junit.Ignore import spock.lang.Shared import spock.lang.Specification @@ -13,24 +14,23 @@ import java.sql.Connection import java.sql.DriverManager import java.sql.ResultSet -//@Ignore +@Ignore class DeleteActionMySQLSpec extends Specification { @Shared - def user = "elasticio"//System.getenv("CONN_USER_MSSQL") + def user = System.getenv("CONN_USER_MYSQL") @Shared - def password = "lo4hDacS5L"//System.getenv("CONN_PASSWORD_MSSQL") + def password = System.getenv("CONN_PASSWORD_MYSQL") @Shared - def databaseName = "elasticio_testdb"//System.getenv("CONN_DBNAME_MSSQL") + def databaseName = System.getenv("CONN_DBNAME_MYSQL") @Shared - def host = "ec2-18-194-228-22.eu-central-1.compute.amazonaws.com" -//System.getenv("CONN_HOST_MSSQL") + def host = System.getenv("CONN_HOST_MYSQL") @Shared - def port = "3306"//System.getenv("CONN_PORT_MSSQL") + def port = System.getenv("CONN_PORT_MYSQL") @Shared - def dbEngine = "mysql"//System.getenv("CONN_DBENGINE_MSSQL") + def dbEngine = "mysql" @Shared - def connectionString = "jdbc:" + dbEngine + "://" + host + ":" + port + "/" + databaseName + "?useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC" + def connectionString ="jdbc:" + dbEngine + "://" + host + ":" + port + "/" + databaseName + "?useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC" @Shared Connection connection diff --git a/src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionOracleSpec.groovy b/src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionOracleSpec.groovy index ff34392..0af8589 100644 --- a/src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionOracleSpec.groovy +++ b/src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionOracleSpec.groovy @@ -4,6 +4,7 @@ import io.elastic.api.EventEmitter import io.elastic.api.ExecutionParameters import io.elastic.api.Message import io.elastic.jdbc.actions.DeleteRowByPrimaryKey +import org.junit.Ignore import spock.lang.Shared import spock.lang.Specification @@ -13,24 +14,23 @@ import java.sql.Connection import java.sql.DriverManager import java.sql.ResultSet -//@Ignore +@Ignore class DeleteActionOracleSpec extends Specification { @Shared - def user = "elasticio"//System.getenv("CONN_USER_ORACLE") + def user = System.getenv("CONN_USER_ORACLE") @Shared - def password = "PeU13cbKtH"//System.getenv("CONN_PASSWORD_ORACLE") + def password = System.getenv("CONN_PASSWORD_ORACLE") @Shared - def databaseName = "elasticio_testdb"//System.getenv("CONN_DBNAME_ORACLE") + def databaseName = System.getenv("CONN_DBNAME_ORACLE") @Shared - def host = "ec2-18-194-228-22.eu-central-1.compute.amazonaws.com" -//System.getenv("CONN_HOST_ORACLE") + def host = System.getenv("CONN_HOST_ORACLE") @Shared - def port = "1521"//System.getenv("CONN_PORT_ORACLE") + def port = System.getenv("CONN_PORT_ORACLE") @Shared - def dbEngine = "oracle"//System.getenv("CONN_DBENGINE_ORACLE") + def dbEngine = "oracle" @Shared - def connectionString = "jdbc:oracle:thin:@//" + host + ":" + port + "/XE" + def connectionString ="jdbc:oracle:thin:@//" + host + ":" + port + "/XE" @Shared Connection connection diff --git a/src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionPostrgeSpec.groovy b/src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionPostrgeSpec.groovy index b9c2c3f..f65fa67 100644 --- a/src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionPostrgeSpec.groovy +++ b/src/test/groovy/io/elastic/jdbc/actions/delete/DeleteActionPostrgeSpec.groovy @@ -4,6 +4,7 @@ import io.elastic.api.EventEmitter import io.elastic.api.ExecutionParameters import io.elastic.api.Message import io.elastic.jdbc.actions.DeleteRowByPrimaryKey +import org.junit.Ignore import spock.lang.Shared import spock.lang.Specification @@ -13,24 +14,23 @@ import java.sql.Connection import java.sql.DriverManager import java.sql.ResultSet -//@Ignore +@Ignore class DeleteActionPostrgeSpec extends Specification { @Shared - def user = "elasticio"//System.getenv("CONN_USER_ORACLE") + def user = System.getenv("CONN_USER_POSTGRESQL") @Shared - def password = "2uDyG4hHxR"//System.getenv("CONN_PASSWORD_ORACLE") + def password = System.getenv("CONN_PASSWORD_POSTGRESQL") @Shared - def databaseName = "elasticio_testdb"//System.getenv("CONN_DBNAME_ORACLE") + def databaseName = System.getenv("CONN_DBNAME_POSTGRESQL") @Shared - def host = "ec2-18-194-228-22.eu-central-1.compute.amazonaws.com" -//System.getenv("CONN_HOST_ORACLE") + def host = System.getenv("CONN_HOST_POSTGRESQL") @Shared - def port = "5432"//System.getenv("CONN_PORT_ORACLE") + def port = System.getenv("CONN_PORT_POSTGRESQL") @Shared def dbEngine = "postgresql" @Shared - def connectionString = "jdbc:postgresql://" + host + ":" + port + "/" + databaseName + def connectionString ="jdbc:postgresql://"+ host + ":" + port + "/" + databaseName @Shared Connection connection diff --git a/src/test/groovy/io/elastic/jdbc/actions/upsert/UpsertRowByPrimaryKeyMSSQLSpec.groovy b/src/test/groovy/io/elastic/jdbc/actions/upsert/UpsertRowByPrimaryKeyMSSQLSpec.groovy index 6967de5..417778b 100644 --- a/src/test/groovy/io/elastic/jdbc/actions/upsert/UpsertRowByPrimaryKeyMSSQLSpec.groovy +++ b/src/test/groovy/io/elastic/jdbc/actions/upsert/UpsertRowByPrimaryKeyMSSQLSpec.groovy @@ -16,15 +16,15 @@ import java.sql.ResultSet class UpsertRowByPrimaryKeyMSSQLSpec extends Specification { @Shared - def user = "john"//System.getenv("CONN_USER_MSSQL") + def user = System.getenv("CONN_USER_MSSQL") @Shared - def password = "elastic123"//System.getenv("CONN_PASSWORD_MSSQL") + def password = System.getenv("CONN_PASSWORD_MSSQL") @Shared - def databaseName = "Test2"//System.getenv("CONN_DBNAME_MSSQL") + def databaseName = System.getenv("CONN_DBNAME_MSSQL") @Shared - def host = "eio-mssql-fra.c79g081qpeyv.eu-central-1.rds.amazonaws.com"//System.getenv("CONN_HOST_MSSQL") + def host = System.getenv("CONN_HOST_MSSQL") @Shared - def port = "1433"//System.getenv("CONN_PORT_MSSQL") + def port = System.getenv("CONN_PORT_MSSQL") @Shared def connectionString ="jdbc:sqlserver://" + host + ":" + port + ";database=" + databaseName @Shared From 5e9e6b20e93ee1c99371414a3fadf68663a94654 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Fri, 14 Sep 2018 14:52:16 +0300 Subject: [PATCH 54/56] Reformat code --- src/main/java/io/elastic/jdbc/Utils.java | 11 ++++++----- .../elastic/jdbc/actions/UpsertRowByPrimaryKey.java | 2 -- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/Utils.java b/src/main/java/io/elastic/jdbc/Utils.java index 5f1b3fe..99fddc9 100644 --- a/src/main/java/io/elastic/jdbc/Utils.java +++ b/src/main/java/io/elastic/jdbc/Utils.java @@ -241,8 +241,8 @@ public static Map getVariableTypes(String sqlQuery) { public static JsonObjectBuilder getColumnDataByType(ResultSet rs, ResultSetMetaData metaData, int i, JsonObjectBuilder row) { try { - final String columnName = metaData.getColumnName(i); - if(null==rs.getObject(columnName)){ + final String columnName = metaData.getColumnName(i); + if (null == rs.getObject(columnName)) { row.add(columnName, JsonValue.NULL); return row; } @@ -262,7 +262,7 @@ public static JsonObjectBuilder getColumnDataByType(ResultSet rs, ResultSetMetaD break; case Types.NUMERIC: case Types.DECIMAL: - row.add(columnName, (rs.getBigDecimal(columnName)!=null)); + row.add(columnName, (rs.getBigDecimal(columnName) != null)); break; case Types.DOUBLE: row.add(columnName, rs.getDouble(columnName)); @@ -328,8 +328,9 @@ public static JsonObject getLookupRow(Connection connection, JsonObject body, St } } - public static boolean isRecordExists (Connection connection, JsonObject body, String sql, String lookupField) throws SQLException{ - try (PreparedStatement stmt = connection.prepareStatement(sql)){ + public static boolean isRecordExists(Connection connection, JsonObject body, String sql, + String lookupField) throws SQLException { + try (PreparedStatement stmt = connection.prepareStatement(sql)) { Utils.setStatementParam(stmt, 1, lookupField, body); try (ResultSet rs = stmt.executeQuery()) { rs.next(); diff --git a/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java b/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java index c76172f..a5de42e 100644 --- a/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java +++ b/src/main/java/io/elastic/jdbc/actions/UpsertRowByPrimaryKey.java @@ -11,10 +11,8 @@ import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.Map; import javax.json.Json; import javax.json.JsonObject; -import javax.json.JsonValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; From 56a6ed54d664188d6a20533d8bb7083c8d13e543 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Fri, 14 Sep 2018 14:59:04 +0300 Subject: [PATCH 55/56] Delete Empty emitting from triggers --- .../elastic/jdbc/triggers/GetRowsPollingTrigger.java | 11 +---------- .../java/io/elastic/jdbc/triggers/SelectTrigger.java | 9 --------- 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/src/main/java/io/elastic/jdbc/triggers/GetRowsPollingTrigger.java b/src/main/java/io/elastic/jdbc/triggers/GetRowsPollingTrigger.java index 7004404..63f02a7 100644 --- a/src/main/java/io/elastic/jdbc/triggers/GetRowsPollingTrigger.java +++ b/src/main/java/io/elastic/jdbc/triggers/GetRowsPollingTrigger.java @@ -83,6 +83,7 @@ public final void execute(ExecutionParameters parameters) { .rowsPolling(pollingField, pollingValue); query.setMaxPollingValue(cts); ArrayList resultList = query.executePolling(connection); + for (int i = 0; i < resultList.size(); i++) { LOGGER.info("Columns count: {} from {}", i + 1, resultList.size()); LOGGER.info("Emitting data {}", resultList.get(i).toString()); @@ -90,16 +91,6 @@ public final void execute(ExecutionParameters parameters) { .emitData(new Message.Builder().body(resultList.get(i)).build()); } - if (resultList.size() == 0) { - resultList.add(Json.createObjectBuilder() - .add("empty dataset", "no data") - .build()); - LOGGER.info("Emitting empty data"); - query.setMaxPollingValue(new java.sql.Timestamp(System.currentTimeMillis())); - parameters.getEventEmitter() - .emitData(new Message.Builder().body(resultList.get(0)).build()); - } - formattedDate = new SimpleDateFormat(PROPERTY_DATETIME_FORMAT) .format(query.getMaxPollingValue()); diff --git a/src/main/java/io/elastic/jdbc/triggers/SelectTrigger.java b/src/main/java/io/elastic/jdbc/triggers/SelectTrigger.java index 1155fb1..27a0118 100644 --- a/src/main/java/io/elastic/jdbc/triggers/SelectTrigger.java +++ b/src/main/java/io/elastic/jdbc/triggers/SelectTrigger.java @@ -84,15 +84,6 @@ public final void execute(ExecutionParameters parameters) { .emitData(new Message.Builder().body(resultList.get(i)).build()); } - if (resultList.size() == 0) { - resultList.add(Json.createObjectBuilder() - .add("empty dataset", "no data") - .build()); - LOGGER.info("Emitting data {}", resultList.get(0).toString()); - parameters.getEventEmitter() - .emitData(new Message.Builder().body(resultList.get(0)).build()); - } - snapshot = Json.createObjectBuilder() .add(PROPERTY_SKIP_NUMBER, skipNumber + resultList.size()) .add(LAST_POLL_PLACEHOLDER, pollingValue.toString()) From 67d39b98885e9c311d379c8b7fab10784e483e88 Mon Sep 17 00:00:00 2001 From: Olha Virolainen Date: Fri, 14 Sep 2018 15:06:30 +0300 Subject: [PATCH 56/56] Ignore test --- .../jdbc/actions/upsert/UpsertRowByPrimaryKeyMSSQLSpec.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/groovy/io/elastic/jdbc/actions/upsert/UpsertRowByPrimaryKeyMSSQLSpec.groovy b/src/test/groovy/io/elastic/jdbc/actions/upsert/UpsertRowByPrimaryKeyMSSQLSpec.groovy index 417778b..51bc280 100644 --- a/src/test/groovy/io/elastic/jdbc/actions/upsert/UpsertRowByPrimaryKeyMSSQLSpec.groovy +++ b/src/test/groovy/io/elastic/jdbc/actions/upsert/UpsertRowByPrimaryKeyMSSQLSpec.groovy @@ -12,7 +12,7 @@ import java.sql.Connection import java.sql.DriverManager import java.sql.ResultSet -//@Ignore +@Ignore class UpsertRowByPrimaryKeyMSSQLSpec extends Specification { @Shared