gluesql_file_storage/
store_mut.rs1use {
2 crate::{FileRow, FileStorage, ResultExt},
3 async_trait::async_trait,
4 gluesql_core::{
5 data::{Key, Schema},
6 error::Result,
7 store::{DataRow, StoreMut},
8 },
9 ron::ser::{to_string_pretty, PrettyConfig},
10 std::{
11 fs::{self, File},
12 io::Write,
13 },
14 uuid::Uuid,
15};
16
17#[async_trait(?Send)]
18impl StoreMut for FileStorage {
19 async fn insert_schema(&mut self, schema: &Schema) -> Result<()> {
20 let table_name = schema.table_name.clone();
21 let schema = schema.to_ddl();
22 let path = self.path(table_name);
23 if !path.exists() {
24 fs::create_dir(&path).map_storage_err()?;
25 }
26
27 let path = path.with_extension("sql");
28 if path.exists() {
29 fs::remove_file(&path).map_storage_err()?;
30 }
31
32 let mut file = File::create(path).map_storage_err()?;
33 file.write_all(schema.as_bytes()).map_storage_err()?;
34
35 Ok(())
36 }
37
38 async fn delete_schema(&mut self, table_name: &str) -> Result<()> {
39 let path = self.path(table_name);
40 if !path.exists() {
41 return Ok(());
42 }
43
44 fs::remove_dir_all(&path).map_storage_err()?;
45
46 let path = path.with_extension("sql");
47 fs::remove_file(path).map_storage_err()?;
48
49 Ok(())
50 }
51
52 async fn append_data(&mut self, table_name: &str, rows: Vec<DataRow>) -> Result<()> {
53 for row in rows {
54 let key = Key::Uuid(Uuid::now_v7().as_u128());
55 let path = self.data_path(table_name, &key)?;
56 let row = FileRow { key, row };
57 let row = to_string_pretty(&row, PrettyConfig::default()).map_storage_err()?;
58
59 let mut file = File::create(path).map_storage_err()?;
60 file.write_all(row.as_bytes()).map_storage_err()?;
61 }
62
63 Ok(())
64 }
65
66 async fn insert_data(&mut self, table_name: &str, rows: Vec<(Key, DataRow)>) -> Result<()> {
67 for (key, row) in rows {
68 let path = self.data_path(table_name, &key)?;
69 let row = FileRow { key, row };
70 let row = to_string_pretty(&row, PrettyConfig::default()).map_storage_err()?;
71
72 let mut file = File::create(path).map_storage_err()?;
73 file.write_all(row.as_bytes()).map_storage_err()?;
74 }
75
76 Ok(())
77 }
78
79 async fn delete_data(&mut self, table_name: &str, keys: Vec<Key>) -> Result<()> {
80 for key in keys {
81 let path = self.data_path(table_name, &key)?;
82
83 fs::remove_file(path).map_storage_err()?;
84 }
85
86 Ok(())
87 }
88}