|
use rusqlite::{Connection, Result}; |
|
use crate::whiteboard::DrawAction; |
|
use std::sync::Mutex; |
|
|
|
pub struct Database { |
|
conn: Mutex<Connection>, |
|
} |
|
|
|
impl Database { |
|
pub fn new(conn: Connection) -> Self { |
|
Database { conn: Mutex::new(conn) } |
|
} |
|
|
|
pub fn save_action(&self, action: &DrawAction) -> Result<()> { |
|
let conn = self.conn.lock().unwrap(); |
|
conn.execute( |
|
"INSERT INTO actions (x, y, color, is_eraser, pen_size) VALUES (?1, ?2, ?3, ?4, ?5)", |
|
(action.x, action.y, &action.color, action.is_eraser, action.pen_size), |
|
)?; |
|
Ok(()) |
|
} |
|
|
|
pub fn get_current_state(&self) -> Result<Vec<DrawAction>> { |
|
let conn = self.conn.lock().unwrap(); |
|
let mut stmt = conn.prepare("SELECT x, y, color, is_eraser, pen_size FROM actions ORDER BY id")?; |
|
let actions = stmt.query_map([], |row| { |
|
Ok(DrawAction { |
|
x: row.get(0)?, |
|
y: row.get(1)?, |
|
color: row.get(2)?, |
|
is_eraser: row.get(3)?, |
|
pen_size: row.get(4)?, |
|
}) |
|
})?; |
|
actions.collect() |
|
} |
|
|
|
pub fn clear_whiteboard(&self) -> Result<()> { |
|
let conn = self.conn.lock().unwrap(); |
|
conn.execute("DELETE FROM actions", [])?; |
|
Ok(()) |
|
} |
|
} |
|
|
|
pub fn init_db() -> Result<Database> { |
|
let conn = Connection::open("whiteboard.db")?; |
|
conn.execute( |
|
"CREATE TABLE IF NOT EXISTS actions ( |
|
id INTEGER PRIMARY KEY, |
|
x REAL NOT NULL, |
|
y REAL NOT NULL, |
|
color TEXT NOT NULL, |
|
is_eraser BOOLEAN NOT NULL, |
|
pen_size REAL NOT NULL |
|
)", |
|
[], |
|
)?; |
|
Ok(Database::new(conn)) |
|
} |
|
|