Skip to content

src/account/IMigrationStep.hpp

Versioned migration manager and migration step interface. More...

Namespaces

Name
sgns

Classes

Name
class sgns::IMigrationStep
Interface for a migration step between two schema versions.

Detailed Description

Versioned migration manager and migration step interface.

Date: 2025-05-29 Luiz Guilherme Rizzatto Zucchi Henrique A. Klein ([email protected])

Source code

#pragma once

#include <string>
#include <tuple>
#include <sstream>
#include "outcome/outcome.hpp"

namespace sgns
{
    class IMigrationStep
    {
    public:
        virtual ~IMigrationStep() = default;

        virtual std::string FromVersion() const = 0;

        virtual std::string ToVersion() const = 0;

        virtual outcome::result<void> Init() = 0;
        virtual outcome::result<void> Apply() = 0;

        virtual outcome::result<void> ShutDown() = 0;

        virtual outcome::result<bool> IsRequired() const = 0;

        std::tuple<int, int, int> ParseVersion( const std::string &version ) const
        {
            int                major = 0, minor = 0, patch = 0;
            char               dot;
            std::istringstream iss( version );
            iss >> major >> dot >> minor >> dot >> patch;
            return { major, minor, patch };
        }

        bool IsVersionLessThan( const std::string &lhs, const std::string &rhs ) const
        {
            auto [lhs_major, lhs_minor, lhs_patch] = ParseVersion( lhs );
            auto [rhs_major, rhs_minor, rhs_patch] = ParseVersion( rhs );
            if ( lhs_major != rhs_major )
            {
                return lhs_major < rhs_major;
            }
            if ( lhs_minor != rhs_minor )
            {
                return lhs_minor < rhs_minor;
            }
            return lhs_patch < rhs_patch;
        }
    };
} // namespace sgns

Updated on 2026-03-04 at 13:10:44 -0800