#ifndef LIBPKG_DATA_STORAGE_PRIVATE_H #define LIBPKG_DATA_STORAGE_PRIVATE_H #include "./package.h" #include "./storagegeneric.h" #include namespace LibPkg { using PackageStorage = LMDBSafe::TypedDBI>; using DependencyStorage = LMDBSafe::TypedDBI>; using LibraryDependencyStorage = LMDBSafe::TypedDBI>; using PackageCacheRef = StorageCacheRef; using PackageCacheEntry = StorageCacheEntry; using PackageCacheEntries = StorageCacheEntries; using PackageCacheEntryByID = typename PackageCacheEntries::ByID::result_type; using PackageCache = StorageCache; extern template struct StorageCacheRef; extern template struct StorageCacheEntry; extern template class StorageCacheEntries; extern template struct StorageCache; struct StorageDistribution { explicit StorageDistribution(const char *path, std::uint32_t maxDbs); std::unique_ptr forDatabase(std::string_view uniqueDatabaseName); PackageCache &packageCache(); private: std::shared_ptr m_env; PackageCache m_packageCache; }; inline std::unique_ptr StorageDistribution::forDatabase(std::string_view uniqueDatabaseName) { return std::make_unique(m_env, m_packageCache, uniqueDatabaseName); } inline PackageCache &StorageDistribution::packageCache() { return m_packageCache; } struct DatabaseStorage { explicit DatabaseStorage(const std::shared_ptr &env, PackageCache &packageCache, std::string_view uniqueDatabaseName); PackageCache &packageCache; PackageStorage packages; DependencyStorage providedDeps; DependencyStorage requiredDeps; LibraryDependencyStorage providedLibs; LibraryDependencyStorage requiredLibs; std::mutex updateMutex; // must be acquired to update packages, concurrent reads should still be possible private: std::shared_ptr m_env; }; std::size_t hash_value(const PackageCacheRef &ref); std::size_t hash_value(const PackageCacheEntryByID &entryByID); } // namespace LibPkg #endif // LIBPKG_DATA_STORAGE_PRIVATE_H