#pragma once
#include <mutex>
#include "transaction.h"
namespace lbug {
namespace main {
class ClientContext;
}
namespace transaction {
enum class TransactionMode : uint8_t { AUTO = 0, MANUAL = 1 };
class LBUG_API TransactionContext {
public:
explicit TransactionContext(main::ClientContext& clientContext);
~TransactionContext();
bool isAutoTransaction() const { return mode == TransactionMode::AUTO; }
void beginReadTransaction();
void beginWriteTransaction();
void beginAutoTransaction(bool readOnlyStatement);
void beginRecoveryTransaction();
void validateManualTransaction(bool readOnlyStatement) const;
void commit();
void rollback();
TransactionMode getTransactionMode() const { return mode; }
bool hasActiveTransaction() const { return activeTransaction != nullptr; }
Transaction* getActiveTransaction() const { return activeTransaction; }
void clearTransaction();
static TransactionContext* Get(const main::ClientContext& context);
private:
void beginTransactionInternal(TransactionType transactionType);
private:
std::mutex mtx;
main::ClientContext& clientContext;
TransactionMode mode;
Transaction* activeTransaction;
};
} }