open all connections inside try-with-resources

This commit is contained in:
2022-07-01 14:54:03 -05:00
parent 5c6ea4732a
commit 55b5f3536c
4 changed files with 96 additions and 86 deletions

View File

@ -65,16 +65,18 @@ public class RDBMSDeleteAction extends AbstractRDBMSAction implements DeleteInte
// todo sql customization - can edit sql and/or param list // todo sql customization - can edit sql and/or param list
Connection connection = getConnection(deleteRequest); try(Connection connection = getConnection(deleteRequest))
QueryManager.executeUpdateForRowCount(connection, sql, params);
List<QRecord> outputRecords = new ArrayList<>();
rs.setRecords(outputRecords);
for(Serializable primaryKey : deleteRequest.getPrimaryKeys())
{ {
QRecord qRecord = new QRecord().withTableName(deleteRequest.getTableName()).withValue("id", primaryKey); QueryManager.executeUpdateForRowCount(connection, sql, params);
// todo uh, identify any errors? List<QRecord> outputRecords = new ArrayList<>();
QRecord outputRecord = new QRecord(qRecord); rs.setRecords(outputRecords);
outputRecords.add(outputRecord); 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; return rs;

View File

@ -99,17 +99,19 @@ public class RDBMSInsertAction extends AbstractRDBMSAction implements InsertInte
// todo - non-serial-id style tables // todo - non-serial-id style tables
// todo - other generated values, e.g., createDate... maybe need to re-select? // todo - other generated values, e.g., createDate... maybe need to re-select?
Connection connection = getConnection(insertRequest); try(Connection connection = getConnection(insertRequest))
List<Integer> idList = QueryManager.executeInsertForGeneratedIds(connection, sql.toString(), params);
List<QRecord> outputRecords = new ArrayList<>();
rs.setRecords(outputRecords);
int index = 0;
for(QRecord record : insertRequest.getRecords())
{ {
Integer id = idList.get(index++); List<Integer> idList = QueryManager.executeInsertForGeneratedIds(connection, sql.toString(), params);
QRecord outputRecord = new QRecord(record); List<QRecord> outputRecords = new ArrayList<>();
outputRecord.setValue(table.getPrimaryKeyField(), id); rs.setRecords(outputRecords);
outputRecords.add(outputRecord); 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; return rs;

View File

@ -56,6 +56,8 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf
{ {
private static final Logger LOG = LogManager.getLogger(RDBMSQueryAction.class); private static final Logger LOG = LogManager.getLogger(RDBMSQueryAction.class);
/******************************************************************************* /*******************************************************************************
** **
*******************************************************************************/ *******************************************************************************/
@ -63,8 +65,8 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf
{ {
try try
{ {
QTableMetaData table = queryRequest.getTable(); QTableMetaData table = queryRequest.getTable();
String tableName = getTableName(table); String tableName = getTableName(table);
List<QFieldMetaData> fieldList = new ArrayList<>(table.getFields().values()); List<QFieldMetaData> fieldList = new ArrayList<>(table.getFields().values());
String columns = fieldList.stream() String columns = fieldList.stream()
@ -73,7 +75,7 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf
String sql = "SELECT " + columns + " FROM " + tableName; String sql = "SELECT " + columns + " FROM " + tableName;
QQueryFilter filter = queryRequest.getFilter(); QQueryFilter filter = queryRequest.getFilter();
List<Serializable> params = new ArrayList<>(); List<Serializable> params = new ArrayList<>();
if(filter != null && CollectionUtils.nullSafeHasContents(filter.getCriteria())) 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 // todo sql customization - can edit sql and/or param list
QueryResult rs = new QueryResult(); QueryResult rs = new QueryResult();
List<QRecord> records = new ArrayList<>(); List<QRecord> records = new ArrayList<>();
rs.setRecords(records); rs.setRecords(records);
Connection connection = getConnection(queryRequest); try(Connection connection = getConnection(queryRequest))
QueryManager.executeStatement(connection, sql, ((ResultSet resultSet) ->
{ {
ResultSetMetaData metaData = resultSet.getMetaData(); QueryManager.executeStatement(connection, sql, ((ResultSet resultSet) ->
while(resultSet.next())
{ {
// todo - should refactor this for view etc to use too. ResultSetMetaData metaData = resultSet.getMetaData();
// todo - Add display values (String labels for possibleValues, formatted #'s, etc) while(resultSet.next())
QRecord record = new QRecord();
records.add(record);
record.setTableName(table.getName());
LinkedHashMap<String, Serializable> values = new LinkedHashMap<>();
record.setValues(values);
for(int i = 1; i <= metaData.getColumnCount(); i++)
{ {
QFieldMetaData qFieldMetaData = fieldList.get(i - 1); // todo - should refactor this for view etc to use too.
Serializable value = getValue(qFieldMetaData, resultSet, i); // todo - Add display values (String labels for possibleValues, formatted #'s, etc)
values.put(qFieldMetaData.getName(), value); QRecord record = new QRecord();
} records.add(record);
} record.setTableName(table.getName());
LinkedHashMap<String, Serializable> 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; return rs;
} }
@ -185,11 +189,11 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf
List<String> clauses = new ArrayList<>(); List<String> clauses = new ArrayList<>();
for(QFilterCriteria criterion : criteria) for(QFilterCriteria criterion : criteria)
{ {
QFieldMetaData field = table.getField(criterion.getFieldName()); QFieldMetaData field = table.getField(criterion.getFieldName());
List<Serializable> values = criterion.getValues() == null ? new ArrayList<>() : new ArrayList<>(criterion.getValues()); List<Serializable> values = criterion.getValues() == null ? new ArrayList<>() : new ArrayList<>(criterion.getValues());
String column = getColumnName(field); String column = getColumnName(field);
String clause = column; String clause = column;
Integer expectedNoOfParams = null; Integer expectedNoOfParams = null;
switch(criterion.getOperator()) switch(criterion.getOperator())
{ {
case EQUALS: case EQUALS:
@ -366,8 +370,8 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf
for(QFilterOrderBy orderBy : orderBys) for(QFilterOrderBy orderBy : orderBys)
{ {
QFieldMetaData field = table.getField(orderBy.getFieldName()); QFieldMetaData field = table.getField(orderBy.getFieldName());
String column = getColumnName(field); String column = getColumnName(field);
clauses.add(column + " " + (orderBy.getIsAscending() ? "ASC" : "DESC")); clauses.add(column + " " + (orderBy.getIsAscending() ? "ASC" : "DESC"));
} }
return (String.join(", ", clauses)); return (String.join(", ", clauses));

View File

@ -58,47 +58,49 @@ public class RDBMSUpdateAction extends AbstractRDBMSAction implements UpdateInte
// todo - sql batch for performance // todo - sql batch for performance
// todo - if setting a bunch of records to have the same value, a single update where id IN? // todo - if setting a bunch of records to have the same value, a single update where id IN?
Connection connection = getConnection(updateRequest); try(Connection connection = getConnection(updateRequest))
int recordIndex = 0;
for(QRecord record : updateRequest.getRecords())
{ {
List<QFieldMetaData> updateableFields = table.getFields().values().stream() int recordIndex = 0;
.filter(field -> !field.getName().equals("id")) // todo - intent here is to avoid non-updateable fields. for(QRecord record : updateRequest.getRecords())
.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
{ {
List<Object> params = new ArrayList<>(); List<QFieldMetaData> updateableFields = table.getFields().values().stream()
for(QFieldMetaData field : updateableFields) .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()); List<Object> params = new ArrayList<>();
value = scrubValue(field, value); for(QFieldMetaData field : updateableFields)
params.add(value); {
} Serializable value = record.getValue(field.getName());
params.add(record.getValue(table.getPrimaryKeyField())); value = scrubValue(field, value);
params.add(value);
}
params.add(record.getValue(table.getPrimaryKeyField()));
QueryManager.executeUpdate(connection, sql.toString(), params); QueryManager.executeUpdate(connection, sql.toString(), params);
// todo - auto-updated values, e.g., modifyDate... maybe need to re-select? // todo - auto-updated values, e.g., modifyDate... maybe need to re-select?
} }
catch(Exception e) catch(Exception e)
{ {
// todo - how to communicate errors??? outputRecord.setErrors(new ArrayList<>(List.of(e))); // todo - how to communicate errors??? outputRecord.setErrors(new ArrayList<>(List.of(e)));
throw new QException("Error executing update: " + e.getMessage(), e); throw new QException("Error executing update: " + e.getMessage(), e);
}
} }
} }