use super::types::Message; use rusqlite::{params, Connection, Result}; fn ret_mes(row: &rusqlite::Row<'_>) -> Result { Ok(Message { id: row.get(0)?, user_id: row.get(1)?, date: row.get(2)?, message: row.get(3)?, from_me: row.get(4)?, }) } type Id = crate::db::types::Id; pub fn select_message_by_id(user_id: u32, id:u32, conn: &Connection) -> Result { let mut selected = conn.prepare("SELECT * FROM messages WHERE id = ?1 AND user_id = ?2")?; let mut message_iter = selected.query_map(params![id, user_id], |row| ret_mes(row))?; let message = message_iter.next().unwrap(); log::info!("Message {:} founded", id); message } pub fn select_all_user_message(id: u32, conn: &Connection) -> Result> { let mut selected = conn.prepare("SELECT * FROM messages, my_messages WHERE user_id = ? ORDER BY date DESC")?; let message_iter = selected.query_map(params![id], |row| ret_mes(row))?; let mut messages: Vec = Vec::new(); for message in message_iter { log::info!("Message: {:?}", (&message)); messages.push(message?); } log::info!("All messages loaded to memory"); Ok(messages) } pub fn select_n_last_messages( user_id: Id, start: u32, count: u32, conn: &Connection, ) -> Result> { let mut selected = conn.prepare( "SELECT * FROM messages WHERE user_id = ?1 ORDER BY date DESC LIMIT ?2", )?; let message_iter = selected.query_map(params![user_id, count], |row| ret_mes(row))?; let mut messages: Vec = Vec::new(); for message in message_iter { log::info!("Message: {:?}", (&message)); messages.push(message?); } log::info!("All messages loaded to memory"); log::debug!("{:?}", messages); Ok(messages) } pub fn add_message(message: Message, conn: &Connection) -> Result<()> { match conn.execute( "INSERT INTO messages ( user_id, date, message, from_me ) VALUES (?1, ?2, ?3, ?4)", params![message.user_id, message.date, message.message, false], ) { Ok(_) => log::info!("message {:} added succsessfully!", message.id), Err(e) => { log::error!("failed to insert message {:?}", e); return Err(e); } } Ok(()) } pub fn add_my_message(message: Message, conn: &Connection) -> Result<()> { match conn.execute( "INSERT INTO messages ( user_id, date, message, from_me ) VALUES (?1, ?2, ?3, ?4)", params![message.user_id, message.date, message.message, true], ) { Ok(_) => log::info!("message {:} added succsessfully!", message.id), Err(e) => { log::error!("failed to insert message {:?}", e); return Err(e); } } Ok(()) }