multisql/databases/memory/
mutable.rs1use std::collections::HashMap;
2
3use {
4 crate::{DBMut, MemoryDatabase, Result, Row, Schema, Value},
5 async_trait::async_trait,
6};
7
8#[async_trait(?Send)]
9impl DBMut for MemoryDatabase {
10 async fn insert_schema(&mut self, schema: &Schema) -> Result<()> {
11 let table_name = schema.table_name.clone();
12 self.data.insert(table_name.clone(), HashMap::new());
13 self.tables.insert(table_name, schema.clone());
14 Ok(())
15 }
16
17 async fn delete_schema(&mut self, table_name: &str) -> Result<()> {
18 self.tables.remove(table_name);
19 self.tables.remove(table_name);
20 Ok(())
21 }
22
23 async fn insert_data(&mut self, table_name: &str, rows: Vec<Row>) -> Result<()> {
24 let table_name = table_name.to_string();
25 let old_rows = self.data.remove(&table_name).unwrap_or_default();
26 let init = old_rows.len();
27 let rows = rows
28 .into_iter()
29 .enumerate()
30 .map(|(index, row)| (Value::U64((index + init) as u64), row))
31 .chain(old_rows.into_iter())
32 .collect();
33 self.data.insert(table_name, rows);
34 Ok(())
35 }
36
37 async fn update_index(
38 &mut self,
39 table_name: &str,
40 index_name: &str,
41 keys: Vec<(Value, Value)>,
42 ) -> Result<()> {
43 let (table_name, index_name) = (table_name.to_string(), index_name.to_string());
44 let mut indexes = self.indexes.remove(&table_name).unwrap_or_default();
45 let mut index = indexes.remove(&index_name).unwrap_or_default();
46 index.extend(keys);
47 indexes.insert(index_name, index);
48 self.indexes.insert(table_name, indexes);
49 Ok(())
50 }
51}