From 2b93a8d969e8ff87e18b0057b4467b56a3f7e61d Mon Sep 17 00:00:00 2001 From: Yves Date: Thu, 20 Feb 2025 21:57:39 +0100 Subject: [PATCH] Add `ui_is_started` --- src/include/utils/helpers.hpp | 10 ++++++---- src/ui_extension.cpp | 28 ++++++++++++++++++++++++++-- src/utils/helpers.cpp | 7 ++++--- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/include/utils/helpers.hpp b/src/include/utils/helpers.hpp index e1e94f1..db1e709 100644 --- a/src/include/utils/helpers.hpp +++ b/src/include/utils/helpers.hpp @@ -27,9 +27,10 @@ T GetSetting(const ClientContext &context, const char *setting_name, } namespace internal { -unique_ptr ResultBind(ClientContext &, TableFunctionBindInput &, - vector &, - vector &); +unique_ptr SingleStringResultBind(ClientContext &, + TableFunctionBindInput &, + vector &, + vector &); bool ShouldRun(TableFunctionInput &input); @@ -68,7 +69,8 @@ void TableFunc(ClientContext &context, TableFunctionInput &input, template void RegisterTF(DatabaseInstance &instance, const char *name) { TableFunction tf(name, {}, internal::TableFunc, - internal::ResultBind, RunOnceTableFunctionState::Init); + internal::SingleStringResultBind, + RunOnceTableFunctionState::Init); ExtensionUtil::RegisterFunction(instance, tf); } diff --git a/src/ui_extension.cpp b/src/ui_extension.cpp index a8b393f..cc6577b 100644 --- a/src/ui_extension.cpp +++ b/src/ui_extension.cpp @@ -96,13 +96,32 @@ std::string NotifyConnectedFunction(ClientContext &context, return "OK"; } -// - connected notification - std::string NotifyCatalogChangedFunction(ClientContext &context) { ui::HttpServer::GetInstance(context)->SendCatalogChangedEvent(); return "OK"; } +// - connected notification + +unique_ptr SingleBoolResultBind(ClientContext &, + TableFunctionBindInput &, + vector &out_types, + vector &out_names) { + out_names.emplace_back("result"); + out_types.emplace_back(LogicalType::BOOLEAN); + return nullptr; +} + +void IsUIStartedTableFunc(ClientContext &context, TableFunctionInput &input, + DataChunk &output) { + if (!internal::ShouldRun(input)) { + return; + } + + output.SetCardinality(1); + output.SetValue(0, 0, ui::HttpServer::Started()); +} + void InitStorageExtension(duckdb::DatabaseInstance &db) { auto &config = db.config; auto ext = duckdb::make_uniq(); @@ -131,6 +150,11 @@ static void LoadInternal(DatabaseInstance &instance) { RESISTER_TF("notify_ui_catalog_changed", NotifyCatalogChangedFunction); RESISTER_TF_ARGS("notify_ui_connected", {LogicalType::VARCHAR}, NotifyConnectedFunction, NotifyConnectedBind); + { + TableFunction tf("ui_is_started", {}, IsUIStartedTableFunc, + SingleBoolResultBind, RunOnceTableFunctionState::Init); + ExtensionUtil::RegisterFunction(instance, tf); + } // If the server is already running we need to update the database instance // since the previous one was invalidated (eg. in the shell when we '.open' diff --git a/src/utils/helpers.cpp b/src/utils/helpers.cpp index 4de921d..cf084dd 100644 --- a/src/utils/helpers.cpp +++ b/src/utils/helpers.cpp @@ -15,9 +15,10 @@ bool ShouldRun(TableFunctionInput &input) { return true; } -unique_ptr ResultBind(ClientContext &, TableFunctionBindInput &, - vector &out_types, - vector &out_names) { +unique_ptr +SingleStringResultBind(ClientContext &, TableFunctionBindInput &, + vector &out_types, + vector &out_names) { out_names.emplace_back("result"); out_types.emplace_back(LogicalType::VARCHAR); return nullptr;