diff --git a/src/playlist.rs b/src/playlist.rs index df7abc0..2a79c13 100644 --- a/src/playlist.rs +++ b/src/playlist.rs @@ -78,10 +78,10 @@ fn list_playlists(owner: &str, db: &T) -> Result> fn save_playlist(name: &str, owner: &str, content: &Vec, db: &T) -> Result<()> where T: ConnectionSource + VFSSource { - // TODO transaction for content delete+add let user: User; let new_playlist: NewPlaylist; let playlist: Playlist; + let vfs = db.get_vfs()?; { let connection = db.get_connection(); @@ -111,16 +111,11 @@ fn save_playlist(name: &str, owner: &str, content: &Vec, db: &T) -> R .filter(name.eq(name).and(owner.eq(user.id))) .get_result(connection.deref())?; } - - // Delete old content (if any) - let old_songs = PlaylistSong::belonging_to(&playlist); - diesel::delete(old_songs).execute(connection.deref())?; } - // Insert content - let vfs = db.get_vfs()?; let mut new_songs: Vec = Vec::new(); new_songs.reserve(content.len()); + for (i, path) in content.iter().enumerate() { let virtual_path = Path::new(&path); if let Some(real_path) = vfs.virtual_to_real(virtual_path) @@ -136,9 +131,19 @@ fn save_playlist(name: &str, owner: &str, content: &Vec, db: &T) -> R { let connection = db.get_connection(); - diesel::insert(&new_songs) - .into(playlist_songs::table) - .execute(connection.deref())?; + connection + .deref() + .transaction::<_, diesel::result::Error, _>(|| { + // Delete old content (if any) + let old_songs = PlaylistSong::belonging_to(&playlist); + diesel::delete(old_songs).execute(connection.deref())?; + + // Insert content + diesel::insert(&new_songs) + .into(playlist_songs::table) + .execute(connection.deref())?; + Ok(()) + })?; } Ok(()) @@ -185,17 +190,20 @@ fn read_playlist(playlist_name: &str, owner: &str, db: &T) -> Result