From e923cb3739a181e867cbd12152483cf81aea1f63 Mon Sep 17 00:00:00 2001 From: Jan de Visser Date: Thu, 26 Aug 2021 18:45:37 -0400 Subject: [PATCH] SQLServer+SQL+LibSQL: Allow sql client to specify the database name The database the sql client connected to was 'hardcoded' to the login name of the calling user. - Extended the IPC API to be more expressive when connecting, by returning the name of the database the client connected to in the 'connected' callback. - Gave the sql client a command line argument (-d/--database) allowing an alternative database name to be specified A subsequent commit will have a dot command allowing the user to connect to different databases from the same sql session. --- Userland/Libraries/LibSQL/SQLClient.cpp | 4 ++-- Userland/Libraries/LibSQL/SQLClient.h | 4 ++-- .../Services/SQLServer/DatabaseConnection.cpp | 2 +- Userland/Services/SQLServer/SQLClient.ipc | 2 +- Userland/Utilities/sql.cpp | 16 ++++++++++++---- 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/Userland/Libraries/LibSQL/SQLClient.cpp b/Userland/Libraries/LibSQL/SQLClient.cpp index 8114ef8075..e5a61780e3 100644 --- a/Userland/Libraries/LibSQL/SQLClient.cpp +++ b/Userland/Libraries/LibSQL/SQLClient.cpp @@ -12,10 +12,10 @@ SQLClient::~SQLClient() { } -void SQLClient::connected(int connection_id) +void SQLClient::connected(int connection_id, String const& connected_to_database) { if (on_connected) - on_connected(connection_id); + on_connected(connection_id, connected_to_database); } void SQLClient::disconnected(int connection_id) diff --git a/Userland/Libraries/LibSQL/SQLClient.h b/Userland/Libraries/LibSQL/SQLClient.h index d473c8f65d..d1947d6cde 100644 --- a/Userland/Libraries/LibSQL/SQLClient.h +++ b/Userland/Libraries/LibSQL/SQLClient.h @@ -18,7 +18,7 @@ class SQLClient C_OBJECT(SQLClient); virtual ~SQLClient(); - Function on_connected; + Function on_connected; Function on_disconnected; Function on_connection_error; Function on_execution_error; @@ -32,7 +32,7 @@ private: { } - virtual void connected(int connection_id) override; + virtual void connected(int connection_id, String const& connected_to_database) override; virtual void connection_error(int connection_id, int code, String const& message) override; virtual void execution_success(int statement_id, bool has_results, int created, int updated, int deleted) override; virtual void next_result(int statement_id, Vector const&) override; diff --git a/Userland/Services/SQLServer/DatabaseConnection.cpp b/Userland/Services/SQLServer/DatabaseConnection.cpp index e83fccc925..97c50a32d5 100644 --- a/Userland/Services/SQLServer/DatabaseConnection.cpp +++ b/Userland/Services/SQLServer/DatabaseConnection.cpp @@ -43,7 +43,7 @@ DatabaseConnection::DatabaseConnection(String database_name, int client_id) m_accept_statements = true; auto client_connection = ClientConnection::client_connection_for(m_client_id); if (client_connection) - client_connection->async_connected(m_connection_id); + client_connection->async_connected(m_connection_id, m_database_name); else warnln("Cannot notify client of database connection. Client disconnected"); }); diff --git a/Userland/Services/SQLServer/SQLClient.ipc b/Userland/Services/SQLServer/SQLClient.ipc index 960ed8e907..f6efebe521 100644 --- a/Userland/Services/SQLServer/SQLClient.ipc +++ b/Userland/Services/SQLServer/SQLClient.ipc @@ -1,6 +1,6 @@ endpoint SQLClient { - connected(int connection_id) =| + connected(int connection_id, String connected_to_database) =| connection_error(int connection_id, int code, String message) =| execution_success(int statement_id, bool has_results, int created, int updated, int deleted) =| next_result(int statement_id, Vector row) =| diff --git a/Userland/Utilities/sql.cpp b/Userland/Utilities/sql.cpp index 510fddd028..4ef193e917 100644 --- a/Userland/Utilities/sql.cpp +++ b/Userland/Utilities/sql.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -97,8 +98,15 @@ void handle_command(StringView command) } -int main() +int main(int argc, char** argv) { + String database_name(getlogin()); + + Core::ArgsParser args_parser; + args_parser.set_general_help("This is a client for the SerenitySQL database server."); + args_parser.add_option(database_name, "Database to connect to", "database", 'd', "database"); + args_parser.parse(argc, argv); + s_editor = Line::Editor::construct(); s_editor->load_history(s_history_path); @@ -172,8 +180,8 @@ int main() sql_client->async_disconnect(the_connection_id); }; - sql_client->on_connected = [&](int connection_id) { - outln("** Connected to {} **", getlogin()); + sql_client->on_connected = [&](int connection_id, String const& connected_to_database) { + outln("** Connected to {} **", connected_to_database); the_connection_id = connection_id; read_sql(); }; @@ -212,7 +220,7 @@ int main() loop.quit(0); }; - sql_client->connect(getlogin()); + sql_client->connect(database_name); auto rc = loop.exec(); s_editor->save_history(s_history_path);