status = connectionManager.testConnection(connId);
+ JsonNode json = MAPPER.valueToTree(status);
+ response.set("result", json);
+ }
+
+ private String requiredString(JsonNode params, String key, String defaultValue) throws Exception {
+ if (params.has(key) && !params.get(key).isNull()) {
+ return params.get(key).asText();
+ }
+ if (defaultValue != null) {
+ return defaultValue;
+ }
+ throw new Exception("Missing required parameter: " + key);
+ }
+}
diff --git a/jdbc-bridge/src/main/java/sqlkit/bridge/QueryExecutor.java b/jdbc-bridge/src/main/java/sqlkit/bridge/QueryExecutor.java
new file mode 100644
index 00000000..71549956
--- /dev/null
+++ b/jdbc-bridge/src/main/java/sqlkit/bridge/QueryExecutor.java
@@ -0,0 +1,125 @@
+package sqlkit.bridge;
+
+import java.sql.*;
+import java.util.*;
+
+/**
+ * Executes SQL queries against a JDBC connection and serializes results to JSON-compatible Maps.
+ */
+public class QueryExecutor {
+
+ /**
+ * Execute a SQL query and return the result as a Map.
+ *
+ * For SELECT queries, returns {columns: [...], rows: [[...], ...]}.
+ * For UPDATE/INSERT/DELETE, returns {rows_affected: N}.
+ */
+ public static Map execute(Connection conn, String sql) throws Exception {
+ sql = sql.trim();
+
+ boolean isQuery;
+ String upper = sql.toUpperCase().trim();
+ isQuery = upper.startsWith("SELECT")
+ || upper.startsWith("WITH")
+ || upper.startsWith("EXPLAIN")
+ || upper.startsWith("SHOW")
+ || upper.startsWith("DESCRIBE")
+ || upper.startsWith("PRAGMA");
+
+ if (isQuery) {
+ return executeQuery(conn, sql);
+ } else {
+ return executeUpdate(conn, sql);
+ }
+ }
+
+ private static Map executeQuery(Connection conn, String sql) throws Exception {
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(sql)) {
+
+ ResultSetMetaData meta = rs.getMetaData();
+ int columnCount = meta.getColumnCount();
+
+ List columns = new ArrayList<>();
+ for (int i = 1; i <= columnCount; i++) {
+ columns.add(meta.getColumnLabel(i));
+ }
+
+ List> rows = new ArrayList<>();
+ while (rs.next()) {
+ List