From fd5f029474d5b94020dc5502196b87c2ddbdb6e1 Mon Sep 17 00:00:00 2001 From: Rene Cannao Date: Tue, 7 Apr 2026 09:01:23 +0000 Subject: [PATCH] fix: expose plugin db handles during startup --- lib/ProxySQL_Admin.cpp | 12 ++++++++++ lib/ProxySQL_PluginManager.cpp | 10 ++++++--- test/tap/test_helpers/fake_plugin.cpp | 14 +++++++++++- test/tap/tests/unit/plugin_config_unit-t.cpp | 20 +++++++++++++++++ test/tap/tests/unit/plugin_manager_unit-t.cpp | 22 ++++++++++++++++++- 5 files changed, 73 insertions(+), 5 deletions(-) diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index 7e4098118..d0c7f9ab6 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -338,6 +338,18 @@ extern AI_Features_Manager *GloAI; extern void (*flush_logs_function)(); +SQLite3DB* proxysql_plugin_get_admindb() { + return GloAdmin ? GloAdmin->admindb : nullptr; +} + +SQLite3DB* proxysql_plugin_get_configdb() { + return GloAdmin ? GloAdmin->configdb : nullptr; +} + +SQLite3DB* proxysql_plugin_get_statsdb() { + return GloAdmin ? GloAdmin->statsdb : nullptr; +} + extern Web_Interface *GloWebInterface; extern ProxySQL_Cluster *GloProxyCluster; diff --git a/lib/ProxySQL_PluginManager.cpp b/lib/ProxySQL_PluginManager.cpp index 9d7804de0..618ee96da 100644 --- a/lib/ProxySQL_PluginManager.cpp +++ b/lib/ProxySQL_PluginManager.cpp @@ -6,6 +6,10 @@ #include "proxysql.h" +SQLite3DB* proxysql_plugin_get_admindb(); +SQLite3DB* proxysql_plugin_get_configdb(); +SQLite3DB* proxysql_plugin_get_statsdb(); + namespace { ProxySQL_PluginManager* g_active_plugin_manager = nullptr; @@ -39,15 +43,15 @@ void register_command_service(const char* sql, proxysql_plugin_admin_command_cb } SQLite3DB* get_admindb_service() { - return nullptr; + return proxysql_plugin_get_admindb(); } SQLite3DB* get_configdb_service() { - return nullptr; + return proxysql_plugin_get_configdb(); } SQLite3DB* get_statsdb_service() { - return nullptr; + return proxysql_plugin_get_statsdb(); } void log_message_service(int level, const char* message) { diff --git a/test/tap/test_helpers/fake_plugin.cpp b/test/tap/test_helpers/fake_plugin.cpp index 2408e0ba3..fed1925e0 100644 --- a/test/tap/test_helpers/fake_plugin.cpp +++ b/test/tap/test_helpers/fake_plugin.cpp @@ -5,6 +5,8 @@ namespace { +ProxySQL_PluginServices* fake_services = nullptr; + void fake_log_event(const char *event) { const char *log_path = std::getenv("PROXYSQL_FAKE_PLUGIN_LOG"); if (log_path == nullptr || *log_path == '\0') { @@ -20,12 +22,22 @@ void fake_log_event(const char *event) { std::fclose(log_file); } -bool fake_init(ProxySQL_PluginServices *) { +bool fake_init(ProxySQL_PluginServices *services) { + fake_services = services; fake_log_event("init"); return true; } bool fake_start() { + if (fake_services == nullptr || + fake_services->get_admindb == nullptr || + fake_services->get_configdb == nullptr || + fake_services->get_statsdb == nullptr || + fake_services->get_admindb() == nullptr || + fake_services->get_configdb() == nullptr || + fake_services->get_statsdb() == nullptr) { + return false; + } fake_log_event("start"); return true; } diff --git a/test/tap/tests/unit/plugin_config_unit-t.cpp b/test/tap/tests/unit/plugin_config_unit-t.cpp index 36431f1ed..b42b9b889 100644 --- a/test/tap/tests/unit/plugin_config_unit-t.cpp +++ b/test/tap/tests/unit/plugin_config_unit-t.cpp @@ -12,6 +12,26 @@ extern ProxySQL_GlobalVariables GloVars; +namespace { + +char g_fake_admin_db = '\0'; +char g_fake_config_db = '\0'; +char g_fake_stats_db = '\0'; + +} // namespace + +SQLite3DB* proxysql_plugin_get_admindb() { + return reinterpret_cast(&g_fake_admin_db); +} + +SQLite3DB* proxysql_plugin_get_configdb() { + return reinterpret_cast(&g_fake_config_db); +} + +SQLite3DB* proxysql_plugin_get_statsdb() { + return reinterpret_cast(&g_fake_stats_db); +} + int main() { plan(7); diff --git a/test/tap/tests/unit/plugin_manager_unit-t.cpp b/test/tap/tests/unit/plugin_manager_unit-t.cpp index 4c229edf0..50040622d 100644 --- a/test/tap/tests/unit/plugin_manager_unit-t.cpp +++ b/test/tap/tests/unit/plugin_manager_unit-t.cpp @@ -7,6 +7,26 @@ #error "PROXYSQL_FAKE_PLUGIN_PATH must be defined" #endif +namespace { + +char g_fake_admin_db = '\0'; +char g_fake_config_db = '\0'; +char g_fake_stats_db = '\0'; + +} // namespace + +SQLite3DB* proxysql_plugin_get_admindb() { + return reinterpret_cast(&g_fake_admin_db); +} + +SQLite3DB* proxysql_plugin_get_configdb() { + return reinterpret_cast(&g_fake_config_db); +} + +SQLite3DB* proxysql_plugin_get_statsdb() { + return reinterpret_cast(&g_fake_stats_db); +} + static void test_loader_round_trip() { ProxySQL_PluginManager mgr; std::string err; @@ -22,7 +42,7 @@ static void test_loader_round_trip() { ok(!mgr.start_all(err), "start_all rejects uninitialized plugins"); ok(!err.empty(), "start_all without init reports an error"); ok(mgr.init_all(err), "init_all succeeds"); - ok(mgr.start_all(err), "start_all succeeds"); + ok(mgr.start_all(err), "start_all succeeds once DB handle callbacks are available"); ok(mgr.stop_all(), "stop_all succeeds"); }