Skip to content

Commit e61520b

Browse files
Updated IDEMPOTENT_ADD_FOREIGN_KEY procedure and fixed some foreign keys to keep proper names
1 parent 204aa3e commit e61520b

File tree

4 files changed

+25
-31
lines changed

4 files changed

+25
-31
lines changed

engine/schema/src/main/java/com/cloud/upgrade/dao/DatabaseAccessObject.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,17 @@ public class DatabaseAccessObject {
2626

2727
private static Logger s_logger = Logger.getLogger(DatabaseAccessObject.class);
2828

29+
public void addForeignKey(Connection conn, String tableName, String tableColumn, String foreignTableName, String foreignColumnName) {
30+
String addForeignKeyStmt = String.format("CALL `cloud`.`IDEMPOTENT_ADD_FOREIGN_KEY`('%s', '%s', '%s', '%s')", tableName, tableColumn, foreignTableName, foreignColumnName);
31+
try(PreparedStatement pstmt = conn.prepareStatement(addForeignKeyStmt);)
32+
{
33+
pstmt.executeUpdate();
34+
s_logger.debug(String.format("Foreign key is added successfully from the table %s", tableName));
35+
} catch (SQLException e) {
36+
s_logger.error("Ignored SQL Exception when trying to add foreign key on table " + tableName + " exception: " + e.getMessage());
37+
}
38+
}
39+
2940
public void dropKey(Connection conn, String tableName, String key, boolean isForeignKey)
3041
{
3142
String alter_sql_str;

engine/schema/src/main/java/com/cloud/upgrade/dao/DbUpgradeUtils.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ public class DbUpgradeUtils {
2323

2424
private static DatabaseAccessObject dao = new DatabaseAccessObject();
2525

26-
public static void dropKeysIfExist(Connection conn, String tableName, List<String> keys, boolean isForeignKey) {
26+
public static void addForeignKey(Connection conn, String tableName, String tableColumn, String foreignTableName, String foreignColumnName) {
27+
dao.addForeignKey(conn, tableName, tableColumn, foreignTableName, foreignColumnName);
28+
}
29+
public static void dropKeysIfExist(Connection conn, String tableName, List<String> keys, boolean isForeignKey) {
2730
for (String key : keys) {
2831
dao.dropKey(conn, tableName, key, isForeignKey);
2932
}

engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41810to41900.java

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
2222

2323
import java.io.InputStream;
2424
import java.sql.Connection;
25-
import java.sql.PreparedStatement;
26-
import java.sql.SQLException;
2725
import java.util.ArrayList;
2826
import java.util.List;
2927

@@ -59,7 +57,7 @@ public InputStream[] getPrepareScripts() {
5957

6058
@Override
6159
public void performDataMigration(Connection conn) {
62-
fixIndexes(conn);
60+
fixForeignKeyNames(conn);
6361
}
6462

6563
@Override
@@ -88,47 +86,29 @@ public void updateSystemVmTemplates(Connection conn) {
8886
}
8987
}
9088

91-
private void fixIndexes(Connection conn) {
89+
private void fixForeignKeyNames(Connection conn) {
9290
//Alter foreign key name for user_vm table from fk_user_data_id to fk_user_vm__user_data_id (if exists) and re-add it again
9391
List<String> keys = new ArrayList<String>();
9492
keys.add("fk_user_data_id");
93+
keys.add("fk_user_vm_user_data_id");
9594
DbUpgradeUtils.dropKeysIfExist(conn, "cloud.user_vm", keys, true);
9695
DbUpgradeUtils.dropKeysIfExist(conn, "cloud.user_vm", keys, false);
97-
try {
98-
PreparedStatement pstmt = conn.prepareStatement(
99-
"CALL `cloud`.`IDEMPOTENT_ADD_FOREIGN_KEY`('cloud.user_vm', 'user_data', 'id');");
100-
pstmt.execute();
101-
pstmt.close();
102-
} catch (SQLException e) {
103-
LOG.error("Unable to update foreign key in user_vm table ", e);
104-
}
96+
DbUpgradeUtils.addForeignKey(conn, "user_vm", "user_data_id", "user_data", "id");
10597

10698
//Alter foreign key name for vm_template table from fk_user_data_id to fk_vm_template__user_data_id (if exists) and re-add it again
10799
keys = new ArrayList<>();
108100
keys.add("fk_user_data_id");
101+
keys.add("fk_vm_template_user_data_id");
109102
DbUpgradeUtils.dropKeysIfExist(conn, "cloud.vm_template", keys, true);
110103
DbUpgradeUtils.dropKeysIfExist(conn, "cloud.vm_template", keys, false);
111-
try {
112-
PreparedStatement pstmt = conn.prepareStatement(
113-
"CALL `cloud`.`IDEMPOTENT_ADD_FOREIGN_KEY`('cloud.vm_template', 'user_data', 'id');");
114-
pstmt.execute();
115-
pstmt.close();
116-
} catch (SQLException e) {
117-
LOG.error("Unable to update foreign key in user_vm table ", e);
118-
}
104+
DbUpgradeUtils.addForeignKey(conn, "vm_template", "user_data_id", "user_data", "id");
119105

120106
//Alter foreign key name for volumes table from fk_passphrase_id to fk_volumes__passphrase_id (if exists) and re-add it again
121107
keys = new ArrayList<>();
122108
keys.add("fk_passphrase_id");
109+
keys.add("fk_volumes_passphrase_id");
123110
DbUpgradeUtils.dropKeysIfExist(conn, "cloud.volumes", keys, true);
124111
DbUpgradeUtils.dropKeysIfExist(conn, "cloud.volumes", keys, false);
125-
try {
126-
PreparedStatement pstmt = conn.prepareStatement(
127-
"CALL `cloud`.`IDEMPOTENT_ADD_FOREIGN_KEY`('cloud.volumes', 'passphrase', 'id');");
128-
pstmt.execute();
129-
pstmt.close();
130-
} catch (SQLException e) {
131-
LOG.error("Unable to update foreign key in volumes table ", e);
132-
}
112+
DbUpgradeUtils.addForeignKey(conn, "volumes", "passphrase_id","passphrase", "id");
133113
}
134114
}

engine/schema/src/main/resources/META-INF/db/schema-41810to41900.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@
2222
DROP PROCEDURE IF EXISTS `cloud`.`IDEMPOTENT_ADD_FOREIGN_KEY`;
2323
CREATE PROCEDURE `cloud`.`IDEMPOTENT_ADD_FOREIGN_KEY` (
2424
IN in_table_name VARCHAR(200),
25+
IN in_table_column VARCHAR(200),
2526
IN in_foreign_table_name VARCHAR(200),
2627
IN in_foreign_column_name VARCHAR(200)
2728
)
2829
BEGIN
29-
DECLARE CONTINUE HANDLER FOR 1005,1826 BEGIN END; SET @ddl = CONCAT('ALTER TABLE ', in_table_name); SET @ddl = CONCAT(@ddl, ' ', ' ADD CONSTRAINT '); SET @ddl = CONCAT(@ddl, 'fk_', in_table_name, '__', in_foreign_table_name, '_', in_foreign_column_name); SET @ddl = CONCAT(@ddl, ' FOREIGN KEY (', in_foreign_table_name, '_', in_foreign_column_name, ')'); SET @ddl = CONCAT(@ddl, ' REFERENCES ', in_foreign_table_name, '(', in_foreign_column_name, ')'); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; END;
30-
30+
DECLARE CONTINUE HANDLER FOR 1005,1826 BEGIN END; SET @ddl = CONCAT('ALTER TABLE cloud.', in_table_name); SET @ddl = CONCAT(@ddl, ' ', ' ADD CONSTRAINT '); SET @ddl = CONCAT(@ddl, 'fk_', in_table_name, '__', in_foreign_table_name, '_', in_foreign_column_name); SET @ddl = CONCAT(@ddl, ' FOREIGN KEY (', in_table_column, ')'); SET @ddl = CONCAT(@ddl, ' REFERENCES ', in_foreign_table_name, '(', in_foreign_column_name, ')'); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; END;

0 commit comments

Comments
 (0)