aboutsummaryrefslogtreecommitdiff
path: root/katja/database.cpp
blob: fb21d1ff7929b9f3db25c96f086605012ea83fd1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*
 * 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 <filesystem>

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(architecture), 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<std::string, database_package> read_installed_database()
    {
        std::multimap<std::string, database_package> 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;
    }
}