~aleteoryx/muditaos

137622902f94c96146504f241a2f825f55c04e7c — Lefucjusz 3 years ago 51184eb
[MOS-766] Change factory entries initialization routine

Changed of the algorithm used to initialize
settings database with values read from EEPROM,
previously first insertion failure resulted
in stopping the whole process, now next values
are inserted even if previous has failed.
Additionally minor cleanup.
M module-db/Database/Field.cpp => module-db/Database/Field.cpp +25 -20
@@ 1,4 1,4 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "Field.hpp"


@@ 10,6 10,11 @@ const char *Field::getCString() const
    return mValue.c_str();
}

const std::string &Field::getString() const
{
    return mValue;
}

template <class T>
static T lget(T &val, const std::string &mValue, std::function<T()> foo)
{


@@ 44,47 49,47 @@ double Field::getDouble() const
    return lget<double>(ret, mValue, [=]() -> double { return std::stod(mValue); });
}

int8_t Field::getInt8() const
std::int8_t Field::getInt8() const
{
    return !mValue.empty() ? static_cast<int8_t>(atol(mValue.c_str())) : int8_t(0);
    return !mValue.empty() ? static_cast<std::int8_t>(atol(mValue.c_str())) : static_cast<std::int8_t>(0);
}

int32_t Field::getInt32() const
std::int32_t Field::getInt32() const
{
    return !mValue.empty() ? static_cast<int32_t>(atol(mValue.c_str())) : int32_t(0);
    return !mValue.empty() ? static_cast<std::int32_t>(atol(mValue.c_str())) : static_cast<std::int32_t>(0);
}

uint8_t Field::getUInt8() const
std::uint8_t Field::getUInt8() const
{
    return !mValue.empty() ? static_cast<uint8_t>(atol(mValue.c_str())) : uint8_t(0);
    return !mValue.empty() ? static_cast<std::uint8_t>(atol(mValue.c_str())) : static_cast<std::uint8_t>(0);
}

uint16_t Field::getUInt16() const
std::uint16_t Field::getUInt16() const
{
    return !mValue.empty() ? static_cast<uint16_t>(atol(mValue.c_str())) : uint16_t(0);
    return !mValue.empty() ? static_cast<std::uint16_t>(atol(mValue.c_str())) : static_cast<std::uint16_t>(0);
}

int16_t Field::getInt16() const
std::int16_t Field::getInt16() const
{
    return !mValue.empty() ? static_cast<int16_t>(atol(mValue.c_str())) : int16_t(0);
    return !mValue.empty() ? static_cast<std::int16_t>(atol(mValue.c_str())) : static_cast<std::int16_t>(0);
}

uint32_t Field::getUInt32() const
std::uint32_t Field::getUInt32() const
{
    uint32_t ret;
    return lget<uint32_t>(ret, mValue, [=]() -> unsigned long { return std::stoul(mValue); });
    std::uint32_t ret;
    return lget<std::uint32_t>(ret, mValue, [=]() -> unsigned long { return std::stoul(mValue); });
}

uint64_t Field::getUInt64() const
std::uint64_t Field::getUInt64() const
{
    uint64_t ret;
    return lget<uint64_t>(ret, mValue, [=]() -> unsigned long long { return std::stoull(mValue); });
    std::uint64_t ret;
    return lget<std::uint64_t>(ret, mValue, [=]() -> unsigned long long { return std::stoull(mValue); });
}

int64_t Field::getInt64() const
std::int64_t Field::getInt64() const
{
    int64_t ret;
    return lget<int64_t>(ret, mValue, [=]() -> long long { return std::stoll(mValue); });
    std::int64_t ret;
    return lget<std::int64_t>(ret, mValue, [=]() -> long long { return std::stoll(mValue); });
}

void Field::setValue(const char *value)

M module-db/Database/Field.hpp => module-db/Database/Field.hpp +11 -17
@@ 1,4 1,4 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once


@@ 14,33 14,27 @@ class Field

    Field(const char *value)
    {
        if (value) {
        if (value != nullptr) {
            mValue = value;
        }
    }
    // Field(Field const&);

    // Field& operator=(Field const&);

    ~Field()
    {}

    const char *getCString() const;
    std::string getString() const
    {
        return mValue;
    }
    const std::string &getString() const;
    float getFloat() const;
    bool getBool() const;
    double getDouble() const;
    int8_t getInt8() const;
    int32_t getInt32() const;
    uint8_t getUInt8() const;
    uint16_t getUInt16() const;
    int16_t getInt16() const;
    uint32_t getUInt32() const;
    uint64_t getUInt64() const;
    int64_t getInt64() const;
    std::int8_t getInt8() const;
    std::int32_t getInt32() const;
    std::uint8_t getUInt8() const;
    std::uint16_t getUInt16() const;
    std::int16_t getInt16() const;
    std::uint32_t getUInt32() const;
    std::uint64_t getUInt64() const;
    std::int64_t getInt64() const;
    void setValue(const char *value);

  private:

M module-db/Database/sqlite3vfs.cpp => module-db/Database/sqlite3vfs.cpp +0 -2
@@ 113,9 113,7 @@
#include <assert.h>
#include <string.h>
#include <sys/types.h>
#include <sys/param.h>
#include <unistd.h>
#include <time.h>
#include <errno.h>
#include <memory>
#include <cstring>

M module-services/service-db/agents/settings/FactorySettings.cpp => module-services/service-db/agents/settings/FactorySettings.cpp +24 -23
@@ 11,8 11,8 @@ namespace settings

    std::unique_ptr<QueryResult> FactorySettings::getMfgEntries()
    {
        auto factoryContent                      = readMfgSettings(filePath);
        std::unique_ptr<QueryResult> factoryData = std::make_unique<QueryResult>();
        auto factoryData          = std::make_unique<QueryResult>();
        const auto factoryContent = readMfgSettings(filePath);

        for (const auto &[path, value] : factoryContent.object_items()) {
            factoryData->addRow({Field(path.c_str()), Field(value.string_value().c_str())});


@@ 23,32 23,33 @@ namespace settings

    void FactorySettings::initDb(Database *database)
    {
        auto factoryData = getMfgEntries();
        if (factoryData->getRowCount()) {
            do {

                settings::EntryPath variablePath{"",
                                                 "",
                                                 "",
                                                 settings::factory::entry_key + std::string("/") +
                                                     (*factoryData)[0].getString(),
                                                 settings::SettingsScope::Global};
                auto value = (*factoryData)[1].getString();

                if (!database->execute(
                        settings::Statements::insertValue, variablePath.to_string().c_str(), value.c_str())) {
                    break;
                }

                LOG_INFO("Put factory entry: %s=%s", variablePath.to_string().c_str(), value.c_str());

            } while (factoryData->nextRow());
        const auto factoryData = getMfgEntries();

        if (factoryData->getRowCount() <= 0) {
            LOG_FATAL("No EEPROM factory data available!");
            return;
        }

        do {
            const auto key        = (*factoryData)[0].getString();
            const auto value      = (*factoryData)[1].getCString();
            const auto path       = settings::factory::entry_key + std::string("/") + key;
            const auto pathString = settings::EntryPath{"", "", "", path, settings::SettingsScope::Global}.to_string();

            if (!database->execute(settings::Statements::insertValue, pathString.c_str(), value)) {
                LOG_ERROR("Failed to set entry '%s' = '%s'!", pathString.c_str(), value);
            }
            else {
                LOG_INFO("Set entry '%s' = '%s'", pathString.c_str(), value);
            }

        } while (factoryData->nextRow());
    }

    json11::Json FactorySettings::readMfgSettings(const std::string &path)
    {
        std::ifstream file(path.c_str());
        std::string content((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
        const std::string content((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());

        std::string parserError;
        auto factoryObj = json11::Json::parse(content, parserError);