/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #include "katja/database.hpp" #include namespace katja { database_package database_package::create_database_package(const std::string& fullname) { std::string::const_reverse_iterator begin_iterator = std::crbegin(fullname); std::string::const_reverse_iterator end_iterator = begin_iterator; int minus_counter = 0; std::string build_tag; std::string architecture; std::string version; for (; begin_iterator != std::crend(fullname) && minus_counter < 3; ++begin_iterator) { if (*begin_iterator == '-') { if (minus_counter == 0) { build_tag = std::string(begin_iterator.base(), end_iterator.base()); } else if (minus_counter == 1) { architecture = std::string(begin_iterator.base(), end_iterator.base()); } else if (minus_counter == 2) { version = std::string(begin_iterator.base(), end_iterator.base()); } end_iterator = begin_iterator + 1; ++minus_counter; } } return database_package(std::string(fullname.cbegin(), end_iterator.base()), std::move(version), std::move(architecture), std::move(build_tag)); } database_package::database_package(std::string&& name, std::string&& version, std::string&& architecture, std::string&& build_tag) : name(name), version(version), architecture(version), build_tag(build_tag) { } database_package::database_package(const std::string& fullname) : database_package(create_database_package(fullname)) { } bool database_package::operator<(const database_package& that) const { return this->name < that.name; } bool database_package::operator>(const database_package& that) const { return this->name > that.name; } std::string database_package::to_string() const { std::string package_string; const std::size_t total_size = this->name.size() + this->version.size() + this->architecture.size() + this->build_tag.size() + 3; package_string.reserve(total_size); package_string.append(this->name); package_string.push_back('-'); package_string.append(this->version); package_string.push_back('-'); package_string.append(this->architecture); package_string.push_back('-'); package_string.append(this->build_tag); return package_string; } std::multimap read_installed_database() { std::multimap result; for (const auto& entry : std::filesystem::directory_iterator(katja::database)) { database_package database_entry{ entry.path().filename() }; result.emplace(database_entry.name, database_entry); } return result; } }