Ugly progress commit
This commit is contained in:
parent
f2d993cbf0
commit
d77e25b800
2
.gitignore
vendored
2
.gitignore
vendored
@ -130,3 +130,5 @@ Cargo.lock
|
|||||||
**/*.rs.bk
|
**/*.rs.bk
|
||||||
|
|
||||||
# End of https://www.gitignore.io/api/rust,macos,jetbrains+all
|
# End of https://www.gitignore.io/api/rust,macos,jetbrains+all
|
||||||
|
|
||||||
|
.env
|
||||||
|
12
Cargo.toml
12
Cargo.toml
@ -6,14 +6,22 @@ edition = "2018"
|
|||||||
categories = ["database"]
|
categories = ["database"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
dotenv = "0.13.0"
|
||||||
serde_json = "1.0.39"
|
serde_json = "1.0.39"
|
||||||
|
|
||||||
[dependencies.postgres]
|
[dependencies.pg]
|
||||||
version="0.15.2"
|
version="0.15.2"
|
||||||
features=["with-serde_json"]
|
features=["with-serde_json"]
|
||||||
optional=true
|
optional=true
|
||||||
|
package="postgres"
|
||||||
|
|
||||||
[dependencies.rusqlite]
|
[dependencies.slite]
|
||||||
version="0.17.0"
|
version="0.17.0"
|
||||||
features=["chrono","serde_json","url"]
|
features=["chrono","serde_json","url"]
|
||||||
optional=true
|
optional=true
|
||||||
|
package="rusqlite"
|
||||||
|
|
||||||
|
[features]
|
||||||
|
default=['postgres']
|
||||||
|
postgres=['pg']
|
||||||
|
sqlite=['slite']
|
@ -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(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
26
src/drivers/mod.rs
Normal file
26
src/drivers/mod.rs
Normal file
@ -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<(), ()>;
|
||||||
|
}
|
13
src/drivers/postgres.rs
Normal file
13
src/drivers/postgres.rs
Normal file
@ -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(())
|
||||||
|
}
|
||||||
|
}
|
7
src/drivers/sqlite.rs
Normal file
7
src/drivers/sqlite.rs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
pub struct SQLite;
|
||||||
|
|
||||||
|
impl DatabaseDriver for SQLite {
|
||||||
|
fn query(&self, _query: &str) -> Result<(), ()> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
13
src/lib.rs
13
src/lib.rs
@ -1,6 +1,9 @@
|
|||||||
/// # StringQB
|
//! # StringQB
|
||||||
///
|
//!
|
||||||
/// A query builder using mostly strings, with methods following common SQL syntax
|
//! 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;
|
|
||||||
|
@ -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 std::collections::HashMap;
|
||||||
|
|
||||||
use crate::drivers::DatabaseDriver;
|
use crate::drivers::DatabaseDriver;
|
||||||
@ -39,10 +42,10 @@ struct QueryState {
|
|||||||
group_array: HashMap<String, String>,
|
group_array: HashMap<String, String>,
|
||||||
|
|
||||||
// Values to apply to prepared statements
|
// Values to apply to prepared statements
|
||||||
pub values: Vec<String>,
|
pub values: Vec<Box<dyn Any>>,
|
||||||
|
|
||||||
// Values to apply to where clauses in prepared statements
|
// Values to apply to where clauses in prepared statements
|
||||||
pub where_values: Vec<String>,
|
pub where_values: Vec<Box<dyn Any>>,
|
||||||
|
|
||||||
limit: u32,
|
limit: u32,
|
||||||
|
|
||||||
@ -61,13 +64,15 @@ impl QueryState {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The struct representing a query builder
|
||||||
#[derive(Default, Debug)]
|
#[derive(Default, Debug)]
|
||||||
pub struct QueryBuilder {
|
pub struct QueryBuilder {
|
||||||
state: QueryState,
|
state: QueryState,
|
||||||
driver: Option<DatabaseDriver>,
|
driver: Option<Box<dyn DatabaseDriver>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl QueryBuilder {
|
impl QueryBuilder {
|
||||||
|
/// Creates a new QueryBuilder instance
|
||||||
pub fn new() -> QueryBuilder {
|
pub fn new() -> QueryBuilder {
|
||||||
QueryBuilder {
|
QueryBuilder {
|
||||||
state: QueryState::new(),
|
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<dyn Any>) -> Self {
|
||||||
self.state.set_array_keys.push(key);
|
self.state.set_array_keys.push(key);
|
||||||
self.state.values.push(value);
|
self.state.values.push(value);
|
||||||
|
|
||||||
@ -90,8 +96,8 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn set_key_value() {
|
fn set_key_value() {
|
||||||
let builder = QueryBuilder::new();
|
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::<String>());
|
||||||
}
|
}
|
||||||
}
|
}
|
1
src/types.rs
Normal file
1
src/types.rs
Normal file
@ -0,0 +1 @@
|
|||||||
|
//! Shared Types for different Database drivers
|
Loading…
Reference in New Issue
Block a user