///|
/// A response to the original COMMIT is different from a later idle ROLLBACK.
fn v3_confirmed_commit_rollback(
event : Map[String, Json],
tx : V3CaptureTx,
) -> Bool raise {
let proof = match event.get("commitResponse") {
None => return false
Some(value) => object_fields(value, "rollback_ok.commitResponse")
}
let request = v3_capture_seq(
required(proof, "request", "commitResponse"),
"commitResponse.request",
)
if !tx.commit_requested || tx.commit_request_seq != Some(request) {
fail(
"A COMMIT response must reference this transaction's pending COMMIT request",
)
}
if proof.contains("commandTag") {
known_fields(proof, ["request", "commandTag"], "commitResponse")
if required(proof, "commandTag", "commitResponse") != "ROLLBACK".to_json() {
fail("The acknowledged COMMIT must have returned commandTag ROLLBACK")
}
} else {
known_fields(
proof,
["request", "sqlstate", "diagnosticSqlstate", "transactionStatus"],
"commitResponse",
)
let state = identifier(
required(proof, "sqlstate", "commitResponse"),
"commitResponse.sqlstate",
)
if !["40001", "40P01"].contains(state) ||
required(proof, "diagnosticSqlstate", "commitResponse") != state.to_json() ||
required(proof, "transactionStatus", "commitResponse") != "IDLE".to_json() {
fail(
"COMMIT error proof requires matching server diagnostics and confirmed IDLE state",
)
}
}
true
}