octra_sqlite/client/
safety.rs1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
3pub enum Operation {
4 Query,
5 Execute,
6 ExecuteNoWait,
7 AuthInfo,
8 ProgramInfo,
9}
10
11#[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}