use sqlx; use sqlx::sqlite::SqlitePool; use std::sync::Arc; use crate::errors::NoteStoreError; use crate::structs::{RawPage, RawNote}; /// A handle to our Sqlite database. #[derive(Clone)] pub struct NoteStore(Arc); type NoteResult = core::result::Result; type SqlResult = sqlx::Result; impl NoteStore { pub async fn new(url: &str) -> NoteResult { let pool = SqlitePool::connect(url).await?; Ok(NoteStore(Arc::new(pool))) } /// This will erase all the data in the database. Only use this /// if you're sure that's what you want. pub async fn reset_database(&self) -> NoteResult<()> { let initialize_sql = include_str!("sql/initialize_database.sql"); sqlx::query(initialize_sql) .execute(&*self.0) .await?; Ok(()) } pub async fn fetch_page(&self, id: &str) -> SqlResult { let select_one_page_sql = include_str!("sql/select_one_page.sql"); sqlx::query_as(select_one_page_sql) .bind(&id) .fetch_one(&*self.0) .await } pub async fn fetch_note(&self, id: &str) -> SqlResult { let select_one_note_sql = include_str!("sql/select_one_note.sql"); sqlx::query_as(select_one_note_sql) .bind(&id) .fetch_one(&*self.0) .await } }