1use nodedb_types::error::{NodeDbError, NodeDbResult};
13
14use super::NodeDbLite;
15use crate::storage::engine::StorageEngine;
16
17#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
19pub struct LiteStoredFunction {
20 pub name: String,
21 pub parameters: Vec<LiteFunctionParam>,
22 pub return_type: String,
23 pub body_sql: String,
24 pub owner: String,
25 pub created_at: u64,
26}
27
28#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
29pub struct LiteFunctionParam {
30 pub name: String,
31 pub data_type: String,
32}
33
34#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
36pub struct LiteStoredTrigger {
37 pub name: String,
38 pub collection: String,
39 pub timing: String,
40 pub events: Vec<String>,
41 pub granularity: String,
42 pub when_condition: Option<String>,
43 pub body_sql: String,
44 pub priority: i32,
45 pub enabled: bool,
46 pub execution_mode: String,
47 pub owner: String,
48 pub created_at: u64,
49}
50
51#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
53pub struct LiteStoredProcedure {
54 pub name: String,
55 pub parameters: Vec<LiteProcedureParam>,
56 pub body_sql: String,
57 pub max_iterations: u64,
58 pub timeout_secs: u64,
59 pub owner: String,
60 pub created_at: u64,
61}
62
63#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
64pub struct LiteProcedureParam {
65 pub name: String,
66 pub data_type: String,
67 pub direction: String,
68}
69
70impl<S: StorageEngine> NodeDbLite<S> {
73 async fn put_definition(
75 &self,
76 prefix: &str,
77 name: &str,
78 def: &impl serde::Serialize,
79 ) -> NodeDbResult<()> {
80 let key = format!("{prefix}:{name}");
81 let bytes = sonic_rs::to_vec(def).map_err(|e| NodeDbError::storage(e.to_string()))?;
82 self.storage
83 .put(nodedb_types::Namespace::Meta, key.as_bytes(), &bytes)
84 .await?;
85 Ok(())
86 }
87
88 async fn get_definition<T: serde::de::DeserializeOwned>(
90 &self,
91 prefix: &str,
92 name: &str,
93 ) -> NodeDbResult<Option<T>> {
94 let key = format!("{prefix}:{name}");
95 let bytes = self
96 .storage
97 .get(nodedb_types::Namespace::Meta, key.as_bytes())
98 .await?;
99 match bytes {
100 Some(b) => {
101 let def: T =
102 sonic_rs::from_slice(&b).map_err(|e| NodeDbError::storage(e.to_string()))?;
103 Ok(Some(def))
104 }
105 None => Ok(None),
106 }
107 }
108
109 async fn list_definitions<T: serde::de::DeserializeOwned>(
111 &self,
112 prefix: &str,
113 ) -> NodeDbResult<Vec<T>> {
114 let scan_prefix = format!("{prefix}:");
115 let pairs = self
116 .storage
117 .scan_prefix(nodedb_types::Namespace::Meta, scan_prefix.as_bytes())
118 .await?;
119 let mut defs = Vec::with_capacity(pairs.len());
120 for (_key, value) in pairs {
121 if let Ok(d) = sonic_rs::from_slice::<T>(&value) {
122 defs.push(d);
123 }
124 }
125 Ok(defs)
126 }
127
128 async fn delete_definition(&self, prefix: &str, name: &str) -> NodeDbResult<()> {
130 let key = format!("{prefix}:{name}");
131 self.storage
132 .delete(nodedb_types::Namespace::Meta, key.as_bytes())
133 .await?;
134 Ok(())
135 }
136}
137
138impl<S: StorageEngine> NodeDbLite<S> {
141 pub async fn put_function(&self, func: &LiteStoredFunction) -> NodeDbResult<()> {
143 self.put_definition("function", &func.name, func).await
144 }
145
146 pub async fn get_function(&self, name: &str) -> NodeDbResult<Option<LiteStoredFunction>> {
148 self.get_definition("function", name).await
149 }
150
151 pub async fn list_functions(&self) -> NodeDbResult<Vec<LiteStoredFunction>> {
153 self.list_definitions("function").await
154 }
155
156 pub async fn delete_function(&self, name: &str) -> NodeDbResult<()> {
158 self.delete_definition("function", name).await
159 }
160
161 pub async fn put_trigger(&self, trigger: &LiteStoredTrigger) -> NodeDbResult<()> {
163 self.put_definition("trigger", &trigger.name, trigger).await
164 }
165
166 pub async fn get_trigger(&self, name: &str) -> NodeDbResult<Option<LiteStoredTrigger>> {
168 self.get_definition("trigger", name).await
169 }
170
171 pub async fn list_triggers(&self) -> NodeDbResult<Vec<LiteStoredTrigger>> {
173 self.list_definitions("trigger").await
174 }
175
176 pub async fn list_triggers_for_collection(
178 &self,
179 collection: &str,
180 ) -> NodeDbResult<Vec<LiteStoredTrigger>> {
181 let all = self.list_triggers().await?;
182 Ok(all
183 .into_iter()
184 .filter(|t| t.collection == collection)
185 .collect())
186 }
187
188 pub async fn delete_trigger(&self, name: &str) -> NodeDbResult<()> {
190 self.delete_definition("trigger", name).await
191 }
192
193 pub async fn put_procedure(&self, proc: &LiteStoredProcedure) -> NodeDbResult<()> {
195 self.put_definition("procedure", &proc.name, proc).await
196 }
197
198 pub async fn get_procedure(&self, name: &str) -> NodeDbResult<Option<LiteStoredProcedure>> {
200 self.get_definition("procedure", name).await
201 }
202
203 pub async fn list_procedures(&self) -> NodeDbResult<Vec<LiteStoredProcedure>> {
205 self.list_definitions("procedure").await
206 }
207
208 pub async fn delete_procedure(&self, name: &str) -> NodeDbResult<()> {
210 self.delete_definition("procedure", name).await
211 }
212}