inc_complete/db/
serialize.rs1use std::sync::{
2 Arc,
3 atomic::{AtomicU32, Ordering},
4};
5
6use parking_lot::Mutex;
7use serde::{Deserialize, Serialize, ser::SerializeStruct};
8
9use crate::Cell;
10
11use super::Db;
12
13impl<Storage> serde::Serialize for Db<Storage>
14where
15 Storage: serde::Serialize,
16{
17 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
18 where
19 S: serde::Serializer,
20 {
21 let mut cells = Vec::with_capacity(self.cells.len());
22
23 for item in self.cells.iter() {
24 let value = item.value();
25
26 cells.push((
27 *item.key(),
28 CellDataDeserialize {
29 computation_id: value.computation_id,
30 last_updated_version: value.last_updated_version,
31 last_run_version: value.last_run_version,
32 last_verified_version: value.last_verified_version,
33 dependencies: value.dependencies.clone(),
34 },
35 ));
36 }
37
38 let version = self.version.load(Ordering::SeqCst);
39 let next_cell = self.next_cell.load(Ordering::SeqCst);
40
41 let mut s = serializer.serialize_struct("Db", 4)?;
42 s.serialize_field("version", &version)?;
43 s.serialize_field("next_cell", &next_cell)?;
44 s.serialize_field("cells", &cells)?;
45 s.serialize_field("storage", &self.storage)?;
46 s.end()
47 }
48}
49
50#[derive(Deserialize)]
51#[serde(rename = "Db")]
52struct DbDeserialize<Storage> {
53 version: u32,
54 next_cell: u32,
55 cells: Vec<(Cell, CellDataDeserialize)>,
56 storage: Storage,
57}
58
59#[derive(Serialize, Deserialize)]
60#[serde(rename = "CellData")]
61struct CellDataDeserialize {
62 computation_id: u32,
63 last_updated_version: u32,
64 #[serde(default)]
65 last_run_version: u32,
66 last_verified_version: u32,
67 dependencies: Vec<Cell>,
68}
69
70impl<'de, Storage> serde::Deserialize<'de> for Db<Storage>
71where
72 Storage: serde::Deserialize<'de>,
73{
74 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
75 where
76 D: serde::Deserializer<'de>,
77 {
78 let db = DbDeserialize::deserialize(deserializer)?;
79
80 let cells =
81 dashmap::DashMap::with_capacity_and_hasher(db.cells.len(), rustc_hash::FxBuildHasher);
82
83 for (cell, data) in db.cells {
84 cells.insert(
85 cell,
86 crate::cell::CellData {
87 computation_id: data.computation_id,
88 last_updated_version: data.last_updated_version,
89 last_run_version: data.last_run_version,
90 last_verified_version: data.last_verified_version,
91 dependency_set: data.dependencies.iter().copied().collect(),
92 dependencies: data.dependencies,
93 lock: Arc::new(Mutex::new(())),
94 },
95 );
96 }
97
98 Ok(Db {
99 cells,
100 version: AtomicU32::new(db.version),
101 next_cell: AtomicU32::new(db.next_cell),
102 cell_locks: Default::default(),
103 storage: db.storage,
104 })
105 }
106}