Files
secondo/Algebras/Temporal2/DbUpdateLogger.cpp

89 lines
2.2 KiB
C++
Raw Normal View History

2026-01-23 17:03:45 +08:00
/*
implementation of DbUpdateLogger
*/
#include "DbUpdateLogger.h"
namespace temporal2algebra {
DbUpdateLogger::DbUpdateLogger(std::string database,
std::string smiLogFileName) :
database(database),
smiLogFileName(smiLogFileName){
smifile = new SmiRecordFile (true, sizeof(LogData));
}
DbUpdateLogger::~DbUpdateLogger() {
delete smifile;
}
void DbUpdateLogger::logCreateId(const MemStorageId id) {
LogData log(id, 0, LogOp_memCreateId);
writeLogRecord(log);
}
void DbUpdateLogger::logSetBackRef(const MemStorageId& id,
const BackReference& backRef,
const Unit& finalUnit) {
LogData log(id, 0, backRef, finalUnit, LogOp_memSetBackRef);
writeLogRecord(log);
}
void DbUpdateLogger::logAppend(const MemStorageId id, const Unit& unit) {
LogData log(id, 0, unit, LogOp_memAppend);
writeLogRecord(log);
}
void DbUpdateLogger::logClear (const MemStorageId id) {
LogData log(id, 0, LogOp_memClear);
writeLogRecord(log);
}
void DbUpdateLogger::logPushToFlobs(const MemStorageId id){
LogData log(id, 0, LogOp_pushToFlobs);
writeLogRecord(log);
}
void DbUpdateLogger::replayLog(MemStorageManager& manager) {
cout << "DbUpdateLogger::replayLog()\n";
smifile->Open(smiLogFileName);
SmiRecordFileIterator iterator;
smifile->SelectAll(iterator);
SmiRecord rec;
while (iterator.Next(rec)) {
LogData* myLog = new LogData;
rec.Read(myLog, sizeof(LogData));
cout << *myLog << endl;
manager.applyLog(*myLog);
delete myLog;
}
smifile->Close();
}
void DbUpdateLogger::truncateLog() {
cout << "DbUpdateLogger::truncateLog()\n";
bool res = smifile->Truncate();
cout << "res: " << res << endl;
}
void DbUpdateLogger::writeLogRecord(const LogData& val) {
smifile->Open(smiLogFileName);
SmiRecord record;
SmiRecordId rec_id;
smifile->AppendRecord(rec_id, record);
size_t offset = 0;
record.Write(&val,sizeof(LogData),offset);
offset += sizeof(LogData);
record.Finish();
// Is there a better way? Is closing a problem anyway?
smifile->Close();
}
} /* namespace temporal2algebra */