From 20a5130757b0d6acaf0ab70d78ec30feda3b6324 Mon Sep 17 00:00:00 2001 From: t-samples Date: Wed, 21 Aug 2024 09:35:33 -0500 Subject: [PATCH] CE-1546 - Moving audit ids to longs and adding general support for long ids --- .../core/actions/audits/AuditAction.java | 2 +- .../model/audits/AuditsMetaDataProvider.java | 10 ++-- .../rdbms/actions/RDBMSInsertAction.java | 6 +-- .../module/rdbms/jdbc/QueryManager.java | 50 +++++++++++++++++-- 4 files changed, 55 insertions(+), 13 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/audits/AuditAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/audits/AuditAction.java index 518718a9..03bb6ebe 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/audits/AuditAction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/audits/AuditAction.java @@ -272,7 +272,7 @@ public class AuditAction extends AbstractQActionFunction auditDetailRecords = new ArrayList<>(); for(AuditSingleInput auditSingleInput : CollectionUtils.nonNullList(input.getAuditSingleInputList())) { - Integer auditId = insertOutput.getRecords().get(i++).getValueInteger("id"); + Long auditId = insertOutput.getRecords().get(i++).getValueLong("id"); if(auditId == null) { LOG.warn("Missing an id for inserted audit - so won't be able to store its child details..."); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/audits/AuditsMetaDataProvider.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/audits/AuditsMetaDataProvider.java index e5aef66a..dfa09698 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/audits/AuditsMetaDataProvider.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/audits/AuditsMetaDataProvider.java @@ -176,7 +176,7 @@ public class AuditsMetaDataProvider .withRecordLabelFields("label") .withPrimaryKeyField("id") .withUniqueKey(new UniqueKey("name")) - .withField(new QFieldMetaData("id", QFieldType.INTEGER)) + .withField(new QFieldMetaData("id", QFieldType.LONG)) .withField(new QFieldMetaData("name", QFieldType.STRING)) .withField(new QFieldMetaData("label", QFieldType.STRING)) .withField(new QFieldMetaData("createDate", QFieldType.DATE_TIME)) @@ -199,7 +199,7 @@ public class AuditsMetaDataProvider .withRecordLabelFields("name") .withPrimaryKeyField("id") .withUniqueKey(new UniqueKey("name")) - .withField(new QFieldMetaData("id", QFieldType.INTEGER)) + .withField(new QFieldMetaData("id", QFieldType.LONG)) .withField(new QFieldMetaData("name", QFieldType.STRING)) .withField(new QFieldMetaData("createDate", QFieldType.DATE_TIME)) .withField(new QFieldMetaData("modifyDate", QFieldType.DATE_TIME)) @@ -220,7 +220,7 @@ public class AuditsMetaDataProvider .withRecordLabelFormat("%s %s") .withRecordLabelFields("auditTableId", "recordId") .withPrimaryKeyField("id") - .withField(new QFieldMetaData("id", QFieldType.INTEGER)) + .withField(new QFieldMetaData("id", QFieldType.LONG)) .withField(new QFieldMetaData("auditTableId", QFieldType.INTEGER).withPossibleValueSourceName(TABLE_NAME_AUDIT_TABLE)) .withField(new QFieldMetaData("auditUserId", QFieldType.INTEGER).withPossibleValueSourceName(TABLE_NAME_AUDIT_USER)) .withField(new QFieldMetaData("recordId", QFieldType.INTEGER)) @@ -243,8 +243,8 @@ public class AuditsMetaDataProvider .withRecordLabelFormat("%s") .withRecordLabelFields("id") .withPrimaryKeyField("id") - .withField(new QFieldMetaData("id", QFieldType.INTEGER)) - .withField(new QFieldMetaData("auditId", QFieldType.INTEGER).withPossibleValueSourceName(TABLE_NAME_AUDIT)) + .withField(new QFieldMetaData("id", QFieldType.LONG)) + .withField(new QFieldMetaData("auditId", QFieldType.LONG).withPossibleValueSourceName(TABLE_NAME_AUDIT)) .withField(new QFieldMetaData("message", QFieldType.STRING).withMaxLength(250).withBehavior(ValueTooLongBehavior.TRUNCATE_ELLIPSIS)) .withField(new QFieldMetaData("fieldName", QFieldType.STRING).withMaxLength(100).withBehavior(ValueTooLongBehavior.TRUNCATE_ELLIPSIS)) .withField(new QFieldMetaData("oldValue", QFieldType.STRING).withMaxLength(250).withBehavior(ValueTooLongBehavior.TRUNCATE_ELLIPSIS)) diff --git a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSInsertAction.java b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSInsertAction.java index b58d1386..e8488b84 100644 --- a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSInsertAction.java +++ b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSInsertAction.java @@ -146,8 +146,8 @@ public class RDBMSInsertAction extends AbstractRDBMSAction implements InsertInte // todo sql customization - can edit sql and/or param list // todo - non-serial-id style tables // todo - other generated values, e.g., createDate... maybe need to re-select? - List idList = QueryManager.executeInsertForGeneratedIds(connection, sql.toString(), params); - int index = 0; + List idList = QueryManager.executeInsertForGeneratedIds(connection, sql.toString(), params, table.getFields()); + int index = 0; for(QRecord record : page) { QRecord outputRecord = new QRecord(record); @@ -155,7 +155,7 @@ public class RDBMSInsertAction extends AbstractRDBMSAction implements InsertInte if(CollectionUtils.nullSafeIsEmpty(record.getErrors())) { - Integer id = idList.get(index++); + Serializable id = idList.get(index++); outputRecord.setValue(table.getPrimaryKeyField(), id); } } diff --git a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/jdbc/QueryManager.java b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/jdbc/QueryManager.java index f1e31ffe..9c345b68 100644 --- a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/jdbc/QueryManager.java +++ b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/jdbc/QueryManager.java @@ -51,8 +51,11 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.logging.QLogger; +import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldType; import com.kingsrook.qqq.backend.core.model.metadata.possiblevalues.PossibleValueEnum; import com.kingsrook.qqq.backend.core.utils.CollectionUtils; import com.kingsrook.qqq.backend.core.utils.StringUtils; @@ -526,18 +529,57 @@ public class QueryManager /******************************************************************************* ** todo - needs (specific) unit test *******************************************************************************/ - public static List executeInsertForGeneratedIds(Connection connection, String sql, List params) throws SQLException + public static List executeInsertForGeneratedIds(Connection connection, String sql, List params, Map fields) throws SQLException { try(PreparedStatement statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { bindParams(params.toArray(), statement); incrementStatistic(STAT_QUERIES_RAN); statement.executeUpdate(); - ResultSet generatedKeys = statement.getGeneratedKeys(); - List rs = new ArrayList<>(); + + ///////////////////////////////////////////////////////////// + // We default to idType of INTEGER but if we are passed in // + // fields attempt to find the dataType of the id field // + ///////////////////////////////////////////////////////////// + QFieldType idType = QFieldType.INTEGER; + if(fields != null && !fields.isEmpty()) + { + Optional field = fields.values().stream() + .filter(f -> f.getName().equals("id")) + .findFirst(); + + if(field.isPresent()) + { + ///////////////////////////////////////////////////////// + // if we find "id" field get the type and use it below // + ///////////////////////////////////////////////////////// + idType = field.get().getType(); + } + } + + ResultSet generatedKeys = statement.getGeneratedKeys(); + List rs = new ArrayList<>(); while(generatedKeys.next()) { - rs.add(getInteger(generatedKeys, 1)); + switch(idType) + { + case INTEGER: + { + rs.add(getInteger(generatedKeys, 1)); + break; + } + case LONG: + { + rs.add(getLong(generatedKeys, 1)); + break; + } + default: + { + LOG.warn("Unknown id data type, attempting to getInteger.", logPair("sql", sql)); + rs.add(getInteger(generatedKeys, 1)); + break; + } + } } return (rs); }