#include "database.h" #include "group.h" #include "updatelookup.h" #include #include using namespace std; namespace PackageManagement { /*! * \brief The AlpmDataBase class wraps an ALPM database. */ /*! * \brief Returns the usage of the database. */ alpm_db_usage_t AlpmDataBase::usage() const { alpm_db_usage_t usage; if(!alpm_db_get_usage(m_ptr, &usage)) { return usage; } else { return static_cast(ALPM_DB_USAGE_ALL); // return default usage } } /*! * \brief Returns the server URLs. */ const QJsonArray &AlpmDataBase::serverUrls() const { if(m_serverUrls.empty()) { for(const char *str : servers()) { m_serverUrls << str; } } return m_serverUrls; } /*! * \brief Adds the specified server URLs. */ bool AlpmDataBase::addServerUrls(const QStringList &urls) { m_serverUrls = QJsonArray(); for(const auto &url : urls) { if(alpm_db_add_server(m_ptr, url.toLocal8Bit().data()) != 0) { return false; } } return true; } /*! * \brief Returns the packages of the database. */ const std::map &AlpmDataBase::packages() const { if(m_packages.empty()) { for(const AlpmPackage &pkg : PackageList(alpm_db_get_pkgcache(m_ptr))) { m_packages.emplace(QString::fromLocal8Bit(pkg.name()), pkg); } } return m_packages; } /*! * \brief Returns the package names of the data base as QStringList. */ QStringList AlpmDataBase::packageNames() const { QStringList packageNames; packageNames.reserve(packages().size()); for(const auto &pkg : packages()) { packageNames << pkg.first; } return packageNames; } /*! * \brief Returns the package names of the data base as a QJsonArray. */ const QJsonArray &AlpmDataBase::packageNameJsonArray() const { if(m_packageNamesJsonArray.empty()) { for(const auto &pkg : packages()) { m_packageNamesJsonArray << pkg.first; } } return m_packageNamesJsonArray; } /*! * \brief Returns group info (group name + package names). */ QJsonObject AlpmDataBase::groupInfo() const { QJsonObject groupInfo; groupInfo.insert(QStringLiteral("repo"), QString::fromLocal8Bit(name())); QJsonArray groupsArray; for(const AlpmGroup group : groups()) { QJsonObject info; info.insert(QStringLiteral("name"), QString::fromLocal8Bit(group.name())); info.insert(QStringLiteral("pkgs"), group.packageNames()); groupsArray << info; } groupInfo.insert(QStringLiteral("groups"), groupsArray); return groupInfo; } void AlpmDataBase::checkForUpgrades(const QList &syncDbs, UpdateLookupResults &results) const { if(syncDbs.isEmpty()) { results.noSources = true; } else { for(const auto &dbPkg : packages()) { bool orphaned = true; for(const auto *syncDb : syncDbs) { const auto &syncDbPkgs = syncDb->packages(); try { const auto &syncPkg = syncDbPkgs.at(dbPkg.first); switch(dbPkg.second.compareVersion(syncPkg)) { case PackageVersionComparsion::Equal: break; // ignore equal packages case PackageVersionComparsion::SoftwareUpgrade: results.newVersions << makeUpdateResult(syncPkg, dbPkg.second.version()); break; case PackageVersionComparsion::PackageUpgradeOnly: results.newReleases << makeUpdateResult(syncPkg, dbPkg.second.version()); break; case PackageVersionComparsion::NewerThenSyncVersion: results.downgrades << makeUpdateResult(syncPkg, dbPkg.second.version()); } orphaned = false; } catch(out_of_range &) { } } if(orphaned) { results.orphaned << dbPkg.second; } } } } } // namespace Alpm