瀏覽代碼

LibSQL+SQLServer: Send result column names over IPC to SQL clients

Timothy Flynn 2 年之前
父節點
當前提交
cb06031180

+ 2 - 1
Userland/Libraries/LibSQL/SQLClient.cpp

@@ -154,7 +154,7 @@ ErrorOr<NonnullRefPtr<SQLClient>> SQLClient::launch_server_and_create_client(Vec
 
 #endif
 
-void SQLClient::execution_success(u64 statement_id, u64 execution_id, bool has_results, size_t created, size_t updated, size_t deleted)
+void SQLClient::execution_success(u64 statement_id, u64 execution_id, Vector<DeprecatedString> const& column_names, bool has_results, size_t created, size_t updated, size_t deleted)
 {
     if (!on_execution_success) {
         outln("{} row(s) created, {} updated, {} deleted", created, updated, deleted);
@@ -164,6 +164,7 @@ void SQLClient::execution_success(u64 statement_id, u64 execution_id, bool has_r
     ExecutionSuccess success {
         .statement_id = statement_id,
         .execution_id = execution_id,
+        .column_names = move(const_cast<Vector<DeprecatedString>&>(column_names)),
         .has_results = has_results,
         .rows_created = created,
         .rows_updated = updated,

+ 2 - 1
Userland/Libraries/LibSQL/SQLClient.h

@@ -19,6 +19,7 @@ struct ExecutionSuccess {
     u64 statement_id { 0 };
     u64 execution_id { 0 };
 
+    Vector<DeprecatedString> column_names;
     bool has_results { false };
     size_t rows_created { 0 };
     size_t rows_updated { 0 };
@@ -70,7 +71,7 @@ private:
     {
     }
 
-    virtual void execution_success(u64 statement_id, u64 execution_id, bool has_results, size_t created, size_t updated, size_t deleted) override;
+    virtual void execution_success(u64 statement_id, u64 execution_id, Vector<DeprecatedString> const& column_names, bool has_results, size_t created, size_t updated, size_t deleted) override;
     virtual void execution_error(u64 statement_id, u64 execution_id, SQLErrorCode const& code, DeprecatedString const& message) override;
     virtual void next_result(u64 statement_id, u64 execution_id, Vector<SQL::Value> const&) override;
     virtual void results_exhausted(u64 statement_id, u64 execution_id, size_t total_rows) override;

+ 1 - 1
Userland/Services/SQLServer/SQLClient.ipc

@@ -3,7 +3,7 @@
 
 endpoint SQLClient
 {
-    execution_success(u64 statement_id, u64 execution_id, bool has_results, size_t created, size_t updated, size_t deleted) =|
+    execution_success(u64 statement_id, u64 execution_id, Vector<DeprecatedString> column_names, bool has_results, size_t created, size_t updated, size_t deleted) =|
     next_result(u64 statement_id, u64 execution_id, Vector<SQL::Value> row) =|
     results_exhausted(u64 statement_id, u64 execution_id, size_t total_rows) =|
     execution_error(u64 statement_id, u64 execution_id, SQL::SQLErrorCode code, DeprecatedString message) =|

+ 5 - 5
Userland/Services/SQLServer/SQLStatement.cpp

@@ -89,19 +89,19 @@ Optional<SQL::ExecutionID> SQLStatement::execute(Vector<SQL::Value> placeholder_
         auto result = execution_result.release_value();
 
         if (should_send_result_rows(result)) {
-            client_connection->async_execution_success(statement_id(), execution_id, true, 0, 0, 0);
+            client_connection->async_execution_success(statement_id(), execution_id, result.column_names(), true, 0, 0, 0);
 
             auto result_size = result.size();
             next(execution_id, move(result), result_size);
         } else {
             if (result.command() == SQL::SQLCommand::Insert)
-                client_connection->async_execution_success(statement_id(), execution_id, false, result.size(), 0, 0);
+                client_connection->async_execution_success(statement_id(), execution_id, result.column_names(), false, result.size(), 0, 0);
             else if (result.command() == SQL::SQLCommand::Update)
-                client_connection->async_execution_success(statement_id(), execution_id, false, 0, result.size(), 0);
+                client_connection->async_execution_success(statement_id(), execution_id, result.column_names(), false, 0, result.size(), 0);
             else if (result.command() == SQL::SQLCommand::Delete)
-                client_connection->async_execution_success(statement_id(), execution_id, false, 0, 0, result.size());
+                client_connection->async_execution_success(statement_id(), execution_id, result.column_names(), false, 0, 0, result.size());
             else
-                client_connection->async_execution_success(statement_id(), execution_id, false, 0, 0, 0);
+                client_connection->async_execution_success(statement_id(), execution_id, result.column_names(), false, 0, 0, 0);
         }
     });