#ifndef LIBREPOMGR_DATABASE_H #define LIBREPOMGR_DATABASE_H #include "../multisession.h" #include "../serversetup.h" #include "./session.h" #include #include #include namespace LibRepoMgr { struct LogContext; namespace WebClient { using DatabaseQuerySession = MultiSession; struct DatabaseQueryParams { std::string databaseName; std::string databaseArch; std::string url; std::string destinationFilePath; }; struct DatabaseQuery { std::vector queryParamsForDbs; std::vector failedDbs; }; [[nodiscard]] DatabaseQuery prepareDatabaseQuery(LogContext &log, const std::vector &dbs, bool withFiles); std::shared_ptr queryDatabases( LogContext &log, ServiceSetup &setup, std::vector &&urls, DatabaseQuerySession::HandlerType &&handler); std::shared_ptr queryDatabases(LogContext &log, ServiceSetup &setup, std::shared_lock *configReadLock, const std::vector &dbs, DatabaseQuerySession::HandlerType &&handler); void queryDatabases( LogContext &log, ServiceSetup &setup, std::vector &&urls, std::shared_ptr &dbQuerySession); struct PackageCachingDataForPackage { std::string_view url; std::string_view destinationFilePath; std::string error; }; using PackageCachingDataForDatabase = std::unordered_map; using PackageCachingDataForSession = std::unordered_map; struct PackageCachingSession; void cachePackages(LogContext &log, std::shared_ptr &&packageCachingSession, std::optional bodyLimit = std::nullopt, std::size_t maxParallelDownloads = 8); struct PackageCachingSession : public MultiSession { friend void cachePackages(LogContext &, std::shared_ptr &&, std::optional, std::size_t); using SharedPointerType = std::shared_ptr; explicit PackageCachingSession( PackageCachingDataForSession &data, boost::asio::io_context &ioContext, boost::asio::ssl::context &sslContext, HandlerType &&handler); private: void selectNextPackage(); PackageCachingDataForPackage *getCurrentDataAndSelectNext(); boost::asio::ssl::context &m_sslContext; PackageCachingDataForSession &m_data; std::mutex m_mutex; PackageCachingDataForSession::iterator m_dbIterator, m_dbEnd; PackageCachingDataForDatabase::iterator m_packageIterator, m_packageEnd; }; } // namespace WebClient } // namespace LibRepoMgr #endif // LIBREPOMGR_DATABASE_H