multisql/databases/memory/
mutable.rs

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