From 8c1f36c9cffa20746cb29668ecedbae9ba579db0 Mon Sep 17 00:00:00 2001 From: Jeff Raymakers Date: Sun, 9 Mar 2025 10:59:38 -0700 Subject: [PATCH] check for running on machine before starting --- src/http_server.cpp | 16 ++++++++++++++++ src/include/http_server.hpp | 3 +++ src/ui_extension.cpp | 10 ++++++++++ 3 files changed, 29 insertions(+) diff --git a/src/http_server.cpp b/src/http_server.cpp index 574132d..70fd0ae 100644 --- a/src/http_server.cpp +++ b/src/http_server.cpp @@ -55,6 +55,22 @@ void HttpServer::UpdateDatabaseInstance( } } +bool HttpServer::IsRunningOnMachine(ClientContext &context) { + if (Started()) { + return true; + } + + const auto local_port = GetLocalPort(context); + auto local_url = StringUtil::Format("http://localhost:%d", local_port); + + httplib::Client client(local_url); + auto result = client.Get("/info"); + if (result) { + return true; + } + return false; +} + bool HttpServer::Started() { return server_instance && server_instance->main_thread; } diff --git a/src/include/http_server.hpp b/src/include/http_server.hpp index c53d471..c19bb91 100644 --- a/src/include/http_server.hpp +++ b/src/include/http_server.hpp @@ -24,13 +24,16 @@ class HttpServer { public: HttpServer(shared_ptr _ddb_instance) : ddb_instance(_ddb_instance) {} + static HttpServer *GetInstance(ClientContext &); static void UpdateDatabaseInstanceIfRunning(shared_ptr); + static bool IsRunningOnMachine(ClientContext &); static bool Started(); static void StopInstance(); static const HttpServer &Start(ClientContext &, bool *was_started = nullptr); static bool Stop(); + std::string LocalUrl() const; private: diff --git a/src/ui_extension.cpp b/src/ui_extension.cpp index e8ae1cc..ed1d2d0 100644 --- a/src/ui_extension.cpp +++ b/src/ui_extension.cpp @@ -22,6 +22,11 @@ namespace duckdb { std::string StartUIFunction(ClientContext &context) { + if (!ui::HttpServer::Started() && + ui::HttpServer::IsRunningOnMachine(context)) { + return "UI already running in a different DuckDB instance"; + } + const auto &server = ui::HttpServer::Start(context); const auto local_url = server.LocalUrl(); @@ -33,6 +38,11 @@ std::string StartUIFunction(ClientContext &context) { } std::string StartUIServerFunction(ClientContext &context) { + if (!ui::HttpServer::Started() && + ui::HttpServer::IsRunningOnMachine(context)) { + return "UI already running in a different DuckDB instance"; + } + bool was_started = false; const auto &server = ui::HttpServer::Start(context, &was_started); const char *already = was_started ? "already " : "";