diff options
author | Arttu Tarkiainen <arttu.tarkiainen@qt.io> | 2022-11-11 16:24:47 +0200 |
---|---|---|
committer | Arttu Tarkiainen <arttu.tarkiainen@qt.io> | 2022-11-14 15:37:28 +0200 |
commit | c5500a34e21f548533dea60d7c912882c56fe801 (patch) | |
tree | e7b46327f2cd6c5d37fc24634a1c00f38b166df0 | |
parent | 2d001a3d8d4cde6264e9073e8d586d1e9855abd8 (diff) |
MetadataJob: split refreshing cached items into its own method
The original method for the moved part was getting quite long.
Change-Id: Icc892a7c3623dec3c94215fc553409d060d06aa2
Reviewed-by: Katja Marttila <katja.marttila@qt.io>
-rw-r--r-- | src/libs/installer/metadatajob.cpp | 92 | ||||
-rw-r--r-- | src/libs/installer/metadatajob.h | 1 |
2 files changed, 56 insertions, 37 deletions
diff --git a/src/libs/installer/metadatajob.cpp b/src/libs/installer/metadatajob.cpp index c28770192..5179896ac 100644 --- a/src/libs/installer/metadatajob.cpp +++ b/src/libs/installer/metadatajob.cpp @@ -738,43 +738,14 @@ MetadataJob::Status MetadataJob::parseUpdatesXml(const QList<FileTaskResult> &re hash.addData(&file); const QByteArray updatesChecksum = hash.result().toHex(); - Metadata *cachedMetadata = m_metaFromCache.itemByChecksum(updatesChecksum); - if (cachedMetadata) { - const Repository repository = item.value(TaskRole::UserRole).value<Repository>(); - if (cachedMetadata->isValid() && !repository.isCompressed()) { - // Refresh repository information to cache. Same repository may appear in multiple - // categories and the metadata may be available from default repositories simultaneously. - cachedMetadata->setRepository(repository); - if (!repository.categoryname().isEmpty()) - m_fetchedCategorizedRepositories.insert(repository); // For faster lookups - else - cachedMetadata->setAvailableFromDefaultRepository(true); - - // Refresh also persistent information, the url of the repository may have changed - // from the last fetch. - cachedMetadata->setPersistentRepositoryPath(repository.url()); - - // search for additional repositories that we might need to check - QDomDocument doc = cachedMetadata->updatesDocument(); - const MetadataJob::Status status - = parseRepositoryUpdates(doc.documentElement(), result, cachedMetadata); - if (status == XmlDownloadRetry) { - // The repository update may have removed or replaced current repositories, - // clear repository information from cached items and refresh on next fetch run. - resetCacheRepositories(); - return status; - } + bool refreshed; + Status status = refreshCacheItem(result, updatesChecksum, &refreshed); + if (status != XmlDownloadSuccess) + return status; + + if (refreshed) // Found existing metadata + continue; - continue; - } - // Missing or corrupted files, or compressed repository which takes priority - // over remote repository. We will re-download and uncompress - // the metadata. Remove broken item from the cache. - if (!m_metaFromCache.removeItem(updatesChecksum)) { - qCWarning(lcInstallerInstallLog) << m_metaFromCache.errorString(); - return XmlDownloadFailure; - } - } metadata->setChecksum(updatesChecksum); file.seek(0); @@ -849,7 +820,7 @@ MetadataJob::Status MetadataJob::parseUpdatesXml(const QList<FileTaskResult> &re m_fetchedMetadata.insert(metadataPath, metadata.take()); // search for additional repositories that we might need to check - const MetadataJob::Status status = parseRepositoryUpdates(root, result, metadataPtr); + status = parseRepositoryUpdates(root, result, metadataPtr); if (status == XmlDownloadRetry) { // The repository update may have removed or replaced current repositories, // clear repository information from cached items and refresh on next fetch run. @@ -864,6 +835,53 @@ MetadataJob::Status MetadataJob::parseUpdatesXml(const QList<FileTaskResult> &re return XmlDownloadSuccess; } +MetadataJob::Status MetadataJob::refreshCacheItem(const FileTaskResult &result, + const QByteArray &checksum, bool *refreshed) +{ + Q_ASSERT(refreshed); + *refreshed = false; + + Metadata *cachedMetadata = m_metaFromCache.itemByChecksum(checksum); + if (!cachedMetadata) + return XmlDownloadSuccess; + + const FileTaskItem item = result.value(TaskRole::TaskItem).value<FileTaskItem>(); + const Repository repository = item.value(TaskRole::UserRole).value<Repository>(); + if (cachedMetadata->isValid() && !repository.isCompressed()) { + // Refresh repository information to cache. Same repository may appear in multiple + // categories and the metadata may be available from default repositories simultaneously. + cachedMetadata->setRepository(repository); + if (!repository.categoryname().isEmpty()) + m_fetchedCategorizedRepositories.insert(repository); // For faster lookups + else + cachedMetadata->setAvailableFromDefaultRepository(true); + + // Refresh also persistent information, the url of the repository may have changed + // from the last fetch. + cachedMetadata->setPersistentRepositoryPath(repository.url()); + + // search for additional repositories that we might need to check + QDomDocument doc = cachedMetadata->updatesDocument(); + const Status status = parseRepositoryUpdates(doc.documentElement(), result, cachedMetadata); + if (status == XmlDownloadRetry) { + // The repository update may have removed or replaced current repositories, + // clear repository information from cached items and refresh on next fetch run. + resetCacheRepositories(); + return status; + } + *refreshed = true; + return XmlDownloadSuccess; + } + // Missing or corrupted files, or compressed repository which takes priority + // over remote repository. We will re-download and uncompress + // the metadata. Remove broken item from the cache. + if (!m_metaFromCache.removeItem(checksum)) { + qCWarning(lcInstallerInstallLog) << m_metaFromCache.errorString(); + return XmlDownloadFailure; + } + return XmlDownloadSuccess; +} + MetadataJob::Status MetadataJob::parseRepositoryUpdates(const QDomElement &root, const FileTaskResult &result, Metadata *metadata) { diff --git a/src/libs/installer/metadatajob.h b/src/libs/installer/metadatajob.h index 9e8116124..18554ca08 100644 --- a/src/libs/installer/metadatajob.h +++ b/src/libs/installer/metadatajob.h @@ -97,6 +97,7 @@ private: void reset(); void resetCompressedFetch(); Status parseUpdatesXml(const QList<FileTaskResult> &results); + Status refreshCacheItem(const FileTaskResult &result, const QByteArray &checksum, bool *refreshed); Status parseRepositoryUpdates(const QDomElement &root, const FileTaskResult &result, Metadata *metadata); QSet<Repository> getRepositories(); void addFileTaskItem(const QString &source, const QString &target, Metadata *metadata, |