support view trigger producer function

This commit is contained in:
jipengfei-jpf
2023-08-13 17:36:56 +08:00
parent d1639eaa03
commit b0e041f286
3 changed files with 229 additions and 11 deletions

View File

@ -2,19 +2,26 @@ package ai.chat2db.plugin.dm;
import java.sql.Connection; import java.sql.Connection;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import ai.chat2db.spi.MetaData; import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.jdbc.DefaultMetaService; import ai.chat2db.spi.jdbc.DefaultMetaService;
import ai.chat2db.spi.model.Function;
import ai.chat2db.spi.model.Procedure;
import ai.chat2db.spi.model.Table;
import ai.chat2db.spi.model.Trigger;
import ai.chat2db.spi.sql.SQLExecutor; import ai.chat2db.spi.sql.SQLExecutor;
import ai.chat2db.spi.util.SqlUtils; import ai.chat2db.spi.util.SqlUtils;
import jakarta.validation.constraints.NotEmpty;
public class DMMetaData extends DefaultMetaService implements MetaData { public class DMMetaData extends DefaultMetaService implements MetaData {
public String tableDDL(Connection connection, String databaseName, String schemaName, String tableName) { public String tableDDL(Connection connection, String databaseName, String schemaName, String tableName) {
String selectObjectDDLSQL = String.format( String selectObjectDDLSQL = String.format(
"select dbms_metadata.get_ddl(%s, %s, %s) AS \"sql\" from dual", "select dbms_metadata.get_ddl(%s, %s, %s) AS \"sql\" from dual",
SqlUtils.formatSQLString("TABLE"), SqlUtils.formatSQLString(tableName), SqlUtils.formatSQLString("TABLE"), SqlUtils.formatSQLString(tableName),
SqlUtils.formatSQLString(schemaName)); SqlUtils.formatSQLString(schemaName));
return SQLExecutor.getInstance().executeSql(connection,selectObjectDDLSQL, resultSet -> { return SQLExecutor.getInstance().executeSql(connection, selectObjectDDLSQL, resultSet -> {
try { try {
if (resultSet.next()) { if (resultSet.next()) {
return resultSet.getString("sql"); return resultSet.getString("sql");
@ -25,4 +32,103 @@ public class DMMetaData extends DefaultMetaService implements MetaData {
return null; return null;
}); });
} }
private static String ROUTINES_SQL
= "SELECT OWNER, NAME, TEXT FROM ALL_SOURCE WHERE TYPE = '%s' AND NAME = '%s' AND NAME = '%s' ORDER BY LINE";
@Override
public Function function(Connection connection, @NotEmpty String databaseName, String schemaName,
String functionName) {
String sql = String.format(ROUTINES_SQL, "PROC",schemaName, functionName);
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
StringBuilder sb = new StringBuilder();
while (resultSet.next()) {
sb.append(resultSet.getString("TEXT") + "\n");
}
Function function = new Function();
function.setDatabaseName(databaseName);
function.setSchemaName(schemaName);
function.setFunctionName(functionName);
function.setFunctionBody(sb.toString());
return function;
});
}
@Override
public Procedure procedure(Connection connection, @NotEmpty String databaseName, String schemaName,
String procedureName) {
String sql = String.format(ROUTINES_SQL, "PROC", schemaName,procedureName);
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
StringBuilder sb = new StringBuilder();
while (resultSet.next()) {
sb.append(resultSet.getString("TEXT") + "\n");
}
Procedure procedure = new Procedure();
procedure.setDatabaseName(databaseName);
procedure.setSchemaName(schemaName);
procedure.setProcedureName(procedureName);
procedure.setProcedureBody(sb.toString());
return procedure;
});
}
private static String TRIGGER_SQL
= "SELECT OWNER, TRIGGER_NAME, TABLE_OWNER, TABLE_NAME, TRIGGER_TYPE, TRIGGERING_EVENT, STATUS, TRIGGER_BODY "
+ "FROM ALL_TRIGGERS WHERE OWNER = '%s' AND TRIGGER_NAME = '%s'";
private static String TRIGGER_SQL_LIST = "SELECT OWNER, TRIGGER_NAME FROM ALL_TRIGGERS WHERE OWNER = '%s'";
@Override
public List<Trigger> triggers(Connection connection, String databaseName, String schemaName) {
List<Trigger> triggers = new ArrayList<>();
String sql = String.format(TRIGGER_SQL_LIST, schemaName);
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
while (resultSet.next()) {
Trigger trigger = new Trigger();
trigger.setTriggerName(resultSet.getString("TRIGGER_NAME"));
trigger.setSchemaName(schemaName);
trigger.setDatabaseName(databaseName);
triggers.add(trigger);
}
return triggers;
});
}
@Override
public Trigger trigger(Connection connection, @NotEmpty String databaseName, String schemaName,
String triggerName) {
String sql = String.format(TRIGGER_SQL, schemaName, triggerName);
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
Trigger trigger = new Trigger();
trigger.setDatabaseName(databaseName);
trigger.setSchemaName(schemaName);
trigger.setTriggerName(triggerName);
if (resultSet.next()) {
trigger.setTriggerBody(resultSet.getString("TRIGGER_BODY"));
}
return trigger;
});
}
private static String VIEW_SQL
= "SELECT OWNER, VIEW_NAME, TEXT FROM ALL_VIEWS WHERE OWNER = '%s' AND VIEW_NAME = '%s'";
@Override
public Table view(Connection connection, String databaseName, String schemaName, String viewName) {
String sql = String.format(VIEW_SQL, schemaName, viewName);
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
Table table = new Table();
table.setDatabaseName(databaseName);
table.setSchemaName(schemaName);
table.setName(viewName);
if (resultSet.next()) {
table.setDdl(resultSet.getString("TEXT"));
}
return table;
});
}
} }

View File

@ -94,7 +94,7 @@ public class H2Meta extends DefaultMetaService implements MetaData {
private static String ROUTINES_SQL private static String ROUTINES_SQL
= =
"SELECT SPECIFIC_NAME, ROUTINE_COMMENT, ROUTINE_DEFINITION FROM information_schema.routines WHERE " "SELECT SPECIFIC_NAME, ROUTINE_DEFINITION FROM information_schema.routines WHERE "
+ "routine_type = '%s' AND ROUTINE_SCHEMA ='%s' AND " + "routine_type = '%s' AND ROUTINE_SCHEMA ='%s' AND "
+ "routine_name = '%s';"; + "routine_name = '%s';";
@ -110,7 +110,6 @@ public class H2Meta extends DefaultMetaService implements MetaData {
function.setFunctionName(functionName); function.setFunctionName(functionName);
if (resultSet.next()) { if (resultSet.next()) {
function.setSpecificName(resultSet.getString("SPECIFIC_NAME")); function.setSpecificName(resultSet.getString("SPECIFIC_NAME"));
function.setRemarks(resultSet.getString("ROUTINE_COMMENT"));
function.setFunctionBody(resultSet.getString("ROUTINE_DEFINITION")); function.setFunctionBody(resultSet.getString("ROUTINE_DEFINITION"));
} }
@ -120,16 +119,16 @@ public class H2Meta extends DefaultMetaService implements MetaData {
} }
private static String TRIGGER_SQL private static String TRIGGER_SQL
= "SELECT TRIGGER_NAME,EVENT_MANIPULATION, ACTION_STATEMENT FROM INFORMATION_SCHEMA.TRIGGERS where " = "SELECT TRIGGER_NAME,JAVA_CLASS FROM INFORMATION_SCHEMA.TRIGGERS where "
+ "TRIGGER_SCHEMA = '%s' AND TRIGGER_NAME = '%s';"; + "TRIGGER_SCHEMA = '%s' AND TRIGGER_NAME = '%s';";
private static String TRIGGER_SQL_LIST private static String TRIGGER_SQL_LIST
= "SELECT TRIGGER_NAME FROM INFORMATION_SCHEMA.TRIGGERS where TRIGGER_SCHEMA = '%s';"; = "SELECT TRIGGER_NAME FROM INFORMATION_SCHEMA.TRIGGERS where TRIGGER_CATALOG = '%s' AND TRIGGER_SCHEMA = '%s';";
@Override @Override
public List<Trigger> triggers(Connection connection, String databaseName, String schemaName) { public List<Trigger> triggers(Connection connection, String databaseName, String schemaName) {
List<Trigger> triggers = new ArrayList<>(); List<Trigger> triggers = new ArrayList<>();
String sql = String.format(TRIGGER_SQL_LIST, databaseName); String sql = String.format(TRIGGER_SQL_LIST, databaseName,schemaName);
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
while (resultSet.next()) { while (resultSet.next()) {
Trigger trigger = new Trigger(); Trigger trigger = new Trigger();
@ -153,7 +152,7 @@ public class H2Meta extends DefaultMetaService implements MetaData {
trigger.setSchemaName(schemaName); trigger.setSchemaName(schemaName);
trigger.setTriggerName(triggerName); trigger.setTriggerName(triggerName);
if (resultSet.next()) { if (resultSet.next()) {
trigger.setTriggerBody(resultSet.getString("ACTION_STATEMENT")); trigger.setTriggerBody(resultSet.getString("JAVA_CLASS"));
} }
return trigger; return trigger;
}); });
@ -170,7 +169,6 @@ public class H2Meta extends DefaultMetaService implements MetaData {
procedure.setProcedureName(procedureName); procedure.setProcedureName(procedureName);
if (resultSet.next()) { if (resultSet.next()) {
procedure.setSpecificName(resultSet.getString("SPECIFIC_NAME")); procedure.setSpecificName(resultSet.getString("SPECIFIC_NAME"));
procedure.setRemarks(resultSet.getString("ROUTINE_COMMENT"));
procedure.setProcedureBody(resultSet.getString("ROUTINE_DEFINITION")); procedure.setProcedureBody(resultSet.getString("ROUTINE_DEFINITION"));
} }
return procedure; return procedure;

View File

@ -1,7 +1,121 @@
package ai.chat2db.plugin.mariadb; package ai.chat2db.plugin.mariadb;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
import ai.chat2db.spi.MetaData; import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.jdbc.DefaultMetaService; import ai.chat2db.spi.jdbc.DefaultMetaService;
import ai.chat2db.spi.model.Function;
import ai.chat2db.spi.model.Procedure;
import ai.chat2db.spi.model.Table;
import ai.chat2db.spi.model.Trigger;
import ai.chat2db.spi.sql.SQLExecutor;
import jakarta.validation.constraints.NotEmpty;
public class MariaDBMetaData extends DefaultMetaService implements MetaData { public class MariaDBMetaData extends DefaultMetaService implements MetaData {
private static String ROUTINES_SQL
=
"SELECT SPECIFIC_NAME, ROUTINE_COMMENT, ROUTINE_DEFINITION FROM information_schema.routines WHERE "
+ "routine_type = '%s' AND ROUTINE_SCHEMA ='%s' AND "
+ "routine_name = '%s';";
@Override
public Function function(Connection connection, @NotEmpty String databaseName, String schemaName,
String functionName) {
String sql = String.format(ROUTINES_SQL, "FUNCTION", databaseName, functionName);
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
Function function = new Function();
function.setDatabaseName(databaseName);
function.setSchemaName(schemaName);
function.setFunctionName(functionName);
if (resultSet.next()) {
function.setSpecificName(resultSet.getString("SPECIFIC_NAME"));
function.setRemarks(resultSet.getString("ROUTINE_COMMENT"));
function.setFunctionBody(resultSet.getString("ROUTINE_DEFINITION"));
}
return function;
});
}
private static String TRIGGER_SQL
= "SELECT TRIGGER_NAME,EVENT_MANIPULATION, ACTION_STATEMENT FROM INFORMATION_SCHEMA.TRIGGERS where "
+ "TRIGGER_SCHEMA = '%s' AND TRIGGER_NAME = '%s';";
private static String TRIGGER_SQL_LIST
= "SELECT TRIGGER_NAME FROM INFORMATION_SCHEMA.TRIGGERS where TRIGGER_SCHEMA = '%s';";
@Override
public List<Trigger> triggers(Connection connection, String databaseName, String schemaName) {
List<Trigger> triggers = new ArrayList<>();
String sql = String.format(TRIGGER_SQL_LIST, databaseName);
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
while (resultSet.next()) {
Trigger trigger = new Trigger();
trigger.setTriggerName(resultSet.getString("TRIGGER_NAME"));
trigger.setSchemaName(schemaName);
trigger.setDatabaseName(databaseName);
triggers.add(trigger);
}
return triggers;
});
}
@Override
public Trigger trigger(Connection connection, @NotEmpty String databaseName, String schemaName,
String triggerName) {
String sql = String.format(TRIGGER_SQL, databaseName, triggerName);
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
Trigger trigger = new Trigger();
trigger.setDatabaseName(databaseName);
trigger.setSchemaName(schemaName);
trigger.setTriggerName(triggerName);
if (resultSet.next()) {
trigger.setTriggerBody(resultSet.getString("ACTION_STATEMENT"));
}
return trigger;
});
}
@Override
public Procedure procedure(Connection connection, @NotEmpty String databaseName, String schemaName,
String procedureName) {
String sql = String.format(ROUTINES_SQL, "PROCEDURE", databaseName, procedureName);
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
Procedure procedure = new Procedure();
procedure.setDatabaseName(databaseName);
procedure.setSchemaName(schemaName);
procedure.setProcedureName(procedureName);
if (resultSet.next()) {
procedure.setSpecificName(resultSet.getString("SPECIFIC_NAME"));
procedure.setRemarks(resultSet.getString("ROUTINE_COMMENT"));
procedure.setProcedureBody(resultSet.getString("ROUTINE_DEFINITION"));
}
return procedure;
});
}
private static String VIEW_SQL
= "SELECT TABLE_SCHEMA AS DatabaseName, TABLE_NAME AS ViewName, VIEW_DEFINITION AS definition, CHECK_OPTION, "
+ "IS_UPDATABLE FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = '%s' AND TABLE_NAME = '%s';";
@Override
public Table view(Connection connection, String databaseName, String schemaName, String viewName) {
String sql = String.format(VIEW_SQL, databaseName, viewName);
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
Table table = new Table();
table.setDatabaseName(databaseName);
table.setSchemaName(schemaName);
table.setName(viewName);
if (resultSet.next()) {
table.setDdl(resultSet.getString("definition"));
}
return table;
});
}
} }