1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
use std::collections::HashMap;

use {
	crate::{DBMut, MemoryDatabase, Result, Row, Schema, Value},
	async_trait::async_trait,
};

#[async_trait(?Send)]
impl DBMut for MemoryDatabase {
	async fn insert_schema(&mut self, schema: &Schema) -> Result<()> {
		let table_name = schema.table_name.clone();
		self.data.insert(table_name.clone(), HashMap::new());
		self.tables.insert(table_name, schema.clone());
		Ok(())
	}

	async fn delete_schema(&mut self, table_name: &str) -> Result<()> {
		self.tables.remove(table_name);
		self.tables.remove(table_name);
		Ok(())
	}

	async fn insert_data(&mut self, table_name: &str, rows: Vec<Row>) -> Result<()> {
		let table_name = table_name.to_string();
		let old_rows = self.data.remove(&table_name).unwrap_or_default();
		let init = old_rows.len();
		let rows = rows
			.into_iter()
			.enumerate()
			.map(|(index, row)| (Value::U64((index + init) as u64), row))
			.chain(old_rows.into_iter())
			.collect();
		self.data.insert(table_name, rows);
		Ok(())
	}

	async fn update_index(
		&mut self,
		table_name: &str,
		index_name: &str,
		keys: Vec<(Value, Value)>,
	) -> Result<()> {
		let (table_name, index_name) = (table_name.to_string(), index_name.to_string());
		let mut indexes = self.indexes.remove(&table_name).unwrap_or_default();
		let mut index = indexes.remove(&index_name).unwrap_or_default();
		index.extend(keys);
		indexes.insert(index_name, index);
		self.indexes.insert(table_name, indexes);
		Ok(())
	}
}