use database::{Database, DbError};
use query::IsTable;
use dao::IsDao;
use query::Select;
use query::Filter;
use query::Delete;
use query::Insert;
use query::Update;
use dao::Value;
pub struct EntityManager<'a> {
pub db: &'a Database,
}
impl <'a>EntityManager<'a> {
pub fn new(db: &'a Database) -> Self {
EntityManager { db: db }
}
pub fn delete<T>(&self, filter: &Filter) -> Result<usize,DbError>
where T:IsTable{
let table_name = T::table_name();
let mut query = Delete::from(&table_name);
query.add_filter(filter);
query.execute(self.db)
}
pub fn get_all<T>(&self) -> Result<Vec<T>, DbError>
where T: IsTable + IsDao {
let table = T::table_name();
let mut q = Select::all();
q.from(&table);
q.collect(self.db)
}
pub fn get_all_with_filter<T>(&self, filter: &Filter) -> Result<Vec<T>, DbError>
where T: IsTable + IsDao {
let table = T::table_name();
let mut q = Select::all();
q.from(&table);
q.add_filter(filter);
q.collect(self.db)
}
pub fn get_one<T>(&self, filter: &Filter) -> Result<T, DbError>
where T: IsTable + IsDao {
let table = T::table_name();
let mut q = Select::all();
q.from(&table);
q.add_filter(filter);
q.collect_one(self.db)
}
pub fn insert<T,D>(&self, t: &T) -> Result<D, DbError>
where T: IsTable + IsDao, D: IsDao
{
let table = T::table_name();
let dao = t.to_dao();
let mut q = Insert::into(&table);
for c in &table.columns {
q.column(&c.column);
}
q.return_all();
for c in &table.columns {
let value:Option<&Value> = dao.get(&c.column);
match value {
Some(value) => {
q.value(value);
}
None => (),
}
}
q.insert(self.db)
}
pub fn begin(&self) {
self.db.begin()
}
pub fn commit(&self) {
self.db.commit()
}
pub fn rollback(&self) {
self.db.rollback()
}
pub fn update_with_filter<T,D>(&self, t: &T, filter: Filter) -> Result<D, DbError>
where T: IsTable + IsDao, D: IsTable + IsDao {
let table = T::table_name();
let dao = t.to_dao();
let mut query = Update::table(&table);
query.columns(&table.columns);
for c in &table.columns{
let v = dao.get(&c.column);
match v{
Some(v) => {
query.value(v);
},
None => (),
}
}
query.add_filter(&filter);
query.return_all();
query.update(self.db)
}
}