From 28225d56119178bc42d734ce895c34464d705f42 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sat, 9 Dec 2017 19:42:26 +0100 Subject: [PATCH] Ref T203, update info combining artifacts and distributions --- src/blackmisc/db/db.h | 1 + src/blackmisc/db/registermetadatadb.cpp | 1 + src/blackmisc/db/updateinfo.cpp | 145 ++++++++++++++++++++++++ src/blackmisc/db/updateinfo.h | 125 ++++++++++++++++++++ 4 files changed, 272 insertions(+) create mode 100644 src/blackmisc/db/updateinfo.cpp create mode 100644 src/blackmisc/db/updateinfo.h diff --git a/src/blackmisc/db/db.h b/src/blackmisc/db/db.h index 0ef835eec..cc68873d3 100644 --- a/src/blackmisc/db/db.h +++ b/src/blackmisc/db/db.h @@ -25,5 +25,6 @@ #include "blackmisc/db/distributionlist.h" #include "blackmisc/db/artifact.h" #include "blackmisc/db/artifactlist.h" +#include "blackmisc/db/updateinfo.h" #endif // guard diff --git a/src/blackmisc/db/registermetadatadb.cpp b/src/blackmisc/db/registermetadatadb.cpp index 1eacc7f90..bd51aac0e 100644 --- a/src/blackmisc/db/registermetadatadb.cpp +++ b/src/blackmisc/db/registermetadatadb.cpp @@ -23,6 +23,7 @@ namespace BlackMisc CArtifactList::registerMetadata(); CDistribution::registerMetadata(); CDistributionList::registerMetadata(); + CUpdateInfo::registerMetadata(); } } // ns } // ns diff --git a/src/blackmisc/db/updateinfo.cpp b/src/blackmisc/db/updateinfo.cpp new file mode 100644 index 000000000..2dd4de9f0 --- /dev/null +++ b/src/blackmisc/db/updateinfo.cpp @@ -0,0 +1,145 @@ +/* Copyright (C) 2017 + * swift project community / contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +#include "updateinfo.h" +#include "blackconfig/buildconfig.h" +#include + +using namespace BlackConfig; + +namespace BlackMisc +{ + namespace Db + { + CUpdateInfo::CUpdateInfo(const CArtifactList &artifacts, const CDistributionList &distributions) : + m_distributions(distributions) + { + m_artifactsPilotClient = artifacts.findByType(CArtifact::PilotClientInstaller); + m_artifactsXsb = artifacts.findByType(CArtifact::XSwiftBus); + } + + CDistributionList CUpdateInfo::getDistributionsPilotClientForCurrentPlatform() const + { + const CArtifactList artifacts = this->getArtifactsPilotClient().findMatchingForCurrentPlatform(); + CDistributionList distributions = artifacts.getDistributions(); + distributions.sortByStability(); + return distributions; + } + + CArtifactList CUpdateInfo::getArtifactsPilotClientForCurrentPlatform() const + { + CArtifactList artifacts = m_artifactsPilotClient.findMatchingForCurrentPlatform(); + artifacts.sortByVersion(Qt::DescendingOrder); + return artifacts; + } + + CArtifactList CUpdateInfo::getArtifactsXsbLatestVersionFirst() const + { + CArtifactList artifacts(m_artifactsXsb); + artifacts.sortByVersion(Qt::DescendingOrder); + return artifacts; + } + + CArtifactList CUpdateInfo::getArtifactsXsbForCurrentPlatform() const + { + CArtifactList artifacts = m_artifactsXsb.findMatchingForCurrentPlatform(); + artifacts.sortByVersion(Qt::DescendingOrder); + return artifacts; + } + + CDistribution CUpdateInfo::anticipateOwnDistribution() const + { + if (this->isEmpty()) { return CDistribution(); } + const CArtifactList ownArtifacts = this->getArtifactsPilotClientForCurrentPlatform(); + if (ownArtifacts.isEmpty()) { return CDistribution(); } + + const QVersionNumber myVersion = CBuildConfig::getVersion(); + const QVersionNumber latestVersion = ownArtifacts.getLatestQVersion(); + if (myVersion > latestVersion) + { + // dev. version + return ownArtifacts.getDistributions().getLeastStableOrDefault(); + } + + const CArtifact exactVersion = ownArtifacts.findFirstByVersionOrDefault(myVersion); + if (!exactVersion.isUnknown()) { return exactVersion.getDistributions().getMostStableOrDefault(); } + + return CDistribution(); + } + + QStringList CUpdateInfo::anticipateMyDefaultChannelAndPlatform() const + { + const CArtifactList myArtifacts = this->getArtifactsPilotClient().findMatchingForCurrentPlatform(); + const CDistribution mostStable = myArtifacts.getDistributions().getMostStableOrDefault(); + return QStringList({ mostStable.getClassName(), CPlatform::currentPlatform().getPlatformName() }); + } + + QString CUpdateInfo::convertToQString(bool i18n) const + { + return this->convertToQString(", ", i18n); + } + + QString CUpdateInfo::convertToQString(const QString &separator, bool i18n) const + { + Q_UNUSED(i18n); + return QLatin1String("artifacts (PC): ") % + this->getArtifactsPilotClient().toQString(i18n) % + separator % + QLatin1String("artifacts (XSB): ") % + this->getArtifactsXsb().toQString(i18n) % + separator % + QLatin1String("distributions: ") % + this->getDistributions().toQString(i18n); + } + + CVariant CUpdateInfo::propertyByIndex(const CPropertyIndex &index) const + { + if (index.isMyself()) { return CVariant::from(*this); } + const ColumnIndex i = index.frontCasted(); + switch (i) + { + case IndexArtifactsPilotClient: return CVariant::fromValue(m_artifactsPilotClient); + case IndexArtifactsXSwiftBus: CVariant::fromValue(m_artifactsXsb); + case IndexDistributions: return CVariant::fromValue(m_distributions); + default: return CValueObject::propertyByIndex(index); + } + } + + void CUpdateInfo::setPropertyByIndex(const CPropertyIndex &index, const CVariant &variant) + { + if (index.isMyself()) { (*this) = variant.to(); return; } + const ColumnIndex i = index.frontCasted(); + switch (i) + { + case IndexArtifactsPilotClient: m_artifactsPilotClient = variant.value(); break; + case IndexArtifactsXSwiftBus: m_artifactsXsb = variant.value(); break; + case IndexDistributions: m_distributions = variant.value(); break; + default: CValueObject::setPropertyByIndex(index, variant); break; + } + } + + CUpdateInfo CUpdateInfo::fromDatabaseJson(const QJsonObject &json, const QString &prefix) + { + Q_UNUSED(prefix); // not nested + const QJsonArray jsonDistributions = json.value("distributions").toArray(); + const QJsonArray jsonArtifacts = json.value("artifacts").toArray(); + const CDistributionList distributions = CDistributionList::fromDatabaseJson(jsonDistributions); + const CArtifactList artifacts = CArtifactList::fromDatabaseJson(jsonArtifacts); + Q_ASSERT_X(jsonDistributions.size() == distributions.size(), Q_FUNC_INFO, "size mismatch"); + Q_ASSERT_X(artifacts.size() == artifacts.size(), Q_FUNC_INFO, "size mismatch"); + return CUpdateInfo(artifacts, distributions); + } + + CUpdateInfo CUpdateInfo::fromDatabaseJson(const QString &jsonString) + { + if (jsonString.isEmpty()) { return CUpdateInfo(); } + return CUpdateInfo::fromDatabaseJson(Json::jsonObjectFromString(jsonString)); + } + } // ns +} // ns diff --git a/src/blackmisc/db/updateinfo.h b/src/blackmisc/db/updateinfo.h new file mode 100644 index 000000000..d0a02048d --- /dev/null +++ b/src/blackmisc/db/updateinfo.h @@ -0,0 +1,125 @@ +/* Copyright (C) 2017 + * swift project community / contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +//! \file + +#ifndef BLACKMISC_DB_UPDATEINFO_H +#define BLACKMISC_DB_UPDATEINFO_H + +#include "artifactlist.h" +#include "distributionlist.h" +#include "blackmisc/datacache.h" +#include "blackmisc/valueobject.h" +#include + +namespace BlackMisc +{ + namespace Db + { + //! Update info, i.e. artifacts and distributions + //! \sa CArtifact + //! \sa CDistribution + class BLACKMISC_EXPORT CUpdateInfo : public CValueObject + { + public: + //! Properties by index + enum ColumnIndex + { + IndexArtifactsPilotClient = CPropertyIndex::GlobalIndexCUpdateInfo, + IndexArtifactsXSwiftBus, + IndexDistributions + }; + + //! Constructor + CUpdateInfo() {} + + //! Constructor + CUpdateInfo(const CArtifactList &artifacts, const CDistributionList &distributions); + + //! Destructor. + ~CUpdateInfo() {} + + //! Artifacts (pilot client) + const CArtifactList &getArtifactsPilotClient() const { return m_artifactsPilotClient; } + + //! Artifacts for current platform + //! \note sorted by version + CArtifactList getArtifactsPilotClientForCurrentPlatform() const; + + //! Artifacts (XSwiftBus) + const CArtifactList &getArtifactsXsb() const { return m_artifactsXsb; } + + //! Artifacts (XSwiftBus) + CArtifactList getArtifactsXsbLatestVersionFirst() const; + + //! Artifacts for current platform + //! \note sorted by version + CArtifactList getArtifactsXsbForCurrentPlatform() const; + + //! Distributions (all) + const CDistributionList &getDistributions() const { return m_distributions; } + + //! Distributions for current platform + CDistributionList getDistributionsPilotClientForCurrentPlatform() const; + + //! Own distribution + CDistribution anticipateOwnDistribution() const; + + //! Default channel, OS + QStringList anticipateMyDefaultChannelAndPlatform() const; + + //! Empty (no data) + bool isEmpty() const { return m_artifactsPilotClient.isEmpty() && m_distributions.isEmpty(); } + + //! \copydoc BlackMisc::Mixin::String::toQString + QString convertToQString(bool i18n = false) const; + + //! To string + QString convertToQString(const QString &separator, bool i18n = false) const; + + //! \copydoc BlackMisc::Mixin::Index::propertyByIndex + BlackMisc::CVariant propertyByIndex(const BlackMisc::CPropertyIndex &index) const; + + //! \copydoc BlackMisc::Mixin::Index::setPropertyByIndex + void setPropertyByIndex(const BlackMisc::CPropertyIndex &index, const BlackMisc::CVariant &variant); + + //! Object from database JSON format + static CUpdateInfo fromDatabaseJson(const QJsonObject &json, const QString &prefix = {}); + + //! Object from database JSOn format + static CUpdateInfo fromDatabaseJson(const QString &jsonString); + + private: + CArtifactList m_artifactsPilotClient; //!< artifacts pilot client + CArtifactList m_artifactsXsb; //!< artifacts XSwiftBus + CDistributionList m_distributions; //!< all distributions (for any artifacts) + + BLACK_METACLASS( + CUpdateInfo, + BLACK_METAMEMBER(artifactsPilotClient), + BLACK_METAMEMBER(artifactsXsb), + BLACK_METAMEMBER(distributions) + ); + }; + + //! Trait for update info, i.e. distributions and artifacts + struct TUpdateInfo : public TDataTrait + { + //! Key in data cache + static const char *key() { return "updateinfo"; } + + //! First load is synchronous + static constexpr bool isPinned() { return true; } + }; + } // ns +} // ns + +Q_DECLARE_METATYPE(BlackMisc::Db::CUpdateInfo) + +#endif // guard