Skip to content

Commit 86dc991

Browse files
committed
merge
2 parents 18fb08a + 603dcfc commit 86dc991

15 files changed

Lines changed: 627 additions & 432 deletions

File tree

chat2db-client/src/components/Console/MonacoEditor/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ function MonacoEditor(props: IProps, ref: ForwardedRef<IExportRefFunction>) {
215215
return Object.keys(hintData).map((key) => ({
216216
label: key,
217217
kind: monaco.languages.CompletionItemKind.Method,
218-
insertText: `\`${key}\``,
218+
insertText: `${key}`,
219219
detail: '<Database>',
220220
}));
221221
};

chat2db-server/chat2db-plugins/chat2db-h2/src/main/java/ai/chat2db/plugin/h2/H2Meta.java

Lines changed: 114 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,20 @@
1010

1111
import ai.chat2db.spi.MetaData;
1212
import ai.chat2db.spi.jdbc.DefaultMetaService;
13+
import ai.chat2db.spi.model.Function;
14+
import ai.chat2db.spi.model.Procedure;
15+
import ai.chat2db.spi.model.Table;
16+
import ai.chat2db.spi.model.Trigger;
17+
import ai.chat2db.spi.sql.SQLExecutor;
1318
import jakarta.validation.constraints.NotEmpty;
1419

1520
public class H2Meta extends DefaultMetaService implements MetaData {
1621
@Override
17-
public String tableDDL(Connection connection, @NotEmpty String databaseName, String schemaName, @NotEmpty String tableName) {
18-
return getDDL(connection,databaseName, schemaName, tableName);
22+
public String tableDDL(Connection connection, @NotEmpty String databaseName, String schemaName,
23+
@NotEmpty String tableName) {
24+
return getDDL(connection, databaseName, schemaName, tableName);
1925
}
2026

21-
2227
private String getDDL(Connection connection, String databaseName, String schemaName, String tableName) {
2328
try {
2429
// 查询表结构信息
@@ -48,7 +53,7 @@ private String getDDL(Connection connection, String databaseName, String schemaN
4853

4954
// 查询表索引信息
5055
ResultSet indexes = connection.getMetaData().getIndexInfo(databaseName, schemaName, tableName, false,
51-
false);
56+
false);
5257
Map<String, List<String>> indexMap = new HashMap<>();
5358
while (indexes.next()) {
5459
String indexName = indexes.getString("INDEX_NAME");
@@ -75,7 +80,7 @@ private String getDDL(Connection connection, String databaseName, String schemaN
7580
List<String> columnList = entry.getValue();
7681
String indexColumns = String.join(", ", columnList);
7782
String createIndexDDL = String.format("CREATE INDEX %s ON %s (%s);", indexName, tableName,
78-
indexColumns);
83+
indexColumns);
7984
System.out.println(createIndexDDL);
8085
createTableDDL.append(createIndexDDL);
8186
}
@@ -86,4 +91,108 @@ private String getDDL(Connection connection, String databaseName, String schemaN
8691
}
8792
return "";
8893
}
94+
95+
private static String ROUTINES_SQL
96+
=
97+
"SELECT SPECIFIC_NAME, ROUTINE_COMMENT, ROUTINE_DEFINITION FROM information_schema.routines WHERE "
98+
+ "routine_type = '%s' AND ROUTINE_SCHEMA ='%s' AND "
99+
+ "routine_name = '%s';";
100+
101+
@Override
102+
public Function function(Connection connection, @NotEmpty String databaseName, String schemaName,
103+
String functionName) {
104+
105+
String sql = String.format(ROUTINES_SQL, "FUNCTION", databaseName, functionName);
106+
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
107+
Function function = new Function();
108+
function.setDatabaseName(databaseName);
109+
function.setSchemaName(schemaName);
110+
function.setFunctionName(functionName);
111+
if (resultSet.next()) {
112+
function.setSpecificName(resultSet.getString("SPECIFIC_NAME"));
113+
function.setRemarks(resultSet.getString("ROUTINE_COMMENT"));
114+
function.setFunctionBody(resultSet.getString("ROUTINE_DEFINITION"));
115+
}
116+
117+
return function;
118+
});
119+
120+
}
121+
122+
private static String TRIGGER_SQL
123+
= "SELECT TRIGGER_NAME,EVENT_MANIPULATION, ACTION_STATEMENT FROM INFORMATION_SCHEMA.TRIGGERS where "
124+
+ "TRIGGER_SCHEMA = '%s' AND TRIGGER_NAME = '%s';";
125+
126+
private static String TRIGGER_SQL_LIST
127+
= "SELECT TRIGGER_NAME FROM INFORMATION_SCHEMA.TRIGGERS where TRIGGER_SCHEMA = '%s';";
128+
129+
@Override
130+
public List<Trigger> triggers(Connection connection, String databaseName, String schemaName) {
131+
List<Trigger> triggers = new ArrayList<>();
132+
String sql = String.format(TRIGGER_SQL_LIST, databaseName);
133+
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
134+
while (resultSet.next()) {
135+
Trigger trigger = new Trigger();
136+
trigger.setTriggerName(resultSet.getString("TRIGGER_NAME"));
137+
trigger.setSchemaName(schemaName);
138+
trigger.setDatabaseName(databaseName);
139+
triggers.add(trigger);
140+
}
141+
return triggers;
142+
});
143+
}
144+
145+
@Override
146+
public Trigger trigger(Connection connection, @NotEmpty String databaseName, String schemaName,
147+
String triggerName) {
148+
149+
String sql = String.format(TRIGGER_SQL, databaseName, triggerName);
150+
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
151+
Trigger trigger = new Trigger();
152+
trigger.setDatabaseName(databaseName);
153+
trigger.setSchemaName(schemaName);
154+
trigger.setTriggerName(triggerName);
155+
if (resultSet.next()) {
156+
trigger.setTriggerBody(resultSet.getString("ACTION_STATEMENT"));
157+
}
158+
return trigger;
159+
});
160+
}
161+
162+
@Override
163+
public Procedure procedure(Connection connection, @NotEmpty String databaseName, String schemaName,
164+
String procedureName) {
165+
String sql = String.format(ROUTINES_SQL, "PROCEDURE", databaseName, procedureName);
166+
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
167+
Procedure procedure = new Procedure();
168+
procedure.setDatabaseName(databaseName);
169+
procedure.setSchemaName(schemaName);
170+
procedure.setProcedureName(procedureName);
171+
if (resultSet.next()) {
172+
procedure.setSpecificName(resultSet.getString("SPECIFIC_NAME"));
173+
procedure.setRemarks(resultSet.getString("ROUTINE_COMMENT"));
174+
procedure.setProcedureBody(resultSet.getString("ROUTINE_DEFINITION"));
175+
}
176+
return procedure;
177+
});
178+
}
179+
180+
private static String VIEW_SQL
181+
= "SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_CATALOG = '%s' AND TABLE_SCHEMA = '%s' "
182+
+ "AND TABLE_NAME = '%s';";
183+
184+
@Override
185+
public Table view(Connection connection, String databaseName, String schemaName, String viewName) {
186+
String sql = String.format(VIEW_SQL, databaseName, schemaName, viewName);
187+
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
188+
Table table = new Table();
189+
table.setDatabaseName(databaseName);
190+
table.setSchemaName(schemaName);
191+
table.setName(viewName);
192+
if (resultSet.next()) {
193+
table.setDdl(resultSet.getString("VIEW_DEFINITION"));
194+
}
195+
return table;
196+
});
197+
}
89198
}
Lines changed: 57 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package ai.chat2db.plugin.mysql;
22

33
import java.sql.Connection;
4-
import java.sql.SQLException;
54
import java.util.ArrayList;
65
import java.util.List;
76

@@ -20,13 +19,9 @@ public String tableDDL(Connection connection, @NotEmpty String databaseName, Str
2019
@NotEmpty String tableName) {
2120
String sql = "SHOW CREATE TABLE " + format(databaseName) + "."
2221
+ format(tableName);
23-
return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> {
24-
try {
25-
if (resultSet.next()) {
26-
return resultSet.getString("Create Table");
27-
}
28-
} catch (SQLException e) {
29-
throw new RuntimeException(e);
22+
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
23+
if (resultSet.next()) {
24+
return resultSet.getString("Create Table");
3025
}
3126
return null;
3227
});
@@ -37,127 +32,105 @@ public static String format(String tableName) {
3732
}
3833

3934
private static String ROUTINES_SQL
40-
= "SELECT SPECIFIC_NAME, ROUTINE_COMMENT, ROUTINE_DEFINITION FROM information_schema.routines WHERE routine_type = '%s' AND ROUTINE_SCHEMA ='%s' AND "
41-
+ "routine_name = '%s';";
35+
=
36+
"SELECT SPECIFIC_NAME, ROUTINE_COMMENT, ROUTINE_DEFINITION FROM information_schema.routines WHERE "
37+
+ "routine_type = '%s' AND ROUTINE_SCHEMA ='%s' AND "
38+
+ "routine_name = '%s';";
4239

4340
@Override
4441
public Function function(Connection connection, @NotEmpty String databaseName, String schemaName,
4542
String functionName) {
4643

47-
String sql = String.format(ROUTINES_SQL,"FUNCTION", databaseName, functionName);
48-
return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> {
49-
try {
50-
if (resultSet.next()) {
51-
Function function = new Function();
52-
function.setDatabaseName(databaseName);
53-
function.setSchemaName(schemaName);
54-
function.setSpecificName(resultSet.getString("SPECIFIC_NAME"));
55-
function.setRemarks(resultSet.getString("ROUTINE_COMMENT"));
56-
function.setFunctionName(functionName);
57-
function.setFunctionBody(resultSet.getString("ROUTINE_DEFINITION"));
58-
return function;
59-
}
60-
} catch (SQLException e) {
61-
throw new RuntimeException(e);
44+
String sql = String.format(ROUTINES_SQL, "FUNCTION", databaseName, functionName);
45+
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
46+
Function function = new Function();
47+
function.setDatabaseName(databaseName);
48+
function.setSchemaName(schemaName);
49+
function.setFunctionName(functionName);
50+
if (resultSet.next()) {
51+
function.setSpecificName(resultSet.getString("SPECIFIC_NAME"));
52+
function.setRemarks(resultSet.getString("ROUTINE_COMMENT"));
53+
function.setFunctionBody(resultSet.getString("ROUTINE_DEFINITION"));
6254
}
63-
return null;
55+
return function;
6456
});
6557

6658
}
6759

6860
private static String TRIGGER_SQL
69-
= "SELECT TRIGGER_NAME,EVENT_MANIPULATION, ACTION_STATEMENT FROM INFORMATION_SCHEMA.TRIGGERS where TRIGGER_SCHEMA = '%s' AND TRIGGER_NAME = '%s';";
61+
= "SELECT TRIGGER_NAME,EVENT_MANIPULATION, ACTION_STATEMENT FROM INFORMATION_SCHEMA.TRIGGERS where "
62+
+ "TRIGGER_SCHEMA = '%s' AND TRIGGER_NAME = '%s';";
7063

7164
private static String TRIGGER_SQL_LIST
7265
= "SELECT TRIGGER_NAME FROM INFORMATION_SCHEMA.TRIGGERS where TRIGGER_SCHEMA = '%s';";
7366

74-
7567
@Override
76-
public List<Trigger> triggers(Connection connection,String databaseName, String schemaName) {
68+
public List<Trigger> triggers(Connection connection, String databaseName, String schemaName) {
7769
List<Trigger> triggers = new ArrayList<>();
7870
String sql = String.format(TRIGGER_SQL_LIST, databaseName);
79-
return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> {
80-
try {
81-
while (resultSet.next()) {
82-
Trigger trigger = new Trigger();
83-
trigger.setTriggerName(resultSet.getString("TRIGGER_NAME"));
84-
trigger.setSchemaName(schemaName);
85-
trigger.setDatabaseName(databaseName);
86-
triggers.add(trigger);
87-
}
88-
} catch (SQLException e) {
89-
throw new RuntimeException(e);
71+
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
72+
while (resultSet.next()) {
73+
Trigger trigger = new Trigger();
74+
trigger.setTriggerName(resultSet.getString("TRIGGER_NAME"));
75+
trigger.setSchemaName(schemaName);
76+
trigger.setDatabaseName(databaseName);
77+
triggers.add(trigger);
9078
}
9179
return triggers;
9280
});
9381
}
9482

95-
9683
@Override
9784
public Trigger trigger(Connection connection, @NotEmpty String databaseName, String schemaName,
9885
String triggerName) {
9986

10087
String sql = String.format(TRIGGER_SQL, databaseName, triggerName);
101-
return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> {
102-
try {
103-
if (resultSet.next()) {
104-
Trigger trigger = new Trigger();
105-
trigger.setDatabaseName(databaseName);
106-
trigger.setSchemaName(schemaName);
107-
trigger.setTriggerName(triggerName);
108-
trigger.setTriggerBody(resultSet.getString("ACTION_STATEMENT"));
109-
return trigger;
110-
}
111-
} catch (SQLException e) {
112-
throw new RuntimeException(e);
88+
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
89+
Trigger trigger = new Trigger();
90+
trigger.setDatabaseName(databaseName);
91+
trigger.setSchemaName(schemaName);
92+
trigger.setTriggerName(triggerName);
93+
if (resultSet.next()) {
94+
trigger.setTriggerBody(resultSet.getString("ACTION_STATEMENT"));
11395
}
114-
return null;
96+
return trigger;
11597
});
11698
}
11799

118100
@Override
119101
public Procedure procedure(Connection connection, @NotEmpty String databaseName, String schemaName,
120102
String procedureName) {
121-
String sql = String.format(ROUTINES_SQL,"PROCEDURE", databaseName, procedureName);
122-
return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> {
123-
try {
124-
if (resultSet.next()) {
125-
Procedure procedure = new Procedure();
126-
procedure.setDatabaseName(databaseName);
127-
procedure.setSchemaName(schemaName);
128-
procedure.setSpecificName(resultSet.getString("SPECIFIC_NAME"));
129-
procedure.setRemarks(resultSet.getString("ROUTINE_COMMENT"));
130-
procedure.setProcedureName(procedureName);
131-
procedure.setProcedureBody(resultSet.getString("ROUTINE_DEFINITION"));
132-
return procedure;
133-
}
134-
} catch (SQLException e) {
135-
throw new RuntimeException(e);
103+
String sql = String.format(ROUTINES_SQL, "PROCEDURE", databaseName, procedureName);
104+
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
105+
Procedure procedure = new Procedure();
106+
procedure.setDatabaseName(databaseName);
107+
procedure.setSchemaName(schemaName);
108+
procedure.setProcedureName(procedureName);
109+
if (resultSet.next()) {
110+
procedure.setSpecificName(resultSet.getString("SPECIFIC_NAME"));
111+
procedure.setRemarks(resultSet.getString("ROUTINE_COMMENT"));
112+
procedure.setProcedureBody(resultSet.getString("ROUTINE_DEFINITION"));
136113
}
137-
return null;
114+
return procedure;
138115
});
139116
}
140117

141118
private static String VIEW_SQL
142-
= "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';";
119+
= "SELECT TABLE_SCHEMA AS DatabaseName, TABLE_NAME AS ViewName, VIEW_DEFINITION AS definition, CHECK_OPTION, "
120+
+ "IS_UPDATABLE FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = '%s' AND TABLE_NAME = '%s';";
143121

144122
@Override
145123
public Table view(Connection connection, String databaseName, String schemaName, String viewName) {
146124
String sql = String.format(VIEW_SQL, databaseName, viewName);
147-
return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> {
148-
try {
149-
if (resultSet.next()) {
150-
Table table = new Table();
151-
table.setDatabaseName(databaseName);
152-
table.setSchemaName(schemaName);
153-
table.setName(viewName);
154-
table.setDdl(resultSet.getString("definition"));
155-
return table;
156-
}
157-
} catch (SQLException e) {
158-
throw new RuntimeException(e);
125+
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
126+
Table table = new Table();
127+
table.setDatabaseName(databaseName);
128+
table.setSchemaName(schemaName);
129+
table.setName(viewName);
130+
if (resultSet.next()) {
131+
table.setDdl(resultSet.getString("definition"));
159132
}
160-
return null;
133+
return table;
161134
});
162135
}
163136
}

0 commit comments

Comments
 (0)