keep sync dbs in order

This commit is contained in:
Martchus 2015-12-08 18:59:17 +01:00
parent 860b9ff865
commit 8f9d03baea
4 changed files with 52 additions and 73 deletions

View File

@ -109,8 +109,8 @@ const AlpmPackage *Manager::packageFromDatabase(const QString &dbName, const QSt
*/
AlpmPackage *Manager::packageFromSyncDatabases(const QString &pkgName)
{
for(const auto &dbEntry : syncDatabases()) {
if(auto *pkg = dbEntry.second->packageByName(pkgName)) {
for(const auto &dbEntry : m_syncDbs) {
if(auto *pkg = dbEntry->packageByName(pkgName)) {
return static_cast<AlpmPackage *>(pkg);
}
}
@ -122,8 +122,8 @@ AlpmPackage *Manager::packageFromSyncDatabases(const QString &pkgName)
*/
const AlpmPackage *Manager::packageFromSyncDatabases(const QString &pkgName) const
{
for(const auto &dbEntry : syncDatabases()) {
if(const auto *pkg = dbEntry.second->packageByName(pkgName)) {
for(const auto &dbEntry : m_syncDbs) {
if(const auto *pkg = dbEntry->packageByName(pkgName)) {
return static_cast<const AlpmPackage *>(pkg);
}
}
@ -151,9 +151,9 @@ unique_ptr<AlpmOwnershipPackage> Manager::packageFromFile(const char *fileName,
*/
Package *Manager::packageProviding(const Dependency &dependency)
{
for(auto &dbEntry : syncDatabases()) {
QReadLocker locker(dbEntry.second->lock());
if(auto *pkg = dbEntry.second->packageProviding(dependency)) {
for(auto &dbEntry : m_syncDbs) {
QReadLocker locker(dbEntry->lock());
if(auto *pkg = dbEntry->packageProviding(dependency)) {
return pkg;
}
}
@ -166,9 +166,9 @@ Package *Manager::packageProviding(const Dependency &dependency)
*/
const Package *Manager::packageProviding(const Dependency &dependency) const
{
for(const auto &dbEntry : syncDatabases()) {
QReadLocker locker(dbEntry.second->lock());
if(const auto *pkg = dbEntry.second->packageProviding(dependency)) {
for(const auto &dbEntry : m_syncDbs) {
QReadLocker locker(dbEntry->lock());
if(const auto *pkg = dbEntry->packageProviding(dependency)) {
return pkg;
}
}
@ -331,7 +331,7 @@ void Manager::registerDataBasesFromPacmanConfig()
cerr << shchar << "Error: Unable to add database from pacman config: The database name mustn't be \"local\" because this name is reserved for the local database." << endl;
} else if(dbName.startsWith(QLatin1String("aur"), Qt::CaseInsensitive)) {
cerr << shchar << "Error: Unable to add database from pacman config: The database name mustn't start with \"aur\" because this name is reserved for the Arch Linux User Repository." << endl;
} else if(m_syncDbs.count(dbName)) {
} else if(m_syncDbMap.count(dbName)) {
cerr << shchar << "Error: Unable to add database from pacman config: Database names must be unique. Ignoring second occurance of database \"" << scope.first << "\"." << endl;
} else {
// read sig level and usage
@ -393,10 +393,11 @@ void Manager::registerDataBasesFromPacmanConfig()
}
}
// add sync db to internal map (use as index size + 1 because the local database has index 0)
auto emplaced = m_syncDbs.emplace(dbName, make_unique<AlpmDatabase>(db, m_config.alpmDbPath(), m_syncDbs.size() + 1));
m_syncDbs.emplace_back(make_unique<AlpmDatabase>(db, m_config.alpmDbPath(), m_syncDbs.size() + 1));
auto emplaced = m_syncDbMap.emplace(dbName, m_syncDbs.back().get());
if(usage & ALPM_DB_USAGE_UPGRADE) {
// -> db is used to upgrade local database
localDataBase()->upgradeSources() << emplaced.first->second.get();
localDataBase()->upgradeSources() << emplaced.first->second;
}
} else {
cerr << shchar << "Error: Unable to add sync database [" << scope.first << ']' << endl;
@ -418,7 +419,7 @@ void Manager::registerDatabasesFromRepoIndexConfig()
for(const RepoEntry &repoEntry : m_config.repoEntries()) {
AlpmDatabase *syncDb = nullptr;
try {
syncDb = m_syncDbs.at(repoEntry.name()).get();
syncDb = m_syncDbMap.at(repoEntry.name());
cerr << shchar << "Applying config for database [" << syncDb->name() << ']' << endl;
if(!repoEntry.dataBasePath().isEmpty()) {
cerr << shchar << "Warning: Can't use data base path specified in repo index config because the repo \""
@ -438,9 +439,10 @@ void Manager::registerDatabasesFromRepoIndexConfig()
} else {
// TODO: database path
auto *db = alpm_register_syncdb(m_handle, repoEntry.name().toLocal8Bit().data(), static_cast<alpm_siglevel_t>(repoEntry.sigLevel()));
auto emplaced = m_syncDbs.emplace(repoEntry.name(), make_unique<AlpmDatabase>(db, m_config.alpmDbPath(), m_syncDbs.size() + 1));
m_syncDbs.emplace_back(make_unique<AlpmDatabase>(db, m_config.alpmDbPath(), m_syncDbs.size() + 1));
auto emplaced = m_syncDbMap.emplace(repoEntry.name(), m_syncDbs.back().get());
if(emplaced.second) {
syncDb = emplaced.first->second.get();
syncDb = emplaced.first->second;
syncDb->setSourcesDirectory(repoEntry.sourceDir());
syncDb->setPackagesDirectory(repoEntry.packageDir());
if(m_config.isVerbose() || m_config.runServer()) {
@ -456,7 +458,7 @@ void Manager::registerDatabasesFromRepoIndexConfig()
// add upgrade sources
for(const RepoEntry &repoEntry : m_config.repoEntries()) {
try {
auto &upgradeSources = m_syncDbs.at(repoEntry.name())->upgradeSources();
auto &upgradeSources = m_syncDbMap.at(repoEntry.name())->upgradeSources();
for(const auto &upgradeSourceName : repoEntry.upgradeSources()) {
if(auto *source = repositoryByName(upgradeSourceName)) {
upgradeSources << source;
@ -480,9 +482,9 @@ void Manager::initAlpmDataBases(bool computeRequiredBy)
// call the init method
{
QList<PackageLoader *> loaders;
loaders.reserve(m_syncDbs.size() + 1);
loaders.reserve(m_syncDbMap.size() + 1);
loaders << localDataBase()->init();
for(auto &syncDbEntry : m_syncDbs) {
for(auto &syncDbEntry : m_syncDbMap) {
loaders << syncDbEntry.second->init();
}
for(auto *loader : loaders) {
@ -493,9 +495,9 @@ void Manager::initAlpmDataBases(bool computeRequiredBy)
// compute required-by and optional-for
if(computeRequiredBy) {
QList<QFuture<void> > futures;
futures.reserve(m_syncDbs.size() + 1);
futures.reserve(m_syncDbMap.size() + 1);
futures << localDataBase()->computeRequiredBy(*this);
for(auto &syncDbEntry : m_syncDbs) {
for(auto &syncDbEntry : m_syncDbMap) {
futures << syncDbEntry.second->computeRequiredBy(*this);
}
for(auto &future : futures) {
@ -555,9 +557,9 @@ void Manager::unregisterSyncDataBases()
* \brief Returns a list of all sync databases.
* \remarks Sync databases must be registered with parsePacmanConfig() before.
*/
const std::map<QString, std::unique_ptr<AlpmDatabase> > &Manager::syncDatabases() const
const std::map<QString, AlpmDatabase *> &Manager::syncDatabases() const
{
return m_syncDbs; // m_syncDbs has been filled when the databases were registered
return m_syncDbMap; // m_syncDbs has been filled when the databases were registered
}
/*!
@ -652,7 +654,7 @@ const QJsonArray &Manager::groupInfo() const
QMutexLocker locker(&m_groupInfoMutex);
if(m_groupInfo.empty()) {
m_groupInfo << localDataBase()->groupInfo();
for(const auto &db : m_syncDbs) {
for(const auto &db : m_syncDbMap) {
m_groupInfo << db.second->groupInfo();
}
}
@ -684,6 +686,7 @@ void Manager::cleanupAlpm()
m_handle = nullptr;
m_localDb.reset();
m_syncDbs.clear();
m_syncDbMap.clear();
}
}
@ -696,7 +699,7 @@ const AlpmDatabase *Manager::databaseByName(const QString &dbName) const
return localDataBase();
} else {
try {
return m_syncDbs.at(dbName).get();
return m_syncDbMap.at(dbName);
} catch(const out_of_range &) {
return nullptr;
}
@ -712,7 +715,7 @@ AlpmDatabase *Manager::databaseByName(const QString &dbName)
return localDataBase();
} else {
try {
return m_syncDbs.at(dbName).get();
return m_syncDbMap.at(dbName);
} catch(const out_of_range &) {
return nullptr;
}
@ -730,7 +733,7 @@ const Repository *Manager::repositoryByName(const QString &name) const
return userRepository();
} else {
try {
return m_syncDbs.at(name).get();
return m_syncDbMap.at(name);
} catch(const out_of_range &) {
return nullptr;
}
@ -748,7 +751,7 @@ Repository *Manager::repositoryByName(const QString &name)
return userRepository();
} else {
try {
return m_syncDbs.at(name).get();
return m_syncDbMap.at(name);
} catch(const out_of_range &) {
return nullptr;
}

View File

@ -71,7 +71,7 @@ public:
// repository lookup
const AlpmDatabase *localDataBase() const;
AlpmDatabase *localDataBase();
const std::map<QString, std::unique_ptr<AlpmDatabase> > &syncDatabases() const;
const std::map<QString, AlpmDatabase *> &syncDatabases() const;
const AlpmDatabase *databaseByName(const QString &dbName) const;
AlpmDatabase *databaseByName(const QString &dbName);
const Repository *repositoryByName(const QString &name) const;
@ -96,7 +96,8 @@ private:
QNetworkAccessManager m_networkAccessManager;
std::unique_ptr<UserRepository> m_userRepo;
std::unique_ptr<AlpmDatabase> m_localDb;
std::map<QString, std::unique_ptr<AlpmDatabase> > m_syncDbs;
std::list<std::unique_ptr<AlpmDatabase> > m_syncDbs;
std::map<QString, AlpmDatabase *> m_syncDbMap;
mutable QJsonObject m_basicRepoInfo;
mutable QMutex m_basicRepoInfoMutex;
mutable QJsonArray m_groupInfo;

View File

@ -35,42 +35,25 @@ MingwBundle::MingwBundle(Manager &manager, const ApplicationUtilities::StringVec
string missing;
// add mingw-w64 packages
for(const auto &pkgName : packages) {
bool found = false;
for(const auto &syncDb : manager.syncDatabases()) {
const Dependency dep(QString::fromLocal8Bit(ConversionUtilities::startsWith(pkgName, prefix) ? pkgName.data() : (prefix + pkgName).data()));
if(auto *pkg = syncDb.second->packageProviding(dep)) {
if(missing.empty()) {
decltype(m_packages)::value_type entry(syncDb.second.get(), pkg);
if(find(m_packages.cbegin(), m_packages.cend(), entry) == m_packages.cend()) {
m_packages.emplace_back(entry);
}
}
if(auto *pkg = manager.packageProviding(Dependency(QString::fromLocal8Bit(ConversionUtilities::startsWith(pkgName, prefix) ? pkgName.data() : (prefix + pkgName).data())))) {
decltype(m_packages)::value_type entry(pkg->repository(), pkg);
if(find(m_packages.cbegin(), m_packages.cend(), entry) == m_packages.cend()) {
m_packages.emplace_back(entry);
addDependencies(pkg);
found = true;
break;
}
}
if(!found) {
} else {
missing.push_back(' ');
missing.append(pkgName);
}
}
// add additional icon packages
for(const auto &pkgName : iconPackages) {
bool found = false;
for(const auto &syncDb : manager.syncDatabases()) {
if(auto *pkg = syncDb.second->packageByName(QString::fromLocal8Bit(pkgName.data()))) {
if(missing.empty()) {
decltype(m_packages)::value_type entry(syncDb.second.get(), pkg);
if(find(m_packages.cbegin(), m_packages.cend(), entry) == m_packages.cend()) {
m_packages.emplace_back(entry);
}
}
found = true;
break;
if(auto *pkg = manager.packageProviding(Dependency(QString::fromLocal8Bit(pkgName.data())))) {
decltype(m_packages)::value_type entry(pkg->repository(), pkg);
if(find(m_packages.cbegin(), m_packages.cend(), entry) == m_packages.cend()) {
m_packages.emplace_back(entry);
}
}
if(!found) {
} else {
missing.push_back(' ');
missing.append(pkgName);
}
@ -91,23 +74,15 @@ void MingwBundle::addDependencies(const Package *pkg)
string missing;
for(const auto &dep : pkg->dependencies()) {
if(dep.name.startsWith(QLatin1String("mingw-w64-"), Qt::CaseInsensitive)) {
bool found = false;
for(const auto &syncDbEntry : m_manager.syncDatabases()) {
if(const auto *pkg = syncDbEntry.second->packageProviding(dep)) {
if(missing.empty()) {
decltype(m_packages)::value_type entry(syncDbEntry.second.get(), pkg);
if(find(m_packages.cbegin(), m_packages.cend(), entry) == m_packages.cend()) {
m_packages.emplace_back(entry);
addDependencies(pkg);
}
}
found = true;
break;
if(auto *pkg = m_manager.packageProviding(dep)) {
decltype(m_packages)::value_type entry(pkg->repository(), pkg);
if(find(m_packages.cbegin(), m_packages.cend(), entry) == m_packages.cend()) {
m_packages.emplace_back(entry);
addDependencies(pkg);
}
}
if(!found) {
} else {
missing.push_back(' ');
missing.append(dep.name.toLocal8Bit().data());
missing.append(dep.name.toLocal8Bit());
}
}
}

View File

@ -23,7 +23,7 @@ private:
void addDependencies(const Package *pkg);
Manager &m_manager;
std::list<std::pair<const AlpmDatabase *, const Package *> > m_packages;
std::list<std::pair<const Repository *, const Package *> > m_packages;
const ApplicationUtilities::StringVector &m_extraPackages;
};