1use diesel::prelude::*;
6
7use crate::{
8 schema::{
9 optimistic_tx_calls_fun, optimistic_tx_calls_mod, optimistic_tx_calls_pkg,
10 optimistic_tx_changed_objects, optimistic_tx_input_objects, optimistic_tx_kinds,
11 optimistic_tx_recipients, optimistic_tx_senders, tx_calls_fun, tx_calls_mod, tx_calls_pkg,
12 tx_changed_objects, tx_digests, tx_input_objects, tx_kinds, tx_recipients, tx_senders,
13 },
14 types::TxIndex,
15};
16
17#[derive(QueryableByName)]
18pub struct TxSequenceNumber {
19 #[diesel(sql_type = diesel::sql_types::BigInt)]
20 pub tx_sequence_number: i64,
21}
22
23#[derive(QueryableByName)]
24pub struct TxDigest {
25 #[diesel(sql_type = diesel::sql_types::Binary)]
26 pub transaction_digest: Vec<u8>,
27}
28
29#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
30#[diesel(table_name = tx_senders)]
31pub struct StoredTxSenders {
32 pub tx_sequence_number: i64,
33 pub sender: Vec<u8>,
34}
35
36#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
37#[diesel(table_name = tx_recipients)]
38pub struct StoredTxRecipients {
39 pub tx_sequence_number: i64,
40 pub recipient: Vec<u8>,
41 pub sender: Vec<u8>,
42}
43
44#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
45#[diesel(table_name = tx_input_objects)]
46pub struct StoredTxInputObject {
47 pub tx_sequence_number: i64,
48 pub object_id: Vec<u8>,
49 pub sender: Vec<u8>,
50}
51
52#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
53#[diesel(table_name = tx_changed_objects)]
54pub struct StoredTxChangedObject {
55 pub tx_sequence_number: i64,
56 pub object_id: Vec<u8>,
57 pub sender: Vec<u8>,
58}
59
60#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
61#[diesel(table_name = tx_calls_pkg)]
62pub struct StoredTxPkg {
63 pub tx_sequence_number: i64,
64 pub package: Vec<u8>,
65 pub sender: Vec<u8>,
66}
67
68#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
69#[diesel(table_name = tx_calls_mod)]
70pub struct StoredTxMod {
71 pub tx_sequence_number: i64,
72 pub package: Vec<u8>,
73 pub module: String,
74 pub sender: Vec<u8>,
75}
76
77#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
78#[diesel(table_name = tx_calls_fun)]
79pub struct StoredTxFun {
80 pub tx_sequence_number: i64,
81 pub package: Vec<u8>,
82 pub module: String,
83 pub func: String,
84 pub sender: Vec<u8>,
85}
86
87#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
88#[diesel(table_name = tx_digests)]
89pub struct StoredTxDigest {
90 pub tx_digest: Vec<u8>,
91 pub tx_sequence_number: i64,
92}
93
94#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
95#[diesel(table_name = tx_kinds)]
96pub struct StoredTxKind {
97 pub tx_kind: i16,
98 pub tx_sequence_number: i64,
99}
100
101#[expect(clippy::type_complexity)]
102impl TxIndex {
103 pub fn split(
104 self: TxIndex,
105 ) -> (
106 Vec<StoredTxSenders>,
107 Vec<StoredTxRecipients>,
108 Vec<StoredTxInputObject>,
109 Vec<StoredTxChangedObject>,
110 Vec<StoredTxPkg>,
111 Vec<StoredTxMod>,
112 Vec<StoredTxFun>,
113 Vec<StoredTxDigest>,
114 Vec<StoredTxKind>,
115 ) {
116 let tx_sequence_number = self.tx_sequence_number as i64;
117 let tx_sender = StoredTxSenders {
118 tx_sequence_number,
119 sender: self.sender.to_vec(),
120 };
121 let tx_recipients = self
122 .recipients
123 .iter()
124 .map(|s| StoredTxRecipients {
125 tx_sequence_number,
126 recipient: s.to_vec(),
127 sender: self.sender.to_vec(),
128 })
129 .collect();
130 let tx_input_objects = self
131 .input_objects
132 .iter()
133 .map(|o| StoredTxInputObject {
134 tx_sequence_number,
135 object_id: bcs::to_bytes(&o).unwrap(),
136 sender: self.sender.to_vec(),
137 })
138 .collect();
139 let tx_changed_objects = self
140 .changed_objects
141 .iter()
142 .map(|o| StoredTxChangedObject {
143 tx_sequence_number,
144 object_id: bcs::to_bytes(&o).unwrap(),
145 sender: self.sender.to_vec(),
146 })
147 .collect();
148
149 let mut packages = Vec::new();
150 let mut packages_modules = Vec::new();
151 let mut packages_modules_funcs = Vec::new();
152
153 for (pkg, pkg_mod, pkg_mod_func) in self
154 .move_calls
155 .iter()
156 .map(|(p, m, f)| (*p, (*p, m.clone()), (*p, m.clone(), f.clone())))
157 {
158 packages.push(pkg);
159 packages_modules.push(pkg_mod);
160 packages_modules_funcs.push(pkg_mod_func);
161 }
162
163 let tx_pkgs = packages
164 .iter()
165 .map(|p| StoredTxPkg {
166 tx_sequence_number,
167 package: p.to_vec(),
168 sender: self.sender.to_vec(),
169 })
170 .collect();
171
172 let tx_mods = packages_modules
173 .iter()
174 .map(|(p, m)| StoredTxMod {
175 tx_sequence_number,
176 package: p.to_vec(),
177 module: m.to_string(),
178 sender: self.sender.to_vec(),
179 })
180 .collect();
181
182 let tx_calls = packages_modules_funcs
183 .iter()
184 .map(|(p, m, f)| StoredTxFun {
185 tx_sequence_number,
186 package: p.to_vec(),
187 module: m.to_string(),
188 func: f.to_string(),
189 sender: self.sender.to_vec(),
190 })
191 .collect();
192
193 let stored_tx_digest = StoredTxDigest {
194 tx_digest: self.transaction_digest.into_inner().to_vec(),
195 tx_sequence_number,
196 };
197
198 let tx_kind = StoredTxKind {
199 tx_kind: self.tx_kind as i16,
200 tx_sequence_number,
201 };
202
203 (
204 vec![tx_sender],
205 tx_recipients,
206 tx_input_objects,
207 tx_changed_objects,
208 tx_pkgs,
209 tx_mods,
210 tx_calls,
211 vec![stored_tx_digest],
212 vec![tx_kind],
213 )
214 }
215}
216
217#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
218#[diesel(table_name = optimistic_tx_senders)]
219pub struct OptimisticTxSenders {
220 pub tx_insertion_order: i64,
221 pub sender: Vec<u8>,
222}
223
224#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
225#[diesel(table_name = optimistic_tx_recipients)]
226pub struct OptimisticTxRecipients {
227 pub tx_insertion_order: i64,
228 pub recipient: Vec<u8>,
229 pub sender: Vec<u8>,
230}
231
232#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
233#[diesel(table_name = optimistic_tx_input_objects)]
234pub struct OptimisticTxInputObject {
235 pub tx_insertion_order: i64,
236 pub object_id: Vec<u8>,
237 pub sender: Vec<u8>,
238}
239
240#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
241#[diesel(table_name = optimistic_tx_changed_objects)]
242pub struct OptimisticTxChangedObject {
243 pub tx_insertion_order: i64,
244 pub object_id: Vec<u8>,
245 pub sender: Vec<u8>,
246}
247
248#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
249#[diesel(table_name = optimistic_tx_calls_pkg)]
250pub struct OptimisticTxPkg {
251 pub tx_insertion_order: i64,
252 pub package: Vec<u8>,
253 pub sender: Vec<u8>,
254}
255
256#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
257#[diesel(table_name = optimistic_tx_calls_mod)]
258pub struct OptimisticTxMod {
259 pub tx_insertion_order: i64,
260 pub package: Vec<u8>,
261 pub module: String,
262 pub sender: Vec<u8>,
263}
264
265#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
266#[diesel(table_name = optimistic_tx_calls_fun)]
267pub struct OptimisticTxFun {
268 pub tx_insertion_order: i64,
269 pub package: Vec<u8>,
270 pub module: String,
271 pub func: String,
272 pub sender: Vec<u8>,
273}
274
275#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
276#[diesel(table_name = optimistic_tx_kinds)]
277pub struct OptimisticTxKind {
278 pub tx_kind: i16,
279 pub tx_insertion_order: i64,
280}
281
282optimistic_from_into_checkpoint!(OptimisticTxSenders, StoredTxSenders, { sender });
283optimistic_from_into_checkpoint!(OptimisticTxRecipients, StoredTxRecipients, { recipient, sender });
284optimistic_from_into_checkpoint!(OptimisticTxInputObject, StoredTxInputObject, { object_id, sender });
285optimistic_from_into_checkpoint!(OptimisticTxChangedObject, StoredTxChangedObject, { object_id, sender });
286optimistic_from_into_checkpoint!(OptimisticTxPkg, StoredTxPkg, { package, sender });
287optimistic_from_into_checkpoint!(OptimisticTxMod, StoredTxMod, { package, module, sender });
288optimistic_from_into_checkpoint!(OptimisticTxFun, StoredTxFun, { package, module, func, sender });
289optimistic_from_into_checkpoint!(OptimisticTxKind, StoredTxKind, { tx_kind });
290
291pub struct OptimisticTxIndices {
292 pub optimistic_tx_senders: Vec<OptimisticTxSenders>,
293 pub optimistic_tx_recipients: Vec<OptimisticTxRecipients>,
294 pub optimistic_tx_input_objects: Vec<OptimisticTxInputObject>,
295 pub optimistic_tx_changed_objects: Vec<OptimisticTxChangedObject>,
296 pub optimistic_tx_pkgs: Vec<OptimisticTxPkg>,
297 pub optimistic_tx_mods: Vec<OptimisticTxMod>,
298 pub optimistic_tx_funs: Vec<OptimisticTxFun>,
299 pub optimistic_tx_kinds: Vec<OptimisticTxKind>,
300}