89 lines
2.2 KiB
C++
89 lines
2.2 KiB
C++
/*
|
|
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 */
|