Skip to content

Commit 601a360

Browse files
Updated IDEMPOTENT_ADD_FOREIGN_KEY procedure and fixed some foreign keys to keep proper names
1 parent 1d0762e commit 601a360

File tree

4 files changed

+53
-1
lines changed

4 files changed

+53
-1
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/Upgrade41800to41810.java

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

2323
import java.io.InputStream;
2424
import java.sql.Connection;
25+
import java.util.ArrayList;
26+
import java.util.List;
2527

2628
public class Upgrade41800to41810 implements DbUpgrade, DbUpgradeSystemVmTemplate {
2729
final static Logger LOG = Logger.getLogger(Upgrade41800to41810.class);
@@ -55,6 +57,7 @@ public InputStream[] getPrepareScripts() {
5557

5658
@Override
5759
public void performDataMigration(Connection conn) {
60+
fixForeignKeyNames(conn);
5861
}
5962

6063
@Override
@@ -82,4 +85,30 @@ public void updateSystemVmTemplates(Connection conn) {
8285
throw new CloudRuntimeException("Failed to find / register SystemVM template(s)");
8386
}
8487
}
88+
89+
private void fixForeignKeyNames(Connection conn) {
90+
//Alter foreign key name for user_vm table from fk_user_data_id to fk_user_vm__user_data_id (if exists)
91+
List<String> keys = new ArrayList<String>();
92+
keys.add("fk_user_data_id");
93+
keys.add("fk_user_vm__user_data_id");
94+
DbUpgradeUtils.dropKeysIfExist(conn, "cloud.user_vm", keys, true);
95+
DbUpgradeUtils.dropKeysIfExist(conn, "cloud.user_vm", keys, false);
96+
DbUpgradeUtils.addForeignKey(conn, "user_vm", "user_data_id", "user_data", "id");
97+
98+
//Alter foreign key name for vm_template table from fk_user_data_id to fk_vm_template__user_data_id (if exists)
99+
keys = new ArrayList<>();
100+
keys.add("fk_user_data_id");
101+
keys.add("fk_vm_template__user_data_id");
102+
DbUpgradeUtils.dropKeysIfExist(conn, "cloud.vm_template", keys, true);
103+
DbUpgradeUtils.dropKeysIfExist(conn, "cloud.vm_template", keys, false);
104+
DbUpgradeUtils.addForeignKey(conn, "vm_template", "user_data_id", "user_data", "id");
105+
106+
//Alter foreign key name for volumes table from fk_passphrase_id to fk_volumes__passphrase_id (if exists)
107+
keys = new ArrayList<>();
108+
keys.add("fk_passphrase_id");
109+
keys.add("fk_volumes__passphrase_id");
110+
DbUpgradeUtils.dropKeysIfExist(conn, "cloud.volumes", keys, true);
111+
DbUpgradeUtils.dropKeysIfExist(conn, "cloud.volumes", keys, false);
112+
DbUpgradeUtils.addForeignKey(conn, "volumes", "passphrase_id","passphrase", "id");
113+
}
85114
}

engine/schema/src/main/resources/META-INF/db/schema-41800to41810.sql

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,12 @@
1919
-- Schema upgrade from 4.18.0.0 to 4.18.1.0
2020
--;
2121

22+
DROP PROCEDURE IF EXISTS `cloud`.`IDEMPOTENT_ADD_FOREIGN_KEY`;
23+
CREATE PROCEDURE `cloud`.`IDEMPOTENT_ADD_FOREIGN_KEY` (
24+
IN in_table_name VARCHAR(200),
25+
IN in_table_column VARCHAR(200),
26+
IN in_foreign_table_name VARCHAR(200),
27+
IN in_foreign_column_name VARCHAR(200)
28+
)
29+
BEGIN
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)