Add sql transactions
This commit is contained in:
parent
f539c47e3b
commit
19e2ea003b
17 changed files with 242 additions and 240 deletions
src/db
|
@ -1,7 +1,7 @@
|
|||
use std::ops::DerefMut;
|
||||
|
||||
use serde_derive::Serialize;
|
||||
use sqlx::pool::PoolConnection;
|
||||
use sqlx::Transaction;
|
||||
use sqlx::Sqlite;
|
||||
|
||||
use crate::errors::DatabaseError;
|
||||
|
@ -14,7 +14,7 @@ pub struct DbTag {
|
|||
|
||||
impl DbTag {
|
||||
pub async fn create(
|
||||
conn: &mut PoolConnection<Sqlite>,
|
||||
tx: &mut Transaction<'_, Sqlite>,
|
||||
new_tag: &str,
|
||||
) -> Result<DbTag, DatabaseError> {
|
||||
if new_tag.is_empty() {
|
||||
|
@ -26,54 +26,54 @@ impl DbTag {
|
|||
"INSERT INTO tags (tag) VALUES (?) RETURNING *",
|
||||
new_tag
|
||||
)
|
||||
.fetch_optional(conn.deref_mut())
|
||||
.fetch_optional(tx.deref_mut())
|
||||
.await?
|
||||
.ok_or(DatabaseError::InsertGetError)
|
||||
}
|
||||
|
||||
pub async fn get_all(conn: &mut PoolConnection<Sqlite>) -> Result<Vec<DbTag>, DatabaseError> {
|
||||
pub async fn get_all(tx: &mut Transaction<'_, Sqlite>) -> Result<Vec<DbTag>, DatabaseError> {
|
||||
sqlx::query_as!(DbTag, "SELECT * FROM tags")
|
||||
.fetch_all(conn.deref_mut())
|
||||
.fetch_all(tx.deref_mut())
|
||||
.await
|
||||
.map_err(DatabaseError::from)
|
||||
}
|
||||
|
||||
pub async fn get(
|
||||
conn: &mut PoolConnection<Sqlite>,
|
||||
tx: &mut Transaction<'_, Sqlite>,
|
||||
id: i64,
|
||||
) -> Result<Option<DbTag>, DatabaseError> {
|
||||
sqlx::query_as!(DbTag, "SELECT * FROM tags WHERE id = ?", id)
|
||||
.fetch_optional(conn.deref_mut())
|
||||
.fetch_optional(tx.deref_mut())
|
||||
.await
|
||||
.map_err(DatabaseError::from)
|
||||
}
|
||||
|
||||
pub async fn get_by_tag_or_create(
|
||||
conn: &mut PoolConnection<Sqlite>,
|
||||
tx: &mut Transaction<'_, Sqlite>,
|
||||
target_tag: &str,
|
||||
) -> Result<DbTag, DatabaseError> {
|
||||
match DbTag::get_by_tag(conn, target_tag).await? {
|
||||
match DbTag::get_by_tag(tx, target_tag).await? {
|
||||
Some(tag) => Ok(tag),
|
||||
None => DbTag::create(conn, target_tag).await,
|
||||
None => DbTag::create(tx, target_tag).await,
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn get_by_tag(
|
||||
conn: &mut PoolConnection<Sqlite>,
|
||||
tx: &mut Transaction<'_, Sqlite>,
|
||||
target_tag: &str,
|
||||
) -> Result<Option<DbTag>, DatabaseError> {
|
||||
sqlx::query_as!(DbTag, "SELECT * FROM tags WHERE tag = ?", target_tag)
|
||||
.fetch_optional(conn.deref_mut())
|
||||
.fetch_optional(tx.deref_mut())
|
||||
.await
|
||||
.map_err(DatabaseError::from)
|
||||
}
|
||||
|
||||
pub async fn delete_by_tag(
|
||||
conn: &mut PoolConnection<Sqlite>,
|
||||
tx: &mut Transaction<'_, Sqlite>,
|
||||
filter_tag: &str,
|
||||
) -> Result<(), DatabaseError> {
|
||||
if sqlx::query_scalar!("SELECT 1 FROM tags WHERE tag = ?", filter_tag)
|
||||
.fetch_optional(conn.deref_mut())
|
||||
.fetch_optional(tx.deref_mut())
|
||||
.await?
|
||||
.is_none()
|
||||
{
|
||||
|
@ -81,7 +81,7 @@ impl DbTag {
|
|||
}
|
||||
|
||||
sqlx::query!("DELETE FROM tags WHERE tag = ?", filter_tag)
|
||||
.execute(conn.deref_mut())
|
||||
.execute(tx.deref_mut())
|
||||
.await
|
||||
.map(|res| match res.rows_affected() {
|
||||
0 => Err(DatabaseError::DeleteError),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue