ApplyLobsterMenuRename.java 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import java.sql.*;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. /** Rename lobster workflow menu labels in master + tenant DBs. */
  5. public class ApplyLobsterMenuRename {
  6. private static final String MASTER_HOST = getenv("DB_HOST", "cq-cdb-8fjmemkb.sql.tencentcdb.com");
  7. private static final int MASTER_PORT = Integer.parseInt(getenv("DB_PORT", "27220"));
  8. private static final String MASTER_USER = getenv("DB_USER", "root");
  9. private static final String MASTER_PASSWORD = getenv("DB_PASSWORD", "Ylrz_1q2w3e4r5t6y");
  10. private static final String MASTER_DB = getenv("DB_NAME", "ylrz_saas");
  11. private static final String MASTER_SQL =
  12. "UPDATE sys_menu SET menu_name='\u5de5\u4f5c\u6d41\u6a21\u677f' "
  13. + "WHERE menu_name IN ('\u5de5\u4f5c\u6d41\u6a21\u677f\u5e93','\u5de5\u4f5c\u6d41\u6a21\u677f') "
  14. + "AND (parent_id=2864 OR path IN ('template','company-workflowLobster'));"
  15. + "UPDATE sys_menu SET menu_name='\u5de5\u4f5c\u6d41\u6267\u884c' "
  16. + "WHERE menu_name IN ('\u5de5\u4f5c\u6d41\u6267\u884c\u4efb\u52a1','\u5de5\u4f5c\u6d41\u6267\u884c') "
  17. + "AND (parent_id=2864 OR path='workflow-execution');"
  18. + "UPDATE tenant_sys_menu SET menu_name='\u5de5\u4f5c\u6d41\u6a21\u677f' "
  19. + "WHERE menu_name IN ('\u5de5\u4f5c\u6d41\u6a21\u677f\u5e93','\u5de5\u4f5c\u6d41\u6a21\u677f') "
  20. + "AND (parent_id=29900 OR path IN ('template','company-workflowLobster') OR menu_id IN (29903,32481));"
  21. + "UPDATE tenant_sys_menu SET menu_name='\u5de5\u4f5c\u6d41\u6267\u884c' "
  22. + "WHERE menu_name IN ('\u5de5\u4f5c\u6d41\u6267\u884c\u4efb\u52a1','\u5de5\u4f5c\u6d41\u6267\u884c') "
  23. + "AND (parent_id=29900 OR path='workflow-execution' OR menu_id=29949);"
  24. + "UPDATE tenant_company_menu SET menu_name='\u5de5\u4f5c\u6d41\u6a21\u677f' "
  25. + "WHERE menu_name IN ('\u5de5\u4f5c\u6d41\u6a21\u677f\u5e93','\u5de5\u4f5c\u6d41\u6a21\u677f') "
  26. + "AND (parent_id=29900 OR path IN ('template','company-workflowLobster') OR menu_id IN (29903,32481));"
  27. + "UPDATE tenant_company_menu SET menu_name='\u5de5\u4f5c\u6d41\u6267\u884c' "
  28. + "WHERE menu_name IN ('\u5de5\u4f5c\u6d41\u6267\u884c\u4efb\u52a1','\u5de5\u4f5c\u6d41\u6267\u884c') "
  29. + "AND (parent_id=29900 OR path='workflow-execution' OR menu_id=29949);";
  30. private static final String TENANT_SQL =
  31. "UPDATE sys_menu SET menu_name='\u5de5\u4f5c\u6d41\u6a21\u677f' "
  32. + "WHERE menu_name IN ('\u5de5\u4f5c\u6d41\u6a21\u677f\u5e93','\u5de5\u4f5c\u6d41\u6a21\u677f') "
  33. + "AND (parent_id=29900 OR path IN ('template','company-workflowLobster') OR menu_id IN (29903,32481));"
  34. + "UPDATE sys_menu SET menu_name='\u5de5\u4f5c\u6d41\u6267\u884c' "
  35. + "WHERE menu_name IN ('\u5de5\u4f5c\u6d41\u6267\u884c\u4efb\u52a1','\u5de5\u4f5c\u6d41\u6267\u884c') "
  36. + "AND (parent_id=29900 OR path='workflow-execution' OR menu_id=29949);"
  37. + "UPDATE company_menu SET menu_name='\u5de5\u4f5c\u6d41\u6a21\u677f' "
  38. + "WHERE menu_name IN ('\u5de5\u4f5c\u6d41\u6a21\u677f\u5e93','\u5de5\u4f5c\u6d41\u6a21\u677f') "
  39. + "AND (parent_id=29900 OR path IN ('template','company-workflowLobster') OR menu_id IN (29903,32481));"
  40. + "UPDATE company_menu SET menu_name='\u5de5\u4f5c\u6d41\u6267\u884c' "
  41. + "WHERE menu_name IN ('\u5de5\u4f5c\u6d41\u6267\u884c\u4efb\u52a1','\u5de5\u4f5c\u6d41\u6267\u884c') "
  42. + "AND (parent_id=29900 OR path='workflow-execution' OR menu_id=29949);";
  43. public static void main(String[] args) throws Exception {
  44. try (Connection master = open(MASTER_HOST, MASTER_PORT, MASTER_DB, MASTER_USER, MASTER_PASSWORD)) {
  45. execBatch(master, MASTER_SQL);
  46. System.out.println("[OK] master");
  47. for (Long tenantId : loadActiveTenantIds(master)) {
  48. TenantDb tenant = loadTenant(master, tenantId);
  49. if (tenant == null) continue;
  50. System.out.println("[TENANT] " + tenantId + " -> " + tenant.database);
  51. try (Connection c = open(tenant.host, tenant.port, tenant.database, tenant.user, tenant.password)) {
  52. execBatch(c, TENANT_SQL);
  53. }
  54. System.out.println("[OK] tenant " + tenantId);
  55. }
  56. }
  57. }
  58. private static void execBatch(Connection conn, String sql) throws SQLException {
  59. try (Statement st = conn.createStatement()) {
  60. for (String part : sql.split(";")) {
  61. String s = part.trim();
  62. if (!s.isEmpty()) st.execute(s);
  63. }
  64. }
  65. }
  66. private static List<Long> loadActiveTenantIds(Connection master) throws SQLException {
  67. List<Long> ids = new ArrayList<>();
  68. try (Statement st = master.createStatement();
  69. ResultSet rs = st.executeQuery("SELECT id FROM tenant_info WHERE status = 1 ORDER BY id")) {
  70. while (rs.next()) ids.add(rs.getLong(1));
  71. }
  72. return ids;
  73. }
  74. private static TenantDb loadTenant(Connection master, long tenantId) throws SQLException {
  75. try (PreparedStatement ps = master.prepareStatement(
  76. "SELECT db_url, db_account, db_pwd FROM tenant_info WHERE id = ? AND status = 1 LIMIT 1")) {
  77. ps.setLong(1, tenantId);
  78. try (ResultSet rs = ps.executeQuery()) {
  79. if (!rs.next()) return null;
  80. return parseJdbcUrl(rs.getString("db_url"), rs.getString("db_account"), rs.getString("db_pwd"));
  81. }
  82. }
  83. }
  84. private static TenantDb parseJdbcUrl(String jdbcUrl, String user, String password) {
  85. String body = jdbcUrl.substring("jdbc:mysql://".length());
  86. int slash = body.indexOf('/');
  87. String hostPort = body.substring(0, slash);
  88. String rest = body.substring(slash + 1);
  89. int q = rest.indexOf('?');
  90. String database = q >= 0 ? rest.substring(0, q) : rest;
  91. int colon = hostPort.indexOf(':');
  92. TenantDb t = new TenantDb();
  93. t.host = colon >= 0 ? hostPort.substring(0, colon) : hostPort;
  94. t.port = colon >= 0 ? Integer.parseInt(hostPort.substring(colon + 1)) : 3306;
  95. t.database = database;
  96. t.user = user != null ? user : MASTER_USER;
  97. t.password = password != null ? password : MASTER_PASSWORD;
  98. return t;
  99. }
  100. private static Connection open(String host, int port, String database, String user, String password)
  101. throws SQLException {
  102. return DriverManager.getConnection(
  103. "jdbc:mysql://" + host + ":" + port + "/" + database
  104. + "?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&allowMultiQueries=true",
  105. user, password);
  106. }
  107. private static String getenv(String key, String defaultValue) {
  108. String v = System.getenv(key);
  109. return v != null && !v.isEmpty() ? v : defaultValue;
  110. }
  111. private static final class TenantDb {
  112. String host;
  113. int port;
  114. String database;
  115. String user;
  116. String password;
  117. }
  118. }