Began building database engine seperate from query language.
This commit is contained in:
parent
450e4fb53d
commit
6ed821e4b8
130
src/database/database.rs
Normal file
130
src/database/database.rs
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
use async_std::sync::{Arc, RwLock};
|
||||||
|
use std::{collections::HashMap, fmt, str::FromStr};
|
||||||
|
|
||||||
|
#[derive(Clone, PartialEq)]
|
||||||
|
pub enum Field {
|
||||||
|
Table,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for Field {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
match self {
|
||||||
|
Field::Table => write!(f, "table"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for Field {
|
||||||
|
type Err = ();
|
||||||
|
fn from_str(input: &str) -> Result<Field, Self::Err> {
|
||||||
|
match input {
|
||||||
|
"table" => Ok(Field::Table),
|
||||||
|
_ => Err(()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Table {
|
||||||
|
fields: Arc<RwLock<HashMap<String, Field>>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Table {
|
||||||
|
pub async fn new() -> Self {
|
||||||
|
Self {
|
||||||
|
fields: Arc::new(RwLock::new(HashMap::new())),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn add_field(&self, name: &str, ftype: &str) {
|
||||||
|
let mut fmap = self.fields.write().await;
|
||||||
|
fmap.insert(name.to_string(), Field::from_str(ftype).unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn fields(&self) -> HashMap<String, Field> {
|
||||||
|
let fmap = self.fields.read().await;
|
||||||
|
fmap.clone()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Database;
|
||||||
|
|
||||||
|
impl Database {
|
||||||
|
pub async fn new() -> Self {
|
||||||
|
Self {}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn add_table(&self, _name: String) -> Table {
|
||||||
|
Table::new().await
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tables {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[async_std::test]
|
||||||
|
async fn new_table() {
|
||||||
|
Table::new().await;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_std::test]
|
||||||
|
async fn add_field() {
|
||||||
|
let table = Table::new().await;
|
||||||
|
let mut expected: HashMap<String, Field> = HashMap::new();
|
||||||
|
expected.insert("stan".to_string(), Field::Table);
|
||||||
|
expected.insert("lee".to_string(), Field::Table);
|
||||||
|
table.add_field("stan", "table").await;
|
||||||
|
table.add_field("lee", "table").await;
|
||||||
|
let output = table.fields().await;
|
||||||
|
assert!(output == expected, "Table did not get the fields added.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod databases {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[async_std::test]
|
||||||
|
async fn new_database() {
|
||||||
|
Database::new().await;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_std::test]
|
||||||
|
async fn add_table() {
|
||||||
|
let db = Database::new().await;
|
||||||
|
db.add_table("fred".to_string()).await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod fields {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
fn get_field_map() -> HashMap<String, Field> {
|
||||||
|
let mut fields: HashMap<String, Field> = HashMap::new();
|
||||||
|
fields.insert("table".to_string(), Field::Table);
|
||||||
|
return fields;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn convert_to_string() {
|
||||||
|
for (key, value) in get_field_map().iter() {
|
||||||
|
assert!(key == &value.to_string(), "\n\nGot: {}\nWant: {}\n\n", value.to_string(), key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn convert_from_string() {
|
||||||
|
for (key, value) in get_field_map().iter() {
|
||||||
|
assert!(&Field::from_str(key).unwrap() == value, "\n\nDid not return a Field::{}", key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn convert_from_string_error() -> Result<(), String> {
|
||||||
|
match Field::from_str("jkljkl") {
|
||||||
|
Ok(_) => Err("Field jkljkl should not exist.".to_string()),
|
||||||
|
Err(_) => Ok(()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -2,6 +2,8 @@ use async_graphql::{Context, EmptySubscription, Error, Object, Result, Schema};
|
|||||||
use async_std::sync::RwLock;
|
use async_std::sync::RwLock;
|
||||||
use serde_json;
|
use serde_json;
|
||||||
|
|
||||||
|
mod database;
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
struct Table {
|
struct Table {
|
||||||
name: String,
|
name: String,
|
||||||
|
Loading…
Reference in New Issue
Block a user