407 {
408 const char* sql = R"(
409 INSERT INTO audit_log (
410 event_type, outcome, user_id, source_ae, target_ae,
411 source_ip, patient_id, study_uid, message, details
412 ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
413 )";
414
415 sqlite3_stmt* stmt = nullptr;
416 auto rc = sqlite3_prepare_v2(
db_, sql, -1, &stmt,
nullptr);
417 if (rc != SQLITE_OK) {
418 return make_error<int64_t>(
419 rc,
420 kcenon::pacs::compat::format("Failed to prepare audit insert: {}",
421 sqlite3_errmsg(
db_)),
422 "storage");
423 }
424
425 sqlite3_bind_text(stmt, 1,
record.event_type.c_str(), -1, SQLITE_TRANSIENT);
426 sqlite3_bind_text(stmt, 2,
record.outcome.c_str(), -1, SQLITE_TRANSIENT);
427 sqlite3_bind_text(stmt, 3,
record.user_id.c_str(), -1, SQLITE_TRANSIENT);
428 sqlite3_bind_text(stmt, 4,
record.source_ae.c_str(), -1, SQLITE_TRANSIENT);
429 sqlite3_bind_text(stmt, 5,
record.target_ae.c_str(), -1, SQLITE_TRANSIENT);
430 sqlite3_bind_text(stmt, 6,
record.source_ip.c_str(), -1, SQLITE_TRANSIENT);
431 sqlite3_bind_text(stmt, 7,
record.patient_id.c_str(), -1, SQLITE_TRANSIENT);
432 sqlite3_bind_text(stmt, 8,
record.study_uid.c_str(), -1, SQLITE_TRANSIENT);
433 sqlite3_bind_text(stmt, 9,
record.message.c_str(), -1, SQLITE_TRANSIENT);
434 sqlite3_bind_text(stmt, 10,
record.details.c_str(), -1, SQLITE_TRANSIENT);
435
436 rc = sqlite3_step(stmt);
437 sqlite3_finalize(stmt);
438
439 if (rc != SQLITE_DONE) {
440 return make_error<int64_t>(
441 rc,
442 kcenon::pacs::compat::format("Failed to insert audit log: {}",
443 sqlite3_errmsg(
db_)),
444 "storage");
445 }
446
447 return sqlite3_last_insert_rowid(
db_);
448}
@ record
RECORD - Treatment record dose.