Some type experimentation

This commit is contained in:
Timothy Warren 2019-04-03 20:58:22 -04:00
parent 0d648952cd
commit 80f85b6579
6 changed files with 80 additions and 4 deletions

View File

@ -21,7 +21,13 @@ features=["chrono","serde_json","url"]
optional=true optional=true
package="rusqlite" package="rusqlite"
[dependencies.my]
version="15.1.0"
optional=true
package="mysql"
[features] [features]
default=['postgres'] default=['postgres']
postgres=['pg'] postgres=['pg']
sqlite=['slite'] sqlite=['slite']
mysql=['my']

View File

@ -3,16 +3,20 @@
//! Drivers represent a connection to a specific type of database engine //! Drivers represent a connection to a specific type of database engine
use std::fmt; use std::fmt;
#[cfg(feature="pg")] #[cfg(feature="postgres")]
mod postgres; mod postgres;
#[cfg(feature="sqlite")] #[cfg(feature="sqlite")]
mod sqlite; mod sqlite;
#[cfg(feature="mysql")]
mod mysql;
#[derive(Debug)] #[derive(Debug)]
struct Connection; struct Connection;
/// Result for a db query
#[derive(Debug)] #[derive(Debug)]
struct QueryResult; struct QueryResult;

14
src/drivers/mysql.rs Normal file
View File

@ -0,0 +1,14 @@
use super::*;
#[derive(Debug)]
pub struct MySQL;
impl DatabaseDriver for MySQL {
fn quote_identifier(&self, identifier: &str) -> String {
String::from(identifier)
}
fn query(&self, _query: &str) -> Result<(), ()> {
Ok(())
}
}

22
src/main.rs Normal file
View File

@ -0,0 +1,22 @@
//! This main file is just for temparary testing
use stringqb::query_builder::QueryBuilder;
use stringqb::types::{SQLType, Type};
fn main() {
let qb = QueryBuilder::new()
.set("foo", Box::new("bar"))
.set("bar", Box::new(12))
.set("baz", Box::new(false))
.set("fizz", Box::new(12.38))
.set("buzz", Box::new((1, 2.0, true, 'q')));
// This just makes me sad
let qb = qb.r#where("foo", Box::new(2));
println!("QueryBuilder object: {:#?}", &qb);
println!("SQLType mapping: {:#?}", SQLType::SmallInt(32));
println!("Type: {:#?}", Type(Box::new(1234567890)));
}

View File

@ -217,7 +217,10 @@ impl QueryBuilder {
/// Specify a condition for the `where` clause of the query /// Specify a condition for the `where` clause of the query
pub fn r#where(mut self, key: &str, value: Box<dyn Any>) -> Self { pub fn r#where(mut self, key: &str, value: Box<dyn Any>) -> Self {
unimplemented!(); // @TODO actually implement setting the keys for the where
self.state.where_values.push(value);
self
} }
/// Specify a condition for the `where` clause of the query, prefixed with `or` /// Specify a condition for the `where` clause of the query, prefixed with `or`
@ -427,4 +430,4 @@ mod tests {
assert_eq!(qb.state.set_array_keys.len(), 3); assert_eq!(qb.state.set_array_keys.len(), 3);
assert_eq!(qb.state.values.len(), 3); assert_eq!(qb.state.values.len(), 3);
} }
} }

View File

@ -1 +1,28 @@
//! Shared Types for different Database drivers //! Shared Types for different Database drivers
use std::any::Any;
#[derive(Debug)]
pub struct Type(pub Box<dyn Any>);
/// Enum struct for mapping between database and Rust types
#[derive(Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]
pub enum SQLType<T> {
Boolean(T),
SmallInt(T),
BigInt(T),
Text(T),
None,
}
impl<T> SQLType<T> {
pub fn is_some(&self) -> bool {
match *self {
SQLType::None => false,
_ => true,
}
}
pub fn is_none(&self) -> bool {
!self.is_some()
}
}