Skip to content

src/crdt/atomic_transaction.hpp

Namespaces

Name
sgns
sgns::crdt

Classes

Name
class sgns::crdt::AtomicTransaction
AtomicTransaction provides atomic multi-key operations for CRDT datastore All operations within a transaction are combined into a single delta and published atomically to ensure consistency.

Source code

#ifndef SUPERGENIUS_ATOMIC_TRANSACTION_HPP
#define SUPERGENIUS_ATOMIC_TRANSACTION_HPP

#include "base/buffer.hpp"
#include "crdt/hierarchical_key.hpp"
#include "crdt/proto/delta.pb.h"
#include "outcome/outcome.hpp"
#include "primitives/cid/cid.hpp"
#include <memory>
#include <vector>
#include <optional>
#include <unordered_set>

namespace sgns::crdt
{
    class CrdtDatastore;
    class AtomicTransaction;

    class AtomicTransaction
    {
    public:
        using Buffer = base::Buffer;
        using Delta  = pb::Delta;

        explicit AtomicTransaction( std::shared_ptr<CrdtDatastore> datastore );

        ~AtomicTransaction();

        outcome::result<void> Put( HierarchicalKey key, Buffer value );

        outcome::result<void> Remove( const HierarchicalKey &key );

        outcome::result<Buffer> Get( const HierarchicalKey &key ) const;

        outcome::result<void> Erase( const HierarchicalKey &key );

        bool HasKey( const HierarchicalKey &key ) const;

        outcome::result<CID> Commit( const std::unordered_set<std::string> &topics );

    private:
        enum class Operation
        {
            PUT,
            REMOVE
        };

        struct PendingOperation
        {
            Operation       type;
            HierarchicalKey key;
            Buffer          value;
        };

        void Rollback();

        std::optional<PendingOperation> FindLatestOperation( const HierarchicalKey &key ) const;

        std::shared_ptr<CrdtDatastore>  datastore_;
        std::vector<PendingOperation>   operations_;
        std::unordered_set<std::string> modified_keys_; // Track which keys have been modified
        bool                            is_committed_;
    };

} // namespace sgns::crdt

#endif // SUPERGENIUS_ATOMIC_TRANSACTION_HPP

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