From 55b5f3536c7d92d27629bd39257407db02c7437e Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Fri, 1 Jul 2022 14:54:03 -0500 Subject: [PATCH] open all connections inside try-with-resources --- .../rdbms/actions/RDBMSDeleteAction.java | 20 ++--- .../rdbms/actions/RDBMSInsertAction.java | 22 +++--- .../rdbms/actions/RDBMSQueryAction.java | 64 ++++++++-------- .../rdbms/actions/RDBMSUpdateAction.java | 76 ++++++++++--------- 4 files changed, 96 insertions(+), 86 deletions(-) diff --git a/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSDeleteAction.java b/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSDeleteAction.java index 3495a621..ee75105d 100644 --- a/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSDeleteAction.java +++ b/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSDeleteAction.java @@ -65,16 +65,18 @@ public class RDBMSDeleteAction extends AbstractRDBMSAction implements DeleteInte // todo sql customization - can edit sql and/or param list - Connection connection = getConnection(deleteRequest); - QueryManager.executeUpdateForRowCount(connection, sql, params); - List outputRecords = new ArrayList<>(); - rs.setRecords(outputRecords); - for(Serializable primaryKey : deleteRequest.getPrimaryKeys()) + try(Connection connection = getConnection(deleteRequest)) { - QRecord qRecord = new QRecord().withTableName(deleteRequest.getTableName()).withValue("id", primaryKey); - // todo uh, identify any errors? - QRecord outputRecord = new QRecord(qRecord); - outputRecords.add(outputRecord); + QueryManager.executeUpdateForRowCount(connection, sql, params); + List outputRecords = new ArrayList<>(); + rs.setRecords(outputRecords); + for(Serializable primaryKey : deleteRequest.getPrimaryKeys()) + { + QRecord qRecord = new QRecord().withTableName(deleteRequest.getTableName()).withValue("id", primaryKey); + // todo uh, identify any errors? + QRecord outputRecord = new QRecord(qRecord); + outputRecords.add(outputRecord); + } } return rs; diff --git a/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSInsertAction.java b/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSInsertAction.java index c55fff9f..7b04c329 100644 --- a/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSInsertAction.java +++ b/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSInsertAction.java @@ -99,17 +99,19 @@ public class RDBMSInsertAction extends AbstractRDBMSAction implements InsertInte // todo - non-serial-id style tables // todo - other generated values, e.g., createDate... maybe need to re-select? - Connection connection = getConnection(insertRequest); - List idList = QueryManager.executeInsertForGeneratedIds(connection, sql.toString(), params); - List outputRecords = new ArrayList<>(); - rs.setRecords(outputRecords); - int index = 0; - for(QRecord record : insertRequest.getRecords()) + try(Connection connection = getConnection(insertRequest)) { - Integer id = idList.get(index++); - QRecord outputRecord = new QRecord(record); - outputRecord.setValue(table.getPrimaryKeyField(), id); - outputRecords.add(outputRecord); + List idList = QueryManager.executeInsertForGeneratedIds(connection, sql.toString(), params); + List outputRecords = new ArrayList<>(); + rs.setRecords(outputRecords); + int index = 0; + for(QRecord record : insertRequest.getRecords()) + { + Integer id = idList.get(index++); + QRecord outputRecord = new QRecord(record); + outputRecord.setValue(table.getPrimaryKeyField(), id); + outputRecords.add(outputRecord); + } } return rs; diff --git a/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryAction.java b/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryAction.java index 6c892ee8..f4027e55 100644 --- a/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryAction.java +++ b/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryAction.java @@ -56,6 +56,8 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf { private static final Logger LOG = LogManager.getLogger(RDBMSQueryAction.class); + + /******************************************************************************* ** *******************************************************************************/ @@ -63,8 +65,8 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf { try { - QTableMetaData table = queryRequest.getTable(); - String tableName = getTableName(table); + QTableMetaData table = queryRequest.getTable(); + String tableName = getTableName(table); List fieldList = new ArrayList<>(table.getFields().values()); String columns = fieldList.stream() @@ -73,7 +75,7 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf String sql = "SELECT " + columns + " FROM " + tableName; - QQueryFilter filter = queryRequest.getFilter(); + QQueryFilter filter = queryRequest.getFilter(); List params = new ArrayList<>(); if(filter != null && CollectionUtils.nullSafeHasContents(filter.getCriteria())) { @@ -98,33 +100,35 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf // todo sql customization - can edit sql and/or param list - QueryResult rs = new QueryResult(); + QueryResult rs = new QueryResult(); List records = new ArrayList<>(); rs.setRecords(records); - Connection connection = getConnection(queryRequest); - QueryManager.executeStatement(connection, sql, ((ResultSet resultSet) -> + try(Connection connection = getConnection(queryRequest)) { - ResultSetMetaData metaData = resultSet.getMetaData(); - while(resultSet.next()) + QueryManager.executeStatement(connection, sql, ((ResultSet resultSet) -> { - // todo - should refactor this for view etc to use too. - // todo - Add display values (String labels for possibleValues, formatted #'s, etc) - QRecord record = new QRecord(); - records.add(record); - record.setTableName(table.getName()); - LinkedHashMap values = new LinkedHashMap<>(); - record.setValues(values); - - for(int i = 1; i <= metaData.getColumnCount(); i++) + ResultSetMetaData metaData = resultSet.getMetaData(); + while(resultSet.next()) { - QFieldMetaData qFieldMetaData = fieldList.get(i - 1); - Serializable value = getValue(qFieldMetaData, resultSet, i); - values.put(qFieldMetaData.getName(), value); - } - } + // todo - should refactor this for view etc to use too. + // todo - Add display values (String labels for possibleValues, formatted #'s, etc) + QRecord record = new QRecord(); + records.add(record); + record.setTableName(table.getName()); + LinkedHashMap values = new LinkedHashMap<>(); + record.setValues(values); - }), params); + for(int i = 1; i <= metaData.getColumnCount(); i++) + { + QFieldMetaData qFieldMetaData = fieldList.get(i - 1); + Serializable value = getValue(qFieldMetaData, resultSet, i); + values.put(qFieldMetaData.getName(), value); + } + } + + }), params); + } return rs; } @@ -185,11 +189,11 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf List clauses = new ArrayList<>(); for(QFilterCriteria criterion : criteria) { - QFieldMetaData field = table.getField(criterion.getFieldName()); - List values = criterion.getValues() == null ? new ArrayList<>() : new ArrayList<>(criterion.getValues()); - String column = getColumnName(field); - String clause = column; - Integer expectedNoOfParams = null; + QFieldMetaData field = table.getField(criterion.getFieldName()); + List values = criterion.getValues() == null ? new ArrayList<>() : new ArrayList<>(criterion.getValues()); + String column = getColumnName(field); + String clause = column; + Integer expectedNoOfParams = null; switch(criterion.getOperator()) { case EQUALS: @@ -366,8 +370,8 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf for(QFilterOrderBy orderBy : orderBys) { - QFieldMetaData field = table.getField(orderBy.getFieldName()); - String column = getColumnName(field); + QFieldMetaData field = table.getField(orderBy.getFieldName()); + String column = getColumnName(field); clauses.add(column + " " + (orderBy.getIsAscending() ? "ASC" : "DESC")); } return (String.join(", ", clauses)); diff --git a/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSUpdateAction.java b/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSUpdateAction.java index c9bdb280..806c7407 100644 --- a/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSUpdateAction.java +++ b/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSUpdateAction.java @@ -58,47 +58,49 @@ public class RDBMSUpdateAction extends AbstractRDBMSAction implements UpdateInte // todo - sql batch for performance // todo - if setting a bunch of records to have the same value, a single update where id IN? - Connection connection = getConnection(updateRequest); - int recordIndex = 0; - for(QRecord record : updateRequest.getRecords()) + try(Connection connection = getConnection(updateRequest)) { - List updateableFields = table.getFields().values().stream() - .filter(field -> !field.getName().equals("id")) // todo - intent here is to avoid non-updateable fields. - .filter(field -> record.getValues().containsKey(field.getName())) - .toList(); - - String columns = updateableFields.stream() - .map(f -> this.getColumnName(f) + " = ?") - .collect(Collectors.joining(", ")); - - String tableName = getTableName(table); - StringBuilder sql = new StringBuilder("UPDATE ").append(tableName) - .append(" SET ").append(columns) - .append(" WHERE ").append(getColumnName(table.getField(table.getPrimaryKeyField()))).append(" = ?"); - - // todo sql customization - can edit sql and/or param list - - QRecord outputRecord = new QRecord(record); - outputRecords.add(outputRecord); - - try + int recordIndex = 0; + for(QRecord record : updateRequest.getRecords()) { - List params = new ArrayList<>(); - for(QFieldMetaData field : updateableFields) + List updateableFields = table.getFields().values().stream() + .filter(field -> !field.getName().equals("id")) // todo - intent here is to avoid non-updateable fields. + .filter(field -> record.getValues().containsKey(field.getName())) + .toList(); + + String columns = updateableFields.stream() + .map(f -> this.getColumnName(f) + " = ?") + .collect(Collectors.joining(", ")); + + String tableName = getTableName(table); + StringBuilder sql = new StringBuilder("UPDATE ").append(tableName) + .append(" SET ").append(columns) + .append(" WHERE ").append(getColumnName(table.getField(table.getPrimaryKeyField()))).append(" = ?"); + + // todo sql customization - can edit sql and/or param list + + QRecord outputRecord = new QRecord(record); + outputRecords.add(outputRecord); + + try { - Serializable value = record.getValue(field.getName()); - value = scrubValue(field, value); - params.add(value); - } - params.add(record.getValue(table.getPrimaryKeyField())); + List params = new ArrayList<>(); + for(QFieldMetaData field : updateableFields) + { + Serializable value = record.getValue(field.getName()); + value = scrubValue(field, value); + params.add(value); + } + params.add(record.getValue(table.getPrimaryKeyField())); - QueryManager.executeUpdate(connection, sql.toString(), params); - // todo - auto-updated values, e.g., modifyDate... maybe need to re-select? - } - catch(Exception e) - { - // todo - how to communicate errors??? outputRecord.setErrors(new ArrayList<>(List.of(e))); - throw new QException("Error executing update: " + e.getMessage(), e); + QueryManager.executeUpdate(connection, sql.toString(), params); + // todo - auto-updated values, e.g., modifyDate... maybe need to re-select? + } + catch(Exception e) + { + // todo - how to communicate errors??? outputRecord.setErrors(new ArrayList<>(List.of(e))); + throw new QException("Error executing update: " + e.getMessage(), e); + } } }