Skip to main content

octra_sqlite/client/
safety.rs

1/// Public database operation kind.
2#[derive(Debug, Clone, Copy, PartialEq, Eq)]
3pub enum Operation {
4    Query,
5    Execute,
6    ExecuteNoWait,
7    AuthInfo,
8    ProgramInfo,
9}
10
11/// Safety metadata for a database operation.
12#[derive(Debug, Clone, Copy, PartialEq, Eq)]
13pub struct OperationSafety {
14    pub operation: Operation,
15    pub reads_sql: bool,
16    pub mutates_state: bool,
17    pub submits_transaction: bool,
18    pub waits_for_receipt: bool,
19    pub requires_signed_rpc: bool,
20    pub requires_owner_write_intent: bool,
21}
22
23impl Operation {
24    pub fn safety(self) -> OperationSafety {
25        match self {
26            Operation::Query => OperationSafety {
27                operation: self,
28                reads_sql: true,
29                mutates_state: false,
30                submits_transaction: false,
31                waits_for_receipt: false,
32                requires_signed_rpc: true,
33                requires_owner_write_intent: false,
34            },
35            Operation::Execute => OperationSafety {
36                operation: self,
37                reads_sql: true,
38                mutates_state: true,
39                submits_transaction: true,
40                waits_for_receipt: true,
41                requires_signed_rpc: true,
42                requires_owner_write_intent: true,
43            },
44            Operation::ExecuteNoWait => OperationSafety {
45                operation: self,
46                reads_sql: true,
47                mutates_state: true,
48                submits_transaction: true,
49                waits_for_receipt: false,
50                requires_signed_rpc: true,
51                requires_owner_write_intent: true,
52            },
53            Operation::AuthInfo | Operation::ProgramInfo => OperationSafety {
54                operation: self,
55                reads_sql: false,
56                mutates_state: false,
57                submits_transaction: false,
58                waits_for_receipt: false,
59                requires_signed_rpc: true,
60                requires_owner_write_intent: false,
61            },
62        }
63    }
64}
65
66#[cfg(test)]
67mod tests {
68    use super::*;
69
70    #[test]
71    fn operation_method_marks_execute_as_mutating_transaction() {
72        let safety = Operation::Execute.safety();
73        assert!(safety.mutates_state);
74        assert!(safety.submits_transaction);
75        assert!(safety.waits_for_receipt);
76        assert!(safety.requires_owner_write_intent);
77    }
78
79    #[test]
80    fn operation_method_marks_no_wait_without_receipt_wait() {
81        let safety = Operation::ExecuteNoWait.safety();
82        assert!(safety.mutates_state);
83        assert!(safety.submits_transaction);
84        assert!(!safety.waits_for_receipt);
85        assert!(safety.requires_owner_write_intent);
86    }
87}