diff --git a/.gitignore b/.gitignore index e6350fc..a749442 100644 --- a/.gitignore +++ b/.gitignore @@ -130,3 +130,5 @@ Cargo.lock **/*.rs.bk # End of https://www.gitignore.io/api/rust,macos,jetbrains+all + +.env diff --git a/Cargo.toml b/Cargo.toml index acb3b10..aecc25e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,14 +6,22 @@ edition = "2018" categories = ["database"] [dependencies] +dotenv = "0.13.0" serde_json = "1.0.39" -[dependencies.postgres] +[dependencies.pg] version="0.15.2" features=["with-serde_json"] optional=true +package="postgres" -[dependencies.rusqlite] +[dependencies.slite] version="0.17.0" features=["chrono","serde_json","url"] -optional=true \ No newline at end of file +optional=true +package="rusqlite" + +[features] +default=['postgres'] +postgres=['pg'] +sqlite=['slite'] \ No newline at end of file diff --git a/src/drivers.rs b/src/drivers.rs deleted file mode 100644 index d03e369..0000000 --- a/src/drivers.rs +++ /dev/null @@ -1,20 +0,0 @@ -pub trait DatabaseDriver { - fn query(&self, query: &str) -> Result<(), ()>; -} - -pub struct Postgres; -pub struct SQLite; - - -impl DatabaseDriver for Postgres { - fn query(&self, _query: &str) -> Result<(), ()> { - Ok(()) - } -} - -impl DatabaseDriver for SQLite { - fn query(&self, _query: &str) -> Result<(), ()> { - Ok(()) - } -} - diff --git a/src/drivers/mod.rs b/src/drivers/mod.rs new file mode 100644 index 0000000..d0f6e62 --- /dev/null +++ b/src/drivers/mod.rs @@ -0,0 +1,26 @@ +//! Drivers +//! +//! Drivers represent a connection to a specific type of database engine +use std::fmt; + +#[cfg(feature="pg")] +mod postgres; + +#[cfg(feature="sqlite")] +mod sqlite; + + +#[derive(Debug)] +struct Connection; + +#[derive(Debug)] +struct QueryResult; + + +/// Database Driver Trait +/// +/// Interface between the database connection library and the query builder +pub trait DatabaseDriver: fmt::Debug { + /// Runs a basic sql query on the database + fn query(&self, query: &str) -> Result<(), ()>; +} diff --git a/src/drivers/postgres.rs b/src/drivers/postgres.rs new file mode 100644 index 0000000..be7473b --- /dev/null +++ b/src/drivers/postgres.rs @@ -0,0 +1,13 @@ +use super::*; + +use pg; + +#[derive(Debug)] +pub struct Postgres; + +#[cfg(feature="pg")] +impl DatabaseDriver for Postgres { + fn query(&self, _query: &str) -> Result<(), ()> { + Ok(()) + } +} \ No newline at end of file diff --git a/src/drivers/sqlite.rs b/src/drivers/sqlite.rs new file mode 100644 index 0000000..1ef71ca --- /dev/null +++ b/src/drivers/sqlite.rs @@ -0,0 +1,7 @@ +pub struct SQLite; + +impl DatabaseDriver for SQLite { + fn query(&self, _query: &str) -> Result<(), ()> { + Ok(()) + } +} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 987e0c6..3c34dff 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,9 @@ -/// # StringQB -/// -/// A query builder using mostly strings, with methods following common SQL syntax +//! # StringQB +//! +//! A query builder using mostly strings, with methods following common SQL syntax +#![warn(missing_docs)] + +pub mod drivers; +pub mod query_builder; +pub mod types; -mod drivers; -mod query_builder; diff --git a/src/query_builder.rs b/src/query_builder.rs index 508db1c..d4c1aa0 100644 --- a/src/query_builder.rs +++ b/src/query_builder.rs @@ -1,4 +1,7 @@ -use std::any::Any; +//! QueryBuilder +//! +//! The QueryBuilder creates sql queries from chained methods +use std::any::{Any, TypeId}; use std::collections::HashMap; use crate::drivers::DatabaseDriver; @@ -39,10 +42,10 @@ struct QueryState { group_array: HashMap, // Values to apply to prepared statements - pub values: Vec, + pub values: Vec>, // Values to apply to where clauses in prepared statements - pub where_values: Vec, + pub where_values: Vec>, limit: u32, @@ -61,13 +64,15 @@ impl QueryState { } } +/// The struct representing a query builder #[derive(Default, Debug)] pub struct QueryBuilder { state: QueryState, - driver: Option, + driver: Option>, } impl QueryBuilder { + /// Creates a new QueryBuilder instance pub fn new() -> QueryBuilder { QueryBuilder { state: QueryState::new(), @@ -75,7 +80,8 @@ impl QueryBuilder { } } - pub fn set(mut self, key: String, value: String) -> Self { + /// Set a key and value for an insert or update query + pub fn set(mut self, key: String, value: Box) -> Self { self.state.set_array_keys.push(key); self.state.values.push(value); @@ -90,8 +96,8 @@ mod tests { #[test] fn set_key_value() { let builder = QueryBuilder::new(); - let builder = builder.set("foo".to_string(), "bar".to_string()); + let builder = builder.set("foo".to_string(), Box::new("bar".to_string())); - assert_eq!(builder.state.values, vec!["bar"]); + assert!(builder.state.values[0].is::()); } } \ No newline at end of file diff --git a/src/types.rs b/src/types.rs new file mode 100644 index 0000000..17266d6 --- /dev/null +++ b/src/types.rs @@ -0,0 +1 @@ +//! Shared Types for different Database drivers