150 lines
4.1 KiB
C++
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
|
|
|