core/src/db/messages.rs

94 lines
2.9 KiB
Rust

use super::types::Message;
use rusqlite::{params, Connection, Result};
fn ret_mes(row: &rusqlite::Row<'_>) -> Result<Message> {
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<Message> {
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<Vec<Message>> {
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<Message> = 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<Vec<Message>> {
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<Message> = 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(())
}