@@ -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