重构协程
This commit is contained in:
@@ -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>>
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user