Skip to content

Commit 61c809c

Browse files
committed
Transaction queries to fix "SET LOCAL can only be used in transaction blocks"
1 parent df22eae commit 61c809c

4 files changed

Lines changed: 486 additions & 297 deletions

File tree

MiniMediaMetadataAPI.Application/Repositories/DeezerRepository.cs

Lines changed: 114 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -23,33 +23,47 @@ FROM deezer_artist da
2323
where lower(da.name) % lower(@name)";
2424

2525
await using var conn = new NpgsqlConnection(_databaseConfiguration.ConnectionString);
26-
27-
var results = await conn
28-
.QueryAsync<DeezerArtistModel, DeezerArtistImageLinkModel, DeezerArtistModel>(query,
29-
(artist, imageModel) =>
30-
{
31-
if (artist.Images == null)
32-
{
33-
artist.Images = new List<DeezerArtistImageLinkModel>();
34-
}
26+
await conn.OpenAsync();
27+
var transaction = await conn.BeginTransactionAsync();
28+
IEnumerable<DeezerArtistModel>? results = null;
3529

36-
if (imageModel != null)
30+
try
31+
{
32+
results = await conn
33+
.QueryAsync<DeezerArtistModel, DeezerArtistImageLinkModel, DeezerArtistModel>(query,
34+
(artist, imageModel) =>
3735
{
38-
artist.Images.Add(imageModel);
39-
}
36+
if (artist.Images == null)
37+
{
38+
artist.Images = new List<DeezerArtistImageLinkModel>();
39+
}
4040

41-
return artist;
42-
},
43-
splitOn: "artistid",
44-
param: new
45-
{
46-
name,
47-
offset
48-
});
41+
if (imageModel != null)
42+
{
43+
artist.Images.Add(imageModel);
44+
}
45+
46+
return artist;
47+
},
48+
splitOn: "artistid",
49+
param: new
50+
{
51+
name,
52+
offset
53+
});
54+
}
55+
catch (Exception ex)
56+
{
57+
Console.WriteLine(ex.Message + "\r\n" + ex.StackTrace);
58+
}
59+
finally
60+
{
61+
await transaction.CommitAsync();
62+
}
4963

5064
var groupedResult = results
51-
.GroupBy(artist => artist.ArtistId)
52-
.Select(group =>
65+
?.GroupBy(artist => artist.ArtistId)
66+
?.Select(group =>
5367
{
5468
var artist = group.First();
5569
artist.Images = group.SelectMany(image => image.Images).ToList();
@@ -139,34 +153,49 @@ FROM deezer_album album
139153
and lower(album.title) % lower(@albumName)";
140154

141155
await using var conn = new NpgsqlConnection(_databaseConfiguration.ConnectionString);
156+
await conn.OpenAsync();
157+
var transaction = await conn.BeginTransactionAsync();
158+
IEnumerable<DeezerAlbumModel>? results = null;
142159

143-
var results = await conn
144-
.QueryAsync<DeezerAlbumModel, DeezerArtistModel, DeezerAlbumImageLinkModel?, DeezerAlbumArtistModel?, DeezerAlbumModel>(query,
145-
(album, artist, imageModel, albumArtist) =>
146-
{
147-
album.Artist = artist;
148-
149-
if (imageModel != null)
160+
try
161+
{
162+
results = await conn
163+
.QueryAsync<DeezerAlbumModel, DeezerArtistModel, DeezerAlbumImageLinkModel?, DeezerAlbumArtistModel?, DeezerAlbumModel>(query,
164+
(album, artist, imageModel, albumArtist) =>
150165
{
151-
album.Images.Add(imageModel);
152-
}
153-
if (albumArtist != null)
166+
album.Artist = artist;
167+
168+
if (imageModel != null)
169+
{
170+
album.Images.Add(imageModel);
171+
}
172+
if (albumArtist != null)
173+
{
174+
album.Artists.Add(albumArtist);
175+
}
176+
return album;
177+
},
178+
splitOn: "albumid,artistid,albumid,albumid",
179+
param: new
154180
{
155-
album.Artists.Add(albumArtist);
156-
}
157-
return album;
158-
},
159-
splitOn: "albumid,artistid,albumid,albumid",
160-
param: new
161-
{
162-
albumName,
163-
artistId,
164-
offset
165-
});
181+
albumName,
182+
artistId,
183+
offset
184+
},
185+
transaction: transaction);
186+
}
187+
catch (Exception ex)
188+
{
189+
Console.WriteLine(ex.Message + "\r\n" + ex.StackTrace);
190+
}
191+
finally
192+
{
193+
await transaction.CommitAsync();
194+
}
166195

167196
var groupedResult = results
168-
.GroupBy(album => album.AlbumId)
169-
.Select(group =>
197+
?.GroupBy(album => album.AlbumId)
198+
?.Select(group =>
170199
{
171200
var album = group.First();
172201

@@ -316,38 +345,53 @@ FROM deezer_track dt
316345
where lower(dt.Title) % lower(@trackName)";
317346

318347
await using var conn = new NpgsqlConnection(_databaseConfiguration.ConnectionString);
348+
await conn.OpenAsync();
349+
var transaction = await conn.BeginTransactionAsync();
350+
IEnumerable<DeezerTrackModel>? results = null;
319351

320-
var results = await conn
321-
.QueryAsync<DeezerTrackModel,
322-
DeezerAlbumModel,
323-
DeezerTrackArtistModel,
324-
DeezerTrackModel>(query,
325-
(track, album, trackArtist) =>
326-
{
327-
if (track.Artists == null)
352+
try
353+
{
354+
results = await conn
355+
.QueryAsync<DeezerTrackModel,
356+
DeezerAlbumModel,
357+
DeezerTrackArtistModel,
358+
DeezerTrackModel>(query,
359+
(track, album, trackArtist) =>
328360
{
329-
track.Artists = new List<DeezerTrackArtistModel>();
330-
}
361+
if (track.Artists == null)
362+
{
363+
track.Artists = new List<DeezerTrackArtistModel>();
364+
}
331365

332-
track.Album = album;
366+
track.Album = album;
333367

334-
if (trackArtist != null)
368+
if (trackArtist != null)
369+
{
370+
track.Artists.Add(trackArtist);
371+
}
372+
return track;
373+
},
374+
splitOn: "trackid,albumid,ArtistId",
375+
param: new
335376
{
336-
track.Artists.Add(trackArtist);
337-
}
338-
return track;
339-
},
340-
splitOn: "trackid,albumid,ArtistId",
341-
param: new
342-
{
343-
trackName,
344-
artistId,
345-
offset
346-
});
377+
trackName,
378+
artistId,
379+
offset
380+
},
381+
transaction: transaction);
382+
}
383+
catch (Exception ex)
384+
{
385+
Console.WriteLine(ex.Message + "\r\n" + ex.StackTrace);
386+
}
387+
finally
388+
{
389+
await transaction.CommitAsync();
390+
}
347391

348392
var groupedResult = results
349-
.GroupBy(track => track.TrackId)
350-
.Select(group =>
393+
?.GroupBy(track => track.TrackId)
394+
?.Select(group =>
351395
{
352396
var track = group.First();
353397

0 commit comments

Comments
 (0)