Skip to content

Commit 5439a6e

Browse files
gzryzhyk
authored andcommitted
Better error handling for unique project_name constraint.
1 parent a50d360 commit 5439a6e

1 file changed

Lines changed: 23 additions & 3 deletions

File tree

  • pipeline_manager/src

pipeline_manager/src/db.rs

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,26 @@ CREATE TABLE IF NOT EXISTS pipeline (
286286
Ok((version, code))
287287
}
288288

289+
/// Helper to convert rusqlite error into a `DBError::DuplicateProjectName`
290+
/// if the underlying low-level error thrown by the database matches.
291+
fn maybe_duplicate_project_name_err(e: rusqlite::Error, project_name: &str) -> AnyError {
292+
if let rusqlite::Error::SqliteFailure(sqlite_failure, Some(msg)) = &e {
293+
if sqlite_failure
294+
== (&rusqlite::ffi::Error {
295+
code: rusqlite::ErrorCode::ConstraintViolation,
296+
extended_code: rusqlite::ffi::SQLITE_CONSTRAINT_UNIQUE,
297+
})
298+
&& msg.as_str() == "UNIQUE constraint failed: project.name"
299+
{
300+
anyhow!(DBError::DuplicateProjectName(project_name.to_string()))
301+
} else {
302+
anyhow!(e)
303+
}
304+
} else {
305+
anyhow!(e)
306+
}
307+
}
308+
289309
/// Create a new project.
290310
pub(crate) fn new_project(
291311
&self,
@@ -297,7 +317,7 @@ CREATE TABLE IF NOT EXISTS pipeline (
297317
.execute(
298318
"INSERT INTO project (version, name, description, code, status_since) VALUES(1, $1, $2, $3, unixepoch('now'))",
299319
(&project_name, &project_description, &project_code),
300-
)?;
320+
).map_err(|e| ProjectDB::maybe_duplicate_project_name_err(e, project_name))?;
301321

302322
let id = self
303323
.dbclient
@@ -334,15 +354,15 @@ CREATE TABLE IF NOT EXISTS pipeline (
334354
.execute(
335355
"UPDATE project SET version = $1, name = $2, description = $3, code = $4, status = NULL, error = NULL WHERE id = $4",
336356
(&version.0, &project_name, &project_description, code, &project_id.0),
337-
).map_err(|_| DBError::DuplicateProjectName(project_name.to_string()))?;
357+
).map_err(|e| ProjectDB::maybe_duplicate_project_name_err(e, project_name))?;
338358
}
339359
_ => {
340360
self.dbclient
341361
.execute(
342362
"UPDATE project SET name = $1, description = $2 WHERE id = $3",
343363
(&project_name, &project_description, &project_id.0),
344364
)
345-
.map_err(|_| DBError::DuplicateProjectName(project_name.to_string()))?;
365+
.map_err(|e| ProjectDB::maybe_duplicate_project_name_err(e, project_name))?;
346366
}
347367
}
348368

0 commit comments

Comments
 (0)