gluesql_file_storage/
store_mut.rs

1use {
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}