store_sqlite: Implement put_object overwrite parameter

This commit is contained in:
Lennart
2024-10-28 17:20:53 +01:00
parent cce3e260af
commit f3672ff986
3 changed files with 36 additions and 10 deletions

View File

@@ -275,20 +275,30 @@ impl AddressbookStore for SqliteStore {
principal: String, principal: String,
addressbook_id: String, addressbook_id: String,
object: AddressObject, object: AddressObject,
// TODO: implement
overwrite: bool, overwrite: bool,
) -> Result<(), rustical_store::Error> { ) -> Result<(), rustical_store::Error> {
let mut tx = self.db.begin().await.map_err(crate::Error::from)?; let mut tx = self.db.begin().await.map_err(crate::Error::from)?;
let (object_id, vcf) = (object.get_id(), object.get_vcf()); let (object_id, vcf) = (object.get_id(), object.get_vcf());
sqlx::query!( (if overwrite {
sqlx::query!(
"REPLACE INTO addressobjects (principal, addressbook_id, id, vcf) VALUES (?, ?, ?, ?)", "REPLACE INTO addressobjects (principal, addressbook_id, id, vcf) VALUES (?, ?, ?, ?)",
principal, principal,
addressbook_id, addressbook_id,
object_id, object_id,
vcf vcf
) )
} else {
// If the object already exists a database error is thrown and handled in error.rs
sqlx::query!(
"INSERT INTO addressobjects (principal, addressbook_id, id, vcf) VALUES (?, ?, ?, ?)",
principal,
addressbook_id,
object_id,
vcf
)
})
.execute(&mut *tx) .execute(&mut *tx)
.await .await
.map_err(crate::Error::from)?; .map_err(crate::Error::from)?;

View File

@@ -223,20 +223,29 @@ impl CalendarStore for SqliteStore {
principal: String, principal: String,
cal_id: String, cal_id: String,
object: CalendarObject, object: CalendarObject,
// TODO: implement
overwrite: bool, overwrite: bool,
) -> Result<(), Error> { ) -> Result<(), Error> {
let mut tx = self.db.begin().await.map_err(crate::Error::from)?; let mut tx = self.db.begin().await.map_err(crate::Error::from)?;
let (object_id, ics) = (object.get_id(), object.get_ics()); let (object_id, ics) = (object.get_id(), object.get_ics());
sqlx::query!( (if overwrite {
"REPLACE INTO calendarobjects (principal, cal_id, id, ics) VALUES (?, ?, ?, ?)", sqlx::query!(
principal, "REPLACE INTO calendarobjects (principal, cal_id, id, ics) VALUES (?, ?, ?, ?)",
cal_id, principal,
object_id, cal_id,
ics object_id,
) ics
)
} else {
sqlx::query!(
"INSERT INTO calendarobjects (principal, cal_id, id, ics) VALUES (?, ?, ?, ?)",
principal,
cal_id,
object_id,
ics
)
})
.execute(&mut *tx) .execute(&mut *tx)
.await .await
.map_err(crate::Error::from)?; .map_err(crate::Error::from)?;

View File

@@ -11,6 +11,13 @@ impl From<sqlx::Error> for Error {
fn from(value: sqlx::Error) -> Self { fn from(value: sqlx::Error) -> Self {
match value { match value {
sqlx::Error::RowNotFound => Error::StoreError(rustical_store::Error::NotFound), sqlx::Error::RowNotFound => Error::StoreError(rustical_store::Error::NotFound),
sqlx::Error::Database(err) => {
if err.is_unique_violation() {
Error::StoreError(rustical_store::Error::AlreadyExists)
} else {
Error::SqlxError(sqlx::Error::Database(err))
}
}
err => Error::SqlxError(err), err => Error::SqlxError(err),
} }
} }