sqlx_postgres/message/
ready_for_query.rs

1use sqlx_core::bytes::Bytes;
2
3use crate::error::Error;
4use crate::message::{BackendMessage, BackendMessageFormat};
5
6#[derive(Debug)]
7#[repr(u8)]
8pub enum TransactionStatus {
9    /// Not in a transaction block.
10    Idle = b'I',
11
12    /// In a transaction block.
13    Transaction = b'T',
14
15    /// In a _failed_ transaction block. Queries will be rejected until block is ended.
16    Error = b'E',
17}
18
19#[derive(Debug)]
20pub struct ReadyForQuery {
21    pub transaction_status: TransactionStatus,
22}
23
24impl BackendMessage for ReadyForQuery {
25    const FORMAT: BackendMessageFormat = BackendMessageFormat::ReadyForQuery;
26
27    fn decode_body(buf: Bytes) -> Result<Self, Error> {
28        let status = match buf[0] {
29            b'I' => TransactionStatus::Idle,
30            b'T' => TransactionStatus::Transaction,
31            b'E' => TransactionStatus::Error,
32
33            status => {
34                return Err(err_protocol!(
35                    "unknown transaction status: {:?}",
36                    status as char
37                ));
38            }
39        };
40
41        Ok(Self {
42            transaction_status: status,
43        })
44    }
45}
46
47#[test]
48fn test_decode_ready_for_query() -> Result<(), Error> {
49    const DATA: &[u8] = b"E";
50
51    let m = ReadyForQuery::decode_body(Bytes::from_static(DATA))?;
52
53    assert!(matches!(m.transaction_status, TransactionStatus::Error));
54
55    Ok(())
56}