summaryrefslogtreecommitdiffstats
path: root/src/db/models/release_store.rs
diff options
context:
space:
mode:
authorMatthias Beyer <matthias.beyer@atos.net>2021-06-08 14:45:52 +0200
committerMatthias Beyer <matthias.beyer@atos.net>2021-06-08 14:45:53 +0200
commit43e41b622071d6167d0180b49b61011a1cf14b23 (patch)
tree2872a9e4d27ee705f3e61301b0443c34ccce89dc /src/db/models/release_store.rs
parent7d7183b2feeb1f69a0703b776de69f0fa9638185 (diff)
Insert-and-get should be executed as transaction
This patch makes sure all database functions are executed as transactions, so that we do not accidentially end up in a data race if two butido instances are executing these functions at the same time. Signed-off-by: Matthias Beyer <matthias.beyer@atos.net>
Diffstat (limited to 'src/db/models/release_store.rs')
-rw-r--r--src/db/models/release_store.rs26
1 files changed, 13 insertions, 13 deletions
diff --git a/src/db/models/release_store.rs b/src/db/models/release_store.rs
index bc3b097..ad6c9b2 100644
--- a/src/db/models/release_store.rs
+++ b/src/db/models/release_store.rs
@@ -10,6 +10,7 @@
use anyhow::Error;
use anyhow::Result;
+use diesel::Connection;
use diesel::ExpressionMethods;
use diesel::PgConnection;
use diesel::QueryDsl;
@@ -32,23 +33,22 @@ struct NewReleaseStore<'a> {
}
impl ReleaseStore {
- pub fn create(
- database_connection: &PgConnection,
- name: &str,
- ) -> Result<ReleaseStore> {
+ pub fn create(database_connection: &PgConnection, name: &str) -> Result<ReleaseStore> {
let new_relstore = NewReleaseStore {
store_name: name,
};
- diesel::insert_into(schema::release_stores::table)
- .values(&new_relstore)
- .on_conflict_do_nothing()
- .execute(database_connection)?;
-
- schema::release_stores::table
- .filter(schema::release_stores::store_name.eq(name))
- .first::<ReleaseStore>(database_connection)
- .map_err(Error::from)
+ database_connection.transaction::<_, Error, _>(|| {
+ diesel::insert_into(schema::release_stores::table)
+ .values(&new_relstore)
+ .on_conflict_do_nothing()
+ .execute(database_connection)?;
+
+ schema::release_stores::table
+ .filter(schema::release_stores::store_name.eq(name))
+ .first::<ReleaseStore>(database_connection)
+ .map_err(Error::from)
+ })
}
}