#ifdef PROXYSQLGENAI #include "proxysql.h" #include "../deps/json/json.hpp" using json = nlohmann::json; #define PROXYJSON #include "Admin_Tool_Handler.h" #include "MCP_Thread.h" #include "proxysql_debug.h" Admin_Tool_Handler::Admin_Tool_Handler(MCP_Threads_Handler* handler) : mcp_handler(handler) { pthread_mutex_init(&handler_lock, NULL); proxy_debug(PROXY_DEBUG_GENERIC, 3, "Admin_Tool_Handler created\n"); } Admin_Tool_Handler::~Admin_Tool_Handler() { close(); pthread_mutex_destroy(&handler_lock); proxy_debug(PROXY_DEBUG_GENERIC, 3, "Admin_Tool_Handler destroyed\n"); } int Admin_Tool_Handler::init() { proxy_info("Admin_Tool_Handler initialized\n"); return 0; } void Admin_Tool_Handler::close() { proxy_debug(PROXY_DEBUG_GENERIC, 2, "Admin_Tool_Handler closed\n"); } json Admin_Tool_Handler::get_tool_list() { json tools = json::array(); // Stub tools for administrative operations tools.push_back(create_tool_description( "admin_list_users", "List all MySQL users configured in ProxySQL", { {"type", "object"}, {"properties", {}} } )); tools.push_back(create_tool_description( "admin_show_processes", "Show running MySQL processes", { {"type", "object"}, {"properties", {}} } )); tools.push_back(create_tool_description( "admin_kill_query", "Kill a running query by process ID", { {"type", "object"}, {"properties", { {"process_id", { {"type", "integer"}, {"description", "Process ID to kill"} }} }}, {"required", {"process_id"}} } )); tools.push_back(create_tool_description( "admin_flush_cache", "Flush ProxySQL query cache", { {"type", "object"}, {"properties", { {"cache_type", { {"type", "string"}, {"enum", {"query_cache", "host_cache", "all"}}, {"description", "Type of cache to flush"} }} }}, {"required", {"cache_type"}} } )); tools.push_back(create_tool_description( "admin_reload", "Reload ProxySQL configuration (users, servers, etc.)", { {"type", "object"}, {"properties", { {"target", { {"type", "string"}, {"enum", {"users", "servers", "all"}}, {"description", "What to reload"} }} }}, {"required", {"target"}} } )); json result; result["tools"] = tools; return result; } json Admin_Tool_Handler::get_tool_description(const std::string& tool_name) { json tools_list = get_tool_list(); for (const auto& tool : tools_list["tools"]) { if (tool["name"] == tool_name) { return tool; } } return create_error_response("Tool not found: " + tool_name); } json Admin_Tool_Handler::execute_tool(const std::string& tool_name, const json& arguments) { pthread_mutex_lock(&handler_lock); json result; // Stub implementation - returns placeholder responses if (tool_name == "admin_list_users") { result = create_success_response(json{ {"message", "admin_list_users functionality to be implemented"}, {"users", json::array()} }); } else if (tool_name == "admin_show_processes") { result = create_success_response(json{ {"message", "admin_show_processes functionality to be implemented"}, {"processes", json::array()} }); } else if (tool_name == "admin_kill_query") { int process_id = arguments.value("process_id", 0); result = create_success_response(json{ {"message", "admin_kill_query functionality to be implemented"}, {"process_id", process_id} }); } else if (tool_name == "admin_flush_cache") { std::string cache_type = arguments.value("cache_type", "all"); result = create_success_response(json{ {"message", "admin_flush_cache functionality to be implemented"}, {"cache_type", cache_type} }); } else if (tool_name == "admin_reload") { std::string target = arguments.value("target", "all"); result = create_success_response(json{ {"message", "admin_reload functionality to be implemented"}, {"target", target} }); } else { result = create_error_response("Unknown tool: " + tool_name); } pthread_mutex_unlock(&handler_lock); return result; } #endif /* PROXYSQLGENAI */