Skip to main content

agent_first_psql/
protocol.rs

1pub mod error_code {
2    pub const CANCELLED: &str = "cancelled";
3    pub const CONNECT_FAILED: &str = "connect_failed";
4    pub const INTERNAL_ERROR: &str = "internal_error";
5    pub const INVALID_PARAMS: &str = "invalid_params";
6    pub const INVALID_REQUEST: &str = "invalid_request";
7}
8
9pub mod log_event {
10    pub const CONNECT_LIBPQ_ENV_FALLBACK: &str = "connect.libpq_env_fallback";
11    pub const MODE_PERMISSION_DEFAULT_CHANGED: &str = "mode.permission_default_changed";
12    pub const QUERY_ERROR: &str = "query.error";
13    pub const QUERY_ROW_ENCODING_DEGRADED: &str = "query.row_encoding_degraded";
14    pub const QUERY_RESULT: &str = "query.result";
15    pub const QUERY_SQL_ERROR: &str = "query.sql_error";
16    pub const STARTUP: &str = "startup";
17    pub const TRANSPORT_SELECTED: &str = "transport.selected";
18}
19
20pub mod command_tag {
21    pub const EXECUTE: &str = "EXECUTE";
22    pub const SELECT: &str = "SELECT";
23    pub const BEGIN: &str = "BEGIN";
24    pub const COMMIT: &str = "COMMIT";
25    pub const ROLLBACK: &str = "ROLLBACK";
26
27    pub fn execute(affected: usize) -> String {
28        format!("EXECUTE {affected}")
29    }
30
31    pub fn rows(row_count: usize) -> String {
32        format!("ROWS {row_count}")
33    }
34}
35
36pub fn sqlstate_retryable(sqlstate: &str) -> bool {
37    matches!(sqlstate, "40001" | "40P01" | "57014")
38}
39
40#[cfg(test)]
41mod tests {
42    use super::sqlstate_retryable;
43
44    #[test]
45    fn retryable_sqlstates_cover_serialization_deadlock_and_cancel() {
46        for sqlstate in ["40001", "40P01", "57014"] {
47            assert!(sqlstate_retryable(sqlstate), "{sqlstate}");
48        }
49        for sqlstate in ["23505", "42501", "42601"] {
50            assert!(!sqlstate_retryable(sqlstate), "{sqlstate}");
51        }
52    }
53}
54
55// Log-filter matching lives in afdata's `LogFilters::enabled`; afpsql threads
56// the `LogFilters` type through its config instead of keeping a second matcher.