Fix passing architecture when creating database

When adding a new database when reloading the config at runtime the
architecture must be passed when creating the database. Otherwise we end up
with the new database sharing the internal storage with the x86_64 database
which leads to very confusing behavior.
This commit is contained in:
Martchus 2022-06-19 22:47:31 +02:00
parent 0a536a992a
commit 9f5474e128
5 changed files with 20 additions and 15 deletions

View File

@ -38,9 +38,10 @@ Database *Config::findDatabaseFromDenotation(std::string_view databaseDenotation
/*!
* \brief Creates a database with the specified \a name and appends it to the configuration.
*/
Database *Config::createDatabase(std::string &&name)
Database *Config::createDatabase(std::string &&name, std::string &&architecture)
{
auto *const db = &databases.emplace_back(std::string(name));
auto *const db = &databases.emplace_back(std::move(name));
db->arch = std::move(architecture);
if (storage()) {
db->initStorage(*storage());
}
@ -56,11 +57,11 @@ Database *Config::findOrCreateDatabase(std::string &&name, std::string_view arch
auto *db = findDatabase(name, architecture);
if (db) {
db->resetConfiguration(keepLocalPaths);
if (!architecture.empty()) {
db->arch = architecture;
}
} else {
db = createDatabase(std::move(name));
}
if (!architecture.empty()) {
db->arch = architecture;
db = createDatabase(std::move(name), std::string(architecture));
}
return db;
}
@ -74,11 +75,11 @@ Database *Config::findOrCreateDatabase(std::string_view name, std::string_view a
auto *db = findDatabase(name, architecture);
if (db) {
db->resetConfiguration(keepLocalPaths);
if (!architecture.empty()) {
db->arch = architecture;
}
} else {
db = createDatabase(std::string(name));
}
if (!architecture.empty()) {
db->arch = architecture;
db = createDatabase(std::string(name), std::string(architecture));
}
return db;
}

View File

@ -185,7 +185,7 @@ struct LIBPKG_EXPORT Config : public Lockable, public ReflectiveRapidJSON::Binar
SignatureLevelConfig signatureLevel;
private:
Database *createDatabase(std::string &&name);
Database *createDatabase(std::string &&name, std::string &&architecture);
bool addDepsRecursivelyInTopoOrder(std::vector<std::unique_ptr<TopoSortItem>> &allItems, std::vector<TopoSortItem *> &items,
std::vector<std::string> &ignored, std::vector<PackageSearchResult> &cycleTracking, const Dependency &dependency, BuildOrderOptions options,
bool onlyDependency);

View File

@ -4,6 +4,9 @@
#include "./storageprivate.h"
#include <c++utilities/conversion/stringbuilder.h>
#include <c++utilities/io/ansiescapecodes.h>
#include <iostream>
using namespace CppUtilities;
@ -289,6 +292,7 @@ DatabaseStorage::DatabaseStorage(const std::shared_ptr<LMDBSafe::MDBEnv> &env, P
, requiredLibs(env, argsToString(uniqueDatabaseName, "_librequires"))
, m_env(env)
{
std::cout << EscapeCodes::Phrases::InfoMessage << "Initialized database storage for \"" << uniqueDatabaseName << "\"\n";
}
std::size_t hash_value(const PackageCacheRef &ref)

View File

@ -96,11 +96,11 @@ void DataTests::setupPackages()
m_pkg3 = std::make_shared<Package>();
m_pkg3->name = "foo";
m_pkg3->version = "5.7-1";
auto *const db1 = m_config.findOrCreateDatabase("db1"sv, std::string_view());
auto *const db1 = m_config.findOrCreateDatabase("db1"sv, "x86_64"sv);
CPPUNIT_ASSERT_MESSAGE("ID for pkg 1 returned", m_pkgId1 = db1->updatePackage(m_pkg1));
CPPUNIT_ASSERT_MESSAGE("ID for pkg 2 returned", m_pkgId2 = db1->updatePackage(m_pkg2));
CPPUNIT_ASSERT_EQUAL_MESSAGE("packages added to db 1", 2_st, db1->packageCount());
auto *const db2 = m_config.findOrCreateDatabase("db2"sv, std::string_view());
auto *const db2 = m_config.findOrCreateDatabase("db2"sv, "x86_64"sv);
CPPUNIT_ASSERT_MESSAGE("ID for pkg 3 returned", m_pkgId3 = db2->updatePackage(m_pkg3));
CPPUNIT_ASSERT_EQUAL_MESSAGE("package added to db 2", 1_st, db2->packageCount());
}

View File

@ -302,7 +302,7 @@ void BuildActionsTests::testParsingInfoFromPkgFiles()
initStorage();
auto &config = m_setup.config;
for (const auto dbName : { "foo.db"sv, "bar.db"sv, "baz.db"sv }) {
config.findOrCreateDatabase(dbName, std::string_view());
config.findOrCreateDatabase(dbName, "x86_64"sv);
}
// init db object
@ -707,7 +707,7 @@ void BuildActionsTests::testCleanup()
// parse db
// note: The db actually only contains source-highlight and mingw-w64-harfbuzz
initStorage();
auto *const miscDb = m_setup.config.findOrCreateDatabase("misc"sv, std::string_view());
auto *const miscDb = m_setup.config.findOrCreateDatabase("misc"sv, "x86_64"sv);
miscDb->path = repoDir64 / "misc.db";
miscDb->localDbDir = miscDb->localPkgDir = repoDir64;
miscDb->loadPackagesFromConfiguredPaths();