#pragma once
#include <mutex>
#include "storage/wal/wal_record.h"
namespace lbug {
namespace common {
class BufferedFileWriter;
class VirtualFileSystem;
}
namespace storage {
class LocalWAL;
class WAL {
public:
WAL(const std::string& dbPath, bool readOnly, bool enableChecksums,
common::VirtualFileSystem* vfs);
~WAL();
void logCommittedWAL(LocalWAL& localWAL, main::ClientContext* context);
void logAndFlushCheckpoint(main::ClientContext* context);
bool rotateForCheckpoint(main::ClientContext* context);
void logAndFlushCheckpointToFrozen(main::ClientContext* context);
void clearFrozenWAL();
void clear();
void reset();
uint64_t getFileSize();
static WAL* Get(const main::ClientContext& context);
private:
void initWriter(main::ClientContext* context);
void addNewWALRecordNoLock(const WALRecord& walRecord);
void flushAndSyncNoLock();
void writeHeader(main::ClientContext& context);
private:
std::mutex mtx;
std::string walPath;
std::string checkpointWalPath;
bool inMemory;
[[maybe_unused]] bool readOnly;
common::VirtualFileSystem* vfs;
std::unique_ptr<common::FileInfo> fileInfo;
std::unique_ptr<common::Serializer> serializer;
bool enableChecksums;
};
} }