diff --git a/dotCMS/src/main/java/com/dotmarketing/business/PermissionBitFactoryImpl.java b/dotCMS/src/main/java/com/dotmarketing/business/PermissionBitFactoryImpl.java index 241d0af58e1c..12044ce5acb6 100644 --- a/dotCMS/src/main/java/com/dotmarketing/business/PermissionBitFactoryImpl.java +++ b/dotCMS/src/main/java/com/dotmarketing/business/PermissionBitFactoryImpl.java @@ -2291,10 +2291,20 @@ private void deleteInsertPermission(Permissionable permissionable, String type, if((inodeList != null && inodeList.size()>0) || (identifierList!=null && identifierList.size()>0)){ dc1.executeUpdate(DELETE_PERMISSIONABLE_REFERENCE_SQL, permissionId); - String query = SQLUtil.generateUpsertSQL("permission_reference", "asset_id", "?", - new String[]{"id","asset_id","reference_id","permission_type"}, - new String[]{"nextval('permission_reference_seq')","?", "?", "?"}); - dc1.executeUpdate(query, permissionId, newReference.getPermissionId(), type, permissionId, newReference.getPermissionId(), type); + if (DbConnectionFactory.isPostgres()) { + String query = SQLUtil.generateUpsertSQL("permission_reference", "asset_id", null, + new String[]{"id", "asset_id", "reference_id", "permission_type"}, + new String[]{"nextval('permission_reference_seq')", "?", "?", "?"}); + dc1.executeUpdate(query, permissionId, newReference.getPermissionId(), type, + permissionId, newReference.getPermissionId(), type); + } + if (DbConnectionFactory.isMySql()) { + String query = SQLUtil.generateUpsertSQL("permission_reference", "asset_id", null, + new String[]{"asset_id", "reference_id", "permission_type"}, + new String[]{"?", "?", "?"}); + dc1.executeUpdate(query, permissionId, newReference.getPermissionId(), type, + permissionId, newReference.getPermissionId(), type); + } } } catch(Exception exception){ diff --git a/dotCMS/src/main/java/com/dotmarketing/common/util/SQLUtil.java b/dotCMS/src/main/java/com/dotmarketing/common/util/SQLUtil.java index 217065efcb01..b95c4d40a865 100644 --- a/dotCMS/src/main/java/com/dotmarketing/common/util/SQLUtil.java +++ b/dotCMS/src/main/java/com/dotmarketing/common/util/SQLUtil.java @@ -315,21 +315,35 @@ private static boolean isValidSQLCharacter (final char c) { + "VALUES (%s) ON CONFLICT (%s) " + "DO UPDATE SET %s"; + private final static String MYSQL_UPSERT_QUERY = + "INSERT INTO %s (%s) " + + "VALUES (%s) ON DUPLICATE KEY " + + "UPDATE %s"; + public static String generateUpsertSQL (String table, String conditionalColumn, String conditionalValue, String[] columns, String[] values) { String query = null; - if (DbConnectionFactory.isPostgres()) { - StringBuffer buffer = new StringBuffer(); - for (int i = 0; i < columns.length; i++) { - buffer.append(columns[i] + " = " + values[i]); - if (i < (columns.length -1)) { - buffer.append(", "); - } + //Generate column = value pairs, used for the Update part + StringBuffer buffer = new StringBuffer(); + for (int i = 0; i < columns.length; i++) { + buffer.append(columns[i] + " = " + values[i]); + if (i < (columns.length -1)) { + buffer.append(", "); } + } + + if (DbConnectionFactory.isPostgres()) { query = String.format(POSTGRES_UPSERT_QUERY, table, StringUtil.merge(columns), StringUtil.merge(values), - conditionalColumn, buffer.toString()); + conditionalColumn, + buffer.toString()); + } + if (DbConnectionFactory.isMySql()) { + query = String.format(MYSQL_UPSERT_QUERY, table, + StringUtil.merge(columns), + StringUtil.merge(values), + buffer.toString()); } return query;