66#include " duckdb/main/extension_helper.hpp"
77#include " duckdb/main/config.hpp"
88#include < cstdlib>
9+ #include < future>
910using namespace duckdb_yyjson ; // NOLINT
1011
1112namespace duckdb {
1213
13- static constexpr const char *TARGET_URL = " https://duckdb-in.query-farm.services/ " ;
14+ namespace {
1415
1516// Function to send the actual HTTP request
16- static void sendHTTPRequest (shared_ptr<DatabaseInstance> db, std::string json_body) {
17+ void sendHTTPRequest (shared_ptr<DatabaseInstance> db, char *json_body, size_t json_body_size) {
18+ const string TARGET_URL (" https://duckdb-in.query-farm.services/" );
19+
1720 HTTPHeaders headers;
1821 headers.Insert (" Content-Type" , " application/json" );
1922
2023 auto &http_util = HTTPUtil::Get (*db);
21- unique_ptr<HTTPParams> params;
22- auto target_url = string (TARGET_URL);
23- params = http_util.InitializeParameters (*db, target_url);
24+ unique_ptr<HTTPParams> params = http_util.InitializeParameters (*db, TARGET_URL);
2425
25- PostRequestInfo post_request (target_url , headers, *params, reinterpret_cast <const_data_ptr_t >(json_body. data () ),
26- json_body. size () );
26+ PostRequestInfo post_request (TARGET_URL , headers, *params, reinterpret_cast <const_data_ptr_t >(json_body),
27+ json_body_size );
2728 try {
2829 auto response = http_util.Request (post_request);
2930 } catch (const std::exception &e) {
3031 // ignore all errors.
3132 }
3233
34+ free (json_body);
3335 return ;
3436}
3537
36- // Public function to start the request thread
37- static void sendRequestAsync (shared_ptr<DatabaseInstance> db, std::string &json_body) {
38- std::thread request_thread (sendHTTPRequest, db, std::move (json_body));
39- request_thread.detach (); // Let the thread run independently
40- }
38+ } // namespace
4139
4240INTERNAL_FUNC void QueryFarmSendTelemetry (ExtensionLoader &loader, const string &extension_name,
4341 const string &extension_version) {
@@ -67,10 +65,12 @@ INTERNAL_FUNC void QueryFarmSendTelemetry(ExtensionLoader &loader, const string
6765 auto result_obj = yyjson_mut_obj (doc);
6866 yyjson_mut_doc_set_root (doc, result_obj);
6967
68+ auto platform = DuckDB::Platform ();
69+
7070 yyjson_mut_obj_add_str (doc, result_obj, " extension_name" , extension_name.c_str ());
7171 yyjson_mut_obj_add_str (doc, result_obj, " extension_version" , extension_version.c_str ());
72- yyjson_mut_obj_add_str (doc, result_obj, " user_agent" , " query-farm/20250926 " );
73- yyjson_mut_obj_add_str (doc, result_obj, " duckdb_platform" , DuckDB::Platform () .c_str ());
72+ yyjson_mut_obj_add_str (doc, result_obj, " user_agent" , " query-farm/20251011 " );
73+ yyjson_mut_obj_add_str (doc, result_obj, " duckdb_platform" , platform .c_str ());
7474 yyjson_mut_obj_add_str (doc, result_obj, " duckdb_library_version" , DuckDB::LibraryVersion ());
7575 yyjson_mut_obj_add_str (doc, result_obj, " duckdb_release_codename" , DuckDB::ReleaseCodename ());
7676 yyjson_mut_obj_add_str (doc, result_obj, " duckdb_source_id" , DuckDB::SourceID ());
@@ -83,13 +83,11 @@ INTERNAL_FUNC void QueryFarmSendTelemetry(ExtensionLoader &loader, const string
8383 throw SerializationException (" Failed to serialize telemetry data." );
8484 }
8585
86- auto telemetry_string = string (telemetry_data, (size_t )telemetry_len);
87-
8886 yyjson_mut_doc_free (doc);
89- free (telemetry_data);
9087
91- // Send request asynchronously
92- sendRequestAsync (loader.GetDatabaseInstance ().shared_from_this (), telemetry_string);
88+ [[maybe_unused]] auto _ = std::async (
89+ std::launch::async, [db_ptr = loader.GetDatabaseInstance ().shared_from_this (), json = telemetry_data,
90+ len = telemetry_len]() mutable { sendHTTPRequest (std::move (db_ptr), json, len); });
9391}
9492
9593} // namespace duckdb
0 commit comments