Skip to content

Commit

Permalink
.
Browse files Browse the repository at this point in the history
lalinsky committed Mar 3, 2024
1 parent 36afa6f commit 240203d
Showing 2 changed files with 80 additions and 2 deletions.
52 changes: 51 additions & 1 deletion src/fpindex/oplog.cpp
Original file line number Diff line number Diff line change
@@ -27,4 +27,54 @@ bool Oplog::Open() {
return false;
}
return true;
}
}

bool Oplog::Write(const OplogEntries &entries) {
std::lock_guard<std::mutex> lock(mutex_);

sqlite3_stmt *stmt = nullptr;
int rc = sqlite3_prepare_v2(db_.get(), "INSERT INTO oplog (op_id, op_data) VALUES (?, ?)", -1, &stmt, nullptr);
if (rc != SQLITE_OK) {
LOG_ERROR() << "failed to prepare statement: " << sqlite3_errstr(rc);
return false;
}
auto finalize_stmt = MakeCleanup([stmt]() { sqlite3_finalize(stmt); });

char *err_msg = nullptr;
rc = sqlite3_exec(db_.get(), "BEGIN TRANSACTION", nullptr, nullptr, &err_msg);
if (rc != SQLITE_OK) {
LOG_ERROR() << "failed to begin transaction: " << err_msg;
sqlite3_free(err_msg);
return false;
}

bool rollback = false;
std::string op_data;
for (const auto &entry : entries.entries()) {
if (!entry.SerializeToString(&op_data)) {
LOG_ERROR() << "failed to serialize oplog entry";
rollback = true;
break;
}
sqlite3_reset(stmt);
sqlite3_clear_bindings(stmt);
sqlite3_bind_int(stmt, 1, entry.op_id());
sqlite3_bind_blob(stmt, 2, op_data.data(), op_data.size(), SQLITE_STATIC);
rc = sqlite3_step(stmt);
if (rc != SQLITE_DONE) {
LOG_ERROR() << "failed to insert oplog entry: " << sqlite3_errstr(rc);
rollback = true;
break
}
}

const char *end_txn_sql = rollback ? "ROLLBACK TRANSACTION" : "COMMIT TRANSACTION";
rc = sqlite3_exec(db_.get(), end_txn_sql, nullptr, nullptr, &err_msg);
if (rc != SQLITE_OK) {
LOG_ERROR() << "failed to " << (rollback ? "rollback" : "commit") << " transaction: " << err_msg;
sqlite3_free(err_msg);
return false;
}

return true;
};
30 changes: 29 additions & 1 deletion src/fpindex/proto/internal.proto
Original file line number Diff line number Diff line change
@@ -20,4 +20,32 @@ message SegmentInfo {

message IndexInfo {
repeated SegmentInfo segments = 1;
}
map<string, string> attributes = 2;
}

message InsertOrUpdateFingerprintRequest {
uint32 id = 1;
repeated uint32 hashes = 2;
}

message DeleteFingerprintRequest {
uint32 id = 1;
}

message SetAttributeRequest {
string key = 1;
string value = 2;
}

message OplogEntry {
uint64 op_id = 1;
oneof op {
InsertOrUpdateFingerprintRequest insert_or_update = 2;
DeleteFingerprintRequest delete = 3;
SetAttributeRequest set_attribute = 4;
}
}

message OplogEntries {
repeated OplogEntry entries = 1;
}

0 comments on commit 240203d

Please sign in to comment.