Update and delete operations of procedures

This commit is contained in:
suyue
2024-07-30 18:36:27 +08:00
parent cc00466c8e
commit 052a36b73e
15 changed files with 557 additions and 32 deletions

View File

@ -18,9 +18,13 @@ import static cn.hutool.core.date.DatePattern.NORM_DATETIME_PATTERN;
@Slf4j
public class MysqlDBManage extends DefaultDBManage implements DBManage {
private static String PROCEDURE_SQL = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.ROUTINES " +
"WHERE ROUTINE_SCHEMA = '%s' AND ROUTINE_NAME = '%s' AND ROUTINE_TYPE = 'PROCEDURE'";
@Override
public void exportDatabase(Connection connection, String databaseName, String schemaName, AsyncContext asyncContext) throws SQLException {
asyncContext.write(String.format(EXPORT_TITLE, DateUtil.format(new Date(),NORM_DATETIME_PATTERN)));
asyncContext.write(String.format(EXPORT_TITLE, DateUtil.format(new Date(), NORM_DATETIME_PATTERN)));
exportTables(connection, databaseName, schemaName, asyncContext);
asyncContext.setProgress(50);
exportViews(connection, databaseName, asyncContext);
@ -82,9 +86,9 @@ public class MysqlDBManage extends DefaultDBManage implements DBManage {
exportTableData(connection, databaseName, schemaName, tableName, asyncContext);
}
}
}catch (Exception e){
} catch (Exception e) {
log.error("export table error", e);
asyncContext.error(String.format("export table %s error:%s", tableName,e.getMessage()));
asyncContext.error(String.format("export table %s error:%s", tableName, e.getMessage()));
}
}
@ -160,9 +164,29 @@ public class MysqlDBManage extends DefaultDBManage implements DBManage {
@Override
public void updateProcedure(Connection connection, String databaseName, String schemaName, Procedure procedure) throws SQLException {
try {
String sql = "DROP PROCEDURE " + procedure.getProcedureName();
SQLExecutor.getInstance().execute(connection, sql, resultSet -> {});
connection.setAutoCommit(false);
String procedureBody = procedure.getProcedureBody();
if (procedureBody == null || !procedureBody.trim().toUpperCase().startsWith("CREATE")) {
throw new IllegalArgumentException("No CREATE statement found.");
}
String procedureNewName = getSchemaOrProcedureName(procedureBody, databaseName, procedure);
if (!procedureNewName.equals(procedure.getProcedureName())) {
procedureBody = procedureBody.replace(procedure.getProcedureName(), procedureNewName);
}
String checkProcedureSQL = String.format(PROCEDURE_SQL, databaseName, procedure.getProcedureName());
SQLExecutor.getInstance().execute(connection, checkProcedureSQL, resultSet -> {
try {
if (resultSet.next()) {
int count = resultSet.getInt(1);
if (count >= 1) {
throw new Exception("Procedure already exists");
}
}
} catch (Exception e) {
e.printStackTrace();
}
});
SQLExecutor.getInstance().execute(connection, procedureBody, resultSet -> {});
} catch (Exception e) {
connection.rollback();
@ -192,6 +216,21 @@ public class MysqlDBManage extends DefaultDBManage implements DBManage {
SQLExecutor.getInstance().execute(connection, sql, resultSet -> null);
}
@Override
public void deleteProcedure(Connection connection, String databaseName, String schemaName, Procedure procedure) {
String procedureNewName = getSchemaOrProcedureName(procedure.getProcedureBody(), databaseName, procedure);
String sql = "DROP PROCEDURE " + procedureNewName;
SQLExecutor.getInstance().execute(connection, sql, resultSet -> null);
}
private static String getSchemaOrProcedureName(String procedureBody, String schemaName, Procedure procedure) {
if (procedureBody.toLowerCase().contains(schemaName.toLowerCase())) {
return procedure.getProcedureName();
} else {
return schemaName + "." + procedure.getProcedureName();
}
}
public static String format(String tableName) {
return "`" + tableName + "`";
}