重构协程

This commit is contained in:
2026-06-25 11:17:52 +08:00
parent 2aad10ccf4
commit f0510f5438
11 changed files with 370 additions and 386 deletions
@@ -4,6 +4,7 @@
#include "Resources.h"
#include "../server/Global.h"
#include "../server/Performance_Monitor.h"
#include "Core/Base/Coro_Result.h"
#include <SQLiteCpp/Statement.h>
#include <SQLiteCpp/Transaction.h>
@@ -67,30 +68,22 @@ namespace
}
template <typename T, typename Starter>
psco::awaitable<T> await_external_database_callback(Starter starter)
concurrencpp::result<T> await_external_database_callback(Starter starter)
{
using Result = psco::traits::exception_with_result_t<T>;
auto result = co_await psco::callback_awaitable<Result>(
[starter = std::move(starter)](auto handler) mutable
auto result = co_await Psc::coro::callback_result<T>(
[starter = std::move(starter)](auto done) mutable
{
starter([handler = std::move(handler)](std::exception_ptr exception,
T value) mutable
starter([done = std::move(done)](std::exception_ptr exception, T value) mutable
{
if (exception)
{
handler(Result{exception});
done.set_exception(exception);
return;
}
handler(Result{std::move(value)});
done(std::move(value));
});
});
if (std::holds_alternative<std::exception_ptr>(result))
{
std::rethrow_exception(std::get<std::exception_ptr>(result));
}
co_return std::move(std::get<T>(result));
co_return std::move(result);
}
} // 命名空间
@@ -494,7 +487,7 @@ void External_Resources_Manager::async_external_database_status(
std::move(callback));
}
psco::awaitable<std::vector<External_Resource_Status>>
concurrencpp::result<std::vector<External_Resource_Status>>
External_Resources_Manager::refresh_external_databases_coro(
const bool force_download)
{
@@ -506,7 +499,7 @@ External_Resources_Manager::refresh_external_databases_coro(
});
}
psco::awaitable<External_Resource_Status>
concurrencpp::result<External_Resource_Status>
External_Resources_Manager::refresh_external_database_coro(
std::string resource_name,
const bool force_download)
@@ -521,7 +514,7 @@ External_Resources_Manager::refresh_external_database_coro(
});
}
psco::awaitable<External_Resource_Status>
concurrencpp::result<External_Resource_Status>
External_Resources_Manager::import_external_database_coro(
std::string resource_name,
std::filesystem::path source_file)
@@ -536,7 +529,7 @@ External_Resources_Manager::import_external_database_coro(
});
}
psco::awaitable<External_Resource_Status>
concurrencpp::result<External_Resource_Status>
External_Resources_Manager::clear_external_database_table_coro(
std::string resource_name)
{
@@ -548,7 +541,7 @@ External_Resources_Manager::clear_external_database_table_coro(
});
}
psco::awaitable<std::optional<External_Database_Row>>
concurrencpp::result<std::optional<External_Database_Row>>
External_Resources_Manager::query_external_database_coro(
std::string resource_name,
std::vector<std::string> primary_key_values) const
@@ -566,33 +559,51 @@ External_Resources_Manager::query_external_database_coro(
});
}
psco::awaitable<std::map<std::string, std::shared_ptr<External_Database_Row>>>
concurrencpp::result<std::shared_ptr<External_Database_Row_Map>>
External_Resources_Manager::query_aircraft_external_databases_coro(
std::string icao24) const
{
co_return co_await await_external_database_callback<
std::map<std::string, std::shared_ptr<External_Database_Row>>>(
[this, icao24 = std::move(icao24)](Row_Map_Callback callback) mutable
auto result = co_await Psc::coro::callback_result<std::shared_ptr<External_Database_Row_Map>>(
[this, icao24 = std::move(icao24)](auto done) mutable
{
async_query_aircraft_external_databases(
std::move(icao24), std::move(callback));
std::move(icao24),
[done = std::move(done)](std::exception_ptr exception, External_Database_Row_Map value) mutable
{
if (exception)
{
done.set_exception(exception);
return;
}
done(std::make_shared<External_Database_Row_Map>(std::move(value)));
});
});
co_return result;
}
psco::awaitable<std::map<std::string, std::shared_ptr<External_Database_Row>>>
concurrencpp::result<std::shared_ptr<External_Database_Row_Map>>
External_Resources_Manager::query_callsign_external_databases_coro(
std::optional<std::string> callsign) const
{
co_return co_await await_external_database_callback<
std::map<std::string, std::shared_ptr<External_Database_Row>>>(
[this, callsign = std::move(callsign)](Row_Map_Callback callback) mutable
auto result = co_await Psc::coro::callback_result<std::shared_ptr<External_Database_Row_Map>>(
[this, callsign = std::move(callsign)](auto done) mutable
{
async_query_callsign_external_databases(
std::move(callsign), std::move(callback));
std::move(callsign),
[done = std::move(done)](std::exception_ptr exception, External_Database_Row_Map value) mutable
{
if (exception)
{
done.set_exception(exception);
return;
}
done(std::make_shared<External_Database_Row_Map>(std::move(value)));
});
});
co_return result;
}
psco::awaitable<std::vector<External_Resource_Status>>
concurrencpp::result<std::vector<External_Resource_Status>>
External_Resources_Manager::external_database_status_coro() const
{
co_return co_await await_external_database_callback<std::vector<External_Resource_Status>>
+16 -12
View File
@@ -12,7 +12,7 @@
#include <optional>
#include <string>
#include <vector>
#include <psco/awaitable.hpp>
#include <concurrencpp/concurrencpp.h>
#include "Core/Base/JSON.h"
@@ -20,11 +20,17 @@ class Global;
struct External_Database_Row {
std::map<std::string, std::optional<std::string>> columns;
External_Database_Row() = default;
External_Database_Row(const External_Database_Row&) = default;
External_Database_Row& operator=(const External_Database_Row&) = default;
External_Database_Row(External_Database_Row&&) noexcept = default;
External_Database_Row& operator=(External_Database_Row&&) noexcept = default;
[[nodiscard]] std::optional<std::string> get(const std::string& column) const;
[[nodiscard]] Psc::JSON to_json() const;
};
using External_Database_Row_Map = std::map<std::string, std::shared_ptr<External_Database_Row>>;
struct External_Resource_Status {
std::string name;
std::size_t row_count{};
@@ -33,8 +39,6 @@ struct External_Resource_Status {
std::string message;
};
// 每个数据源模块只管理一张 SQLite 表。主键由数据源按业务含义选择:
// ICAO24、航班呼号、机场 ICAO 代码、机型代码或其他业务键。
class External_Resources {
public:
External_Resources(std::string name,
@@ -105,7 +109,7 @@ public:
using Row_Callback = std::function<void(std::exception_ptr, std::optional<External_Database_Row>)>;
using Row_Map_Callback = std::function<void(
std::exception_ptr,
std::map<std::string, std::shared_ptr<External_Database_Row>>)>;
External_Database_Row_Map)>;
External_Resources_Manager();
@@ -149,24 +153,24 @@ public:
Row_Map_Callback callback) const;
void async_external_database_status(Status_List_Callback callback) const;
[[nodiscard]] psco::awaitable<std::vector<External_Resource_Status>>
[[nodiscard]] concurrencpp::result<std::vector<External_Resource_Status>>
refresh_external_databases_coro(bool force_download = true);
[[nodiscard]] psco::awaitable<External_Resource_Status>
[[nodiscard]] concurrencpp::result<External_Resource_Status>
refresh_external_database_coro(std::string resource_name,
bool force_download = true);
[[nodiscard]] psco::awaitable<External_Resource_Status>
[[nodiscard]] concurrencpp::result<External_Resource_Status>
import_external_database_coro(std::string resource_name,
std::filesystem::path source_file);
[[nodiscard]] psco::awaitable<External_Resource_Status>
[[nodiscard]] concurrencpp::result<External_Resource_Status>
clear_external_database_table_coro(std::string resource_name);
[[nodiscard]] psco::awaitable<std::optional<External_Database_Row>>
[[nodiscard]] concurrencpp::result<std::optional<External_Database_Row>>
query_external_database_coro(std::string resource_name,
std::vector<std::string> primary_key_values) const;
[[nodiscard]] psco::awaitable<std::map<std::string, std::shared_ptr<External_Database_Row>>>
[[nodiscard]] concurrencpp::result<std::shared_ptr<External_Database_Row_Map>>
query_aircraft_external_databases_coro(std::string icao24) const;
[[nodiscard]] psco::awaitable<std::map<std::string, std::shared_ptr<External_Database_Row>>>
[[nodiscard]] concurrencpp::result<std::shared_ptr<External_Database_Row_Map>>
query_callsign_external_databases_coro(std::optional<std::string> callsign) const;
[[nodiscard]] psco::awaitable<std::vector<External_Resource_Status>>
[[nodiscard]] concurrencpp::result<std::vector<External_Resource_Status>>
external_database_status_coro() const;
void register_external_resource(std::unique_ptr<External_Resources> external_res);