~aleteoryx/muditaos

e09d1f4d34c6a291027bc086d965a08ade351472 — Alek Rudnik 4 years ago b482851
[EGD-6836] Unified Table class methods

Added retQueryUnpack method to db Table class.
M module-db/Tables/AlarmEventsTable.cpp => module-db/Tables/AlarmEventsTable.cpp +4 -18
@@ 1,12 1,10 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "AlarmEventsTable.hpp"

#include <Interface/AlarmEventRecord.hpp>

std::vector<AlarmEventsTableRow> retQueryUnpack(std::unique_ptr<QueryResult> retQuery);

AlarmEventsTableRow::AlarmEventsTableRow(uint32_t id,
                                         const UTF8 &name,
                                         TimePoint startDate,


@@ 51,7 49,9 @@ auto AlarmEventsTableRow::isValid() const -> bool
}

AlarmEventsTable::AlarmEventsTable(Database *db) : Table(db)
{}
{
    createTableRow = [](const QueryResult &retQuery) { return AlarmEventsTableRow(retQuery); };
}

bool AlarmEventsTable::create()
{


@@ 284,17 284,3 @@ std::string AlarmEventsTable::getFieldName(AlarmEventsTableFields field)
        return "";
    }
}

std::vector<AlarmEventsTableRow> retQueryUnpack(std::unique_ptr<QueryResult> retQuery)
{
    if ((retQuery == nullptr) || (retQuery->getRowCount() == 0)) {
        return {};
    }

    std::vector<AlarmEventsTableRow> outVector;

    do {
        outVector.push_back(AlarmEventsTableRow(*retQuery));
    } while (retQuery->nextRow());
    return outVector;
}

M module-db/Tables/MultimediaFilesTable.cpp => module-db/Tables/MultimediaFilesTable.cpp +30 -38
@@ 7,46 7,33 @@
#include <Utils.hpp>
#include <magic_enum.hpp>

MultimediaFilesTableRow CreateMultimediaFilesTableRow(const QueryResult &result)
{
    if (result.getFieldCount() != magic_enum::enum_count<MultimediaFilesTableFields>() + 1) {
        return MultimediaFilesTableRow{};
    }

    return MultimediaFilesTableRow{
        result[0].getUInt32(),    // ID
        result[1].getString(),    // path
        result[2].getString(),    // mediaType
        result[3].getUInt32(),    // size
        {result[4].getString(),   // title
         result[5].getString(),   // artist
         result[6].getString(),   // album
         result[7].getString(),   // comment
         result[8].getString(),   // genre
         result[9].getUInt32(),   // year
         result[10].getUInt32()}, // track
        {result[11].getUInt32(),  // songLength
         result[12].getUInt32(),  // bitrate
         result[13].getUInt32(),  // sample rate
         result[14].getUInt32()}, // channels
    };
}

namespace
{
    std::vector<MultimediaFilesTableRow> retQueryUnpack(std::unique_ptr<QueryResult> retQuery)
    MultimediaFilesTableRow CreateMultimediaFilesTableRow(const QueryResult &result)
    {
        if ((retQuery == nullptr) || (retQuery->getRowCount() == 0)) {
            return {};
        if (result.getFieldCount() != magic_enum::enum_count<MultimediaFilesTableFields>() + 1) {
            return MultimediaFilesTableRow{};
        }

        std::vector<MultimediaFilesTableRow> outVector;

        do {
            outVector.push_back(CreateMultimediaFilesTableRow(*retQuery));
        } while (retQuery->nextRow());
        return outVector;
        return MultimediaFilesTableRow{
            result[0].getUInt32(),    // ID
            result[1].getString(),    // path
            result[2].getString(),    // mediaType
            result[3].getUInt32(),    // size
            {result[4].getString(),   // title
             result[5].getString(),   // artist
             result[6].getString(),   // album
             result[7].getString(),   // comment
             result[8].getString(),   // genre
             result[9].getUInt32(),   // year
             result[10].getUInt32()}, // track
            {result[11].getUInt32(),  // songLength
             result[12].getUInt32(),  // bitrate
             result[13].getUInt32(),  // sample rate
             result[14].getUInt32()}, // channels
        };
    }

} // namespace

auto MultimediaFilesTableRow::isValid() const -> bool


@@ 55,7 42,9 @@ auto MultimediaFilesTableRow::isValid() const -> bool
}

MultimediaFilesTable::MultimediaFilesTable(Database *db) : Table(db)
{}
{
    createTableRow = CreateMultimediaFilesTableRow;
}

bool MultimediaFilesTable::create()
{


@@ 139,7 128,7 @@ MultimediaFilesTableRow MultimediaFilesTable::getById(uint32_t id)

std::vector<MultimediaFilesTableRow> MultimediaFilesTable::getLimitOffset(uint32_t offset, uint32_t limit)
{
    auto retQuery = db->query("SELECT * from files LIMIT %lu OFFSET %lu;", limit, offset);
    auto retQuery = db->query("SELECT * from files ORDER BY title ASC LIMIT %lu OFFSET %lu;", limit, offset);

    return retQueryUnpack(std::move(retQuery));
}


@@ 156,8 145,11 @@ std::vector<MultimediaFilesTableRow> MultimediaFilesTable::getLimitOffsetByField
        return {};
    }

    retQuery =
        db->query("SELECT * FROM files WHERE %q = '%q' LIMIT %lu OFFSET %lu;", fieldName.c_str(), str, limit, offset);
    retQuery = db->query("SELECT * FROM files WHERE %q = '%q' ORDER BY title ASC LIMIT %lu OFFSET %lu;",
                         fieldName.c_str(),
                         str,
                         limit,
                         offset);

    return retQueryUnpack(std::move(retQuery));
}

M module-db/Tables/Table.hpp => module-db/Tables/Table.hpp +23 -6
@@ 1,17 1,19 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

#include <Database/Database.hpp>

#include <functional>
#include <stdint.h>
#include <vector>
#include "Database/Database.hpp"

template <typename T, typename F> class Table
{

  protected:
    Table(Database *db) : db(db)
    explicit Table(Database *db) : db(db)
    {}

    virtual ~Table()


@@ 24,9 26,9 @@ template <typename T, typename F> class Table
        return false;
    }
    virtual bool removeById(uint32_t id) = 0;
    virtual bool removeByField(F field, const char *str)
    virtual bool removeByField([[maybe_unused]] F field, [[maybe_unused]] const char *str)
    {
        return true;
        return false;
    }
    virtual bool update(T entry)                                                                            = 0;
    virtual T getById(uint32_t id)                                                                          = 0;


@@ 40,5 42,20 @@ template <typename T, typename F> class Table
        return db->getLastInsertRowId();
    }

    Database *db;
    virtual std::vector<T> retQueryUnpack(std::unique_ptr<QueryResult> retQuery) const
    {
        if ((retQuery == nullptr) || (retQuery->getRowCount() == 0) || (createTableRow == nullptr)) {
            return {};
        }

        std::vector<T> outVector;

        do {
            outVector.push_back(createTableRow(*retQuery));
        } while (retQuery->nextRow());
        return outVector;
    }

    Database *db                                               = nullptr;
    std::function<T(const QueryResult &result)> createTableRow = nullptr;
};