mirror of
https://github.com/CodePhiliaX/Chat2DB.git
synced 2025-09-24 23:55:57 +08:00
support view trigger producer function
This commit is contained in:
@ -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;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user