repoindex/alpm/database.cpp

150 lines
4.1 KiB
C++

#include "database.h"
#include "group.h"
#include "updatelookup.h"
#include <QList>
#include <QJsonObject>
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_t>(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<QString, AlpmPackage> &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<const AlpmDataBase *> &syncDbs, UpdateLookupResults<AlpmPackage> &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