use super::{Affected, Desult, Dypes, Params, SelectHolder};
use std;
use std::collections::HashMap;
extern crate chrono;
pub struct Row<'a>(&'a Rowable);
impl<'a> Row<'a> {
pub fn new<T>(row: &'a T) -> Self
where
T: Rowable,
{
Row(row)
}
pub fn get<T>(&self, key: &str) -> Option<T>
where
Option<T>: std::convert::From<Dypes>,
{
if key == "user_profile_id" {
println!("get user_profile_id {:?}", self.0.get_val(key));
}
match self.0.get_val(key) {
Some(x) => <Option<T>>::from(x),
None => None,
}
}
pub fn get_date_string(&self, key: &str, format: &str) -> Desult<String> {
self.0.get_date_string(key, format)
}
}
pub trait Queryable {
fn new(row: Row) -> Self;
}
pub trait Insertable {
fn fields() -> Vec<String>;
fn values(&self) -> Vec<Dypes>;
}
pub trait Rowable {
fn get_val(&self, key: &str) -> Option<Dypes>;
fn get_date_string(&self, key: &str, format: &str) -> Desult<String>;
}
pub trait Connectionable {
fn execute<P>(&self, sql: &str, params: P) -> Desult<()>
where
P: std::clone::Clone,
Params: std::convert::From<P>;
fn select<T: Queryable + std::fmt::Debug, P: std::clone::Clone>(
&self,
sql: &str,
params: P,
calc_found_rows: bool,
) -> Desult<SelectHolder<T>>
where
Params: std::convert::From<P>;
fn value<T, R>(&self, sql: &str, colum: &str, params: R) -> Desult<T>
where
T: std::convert::From<Dypes>,
R: std::clone::Clone,
Params: std::convert::From<R>;
fn row<T, R>(&self, sql: &str, params: R) -> Desult<T>
where
T: Queryable,
R: std::clone::Clone,
Params: std::convert::From<R>;
fn array<T: Queryable + std::fmt::Debug, P: std::clone::Clone>(
&self,
sql: &str,
params: P,
calc_found_rows: bool,
) -> Desult<Vec<T>>
where
Params: std::convert::From<P>,
{
self.select(sql, params, calc_found_rows).map(|r| r.data)
}
fn insert_update<T: Insertable>(&self, table: &str, fields: Vec<T>) -> Desult<Affected>;
fn insert<T: Insertable>(&self, table: &str, fields: Vec<T>) -> Desult<Affected>;
fn update<T: Insertable>(
&self,
table: &str,
fields: Vec<T>,
where_fields: HashMap<&str, Dypes>,
) -> Desult<Affected>;
fn gen_dupdate(colums: Vec<String>) -> String {
let mut rt = Vec::new();
for n in colums {
rt.push(format!("{} = VALUES({}) ", n, n));
}
rt.join(&",")
}
fn delete_ids<T>(
&self,
table: &str,
id_colum: &str,
id_values: Vec<T>,
in_out: &str,
) -> Desult<Affected>
where
T: std::clone::Clone,
Dypes: std::convert::From<T>;
fn delete_wid<T>(&self, table: &str, id_colum: &str, id_values: Vec<T>) -> Desult<Affected>
where
T: std::clone::Clone,
Dypes: std::convert::From<T>;
fn delete_nwid<T>(&self, table: &str, id_colum: &str, id_values: Vec<T>) -> Desult<Affected>
where
T: std::clone::Clone,
Dypes: std::convert::From<T>;
fn concat_colums(colums: Vec<&str>) -> String;
}