[Refactor] Replace object lock with static Lock in DatImporter for improved thread safety

This commit is contained in:
2025-07-14 16:42:36 +01:00
parent d92707d691
commit dcade0fcc0

View File

@@ -30,6 +30,7 @@ using System.Diagnostics;
using System.Globalization; using System.Globalization;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading;
using Aaru.Checksums; using Aaru.Checksums;
using EFCore.BulkExtensions; using EFCore.BulkExtensions;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
@@ -53,7 +54,7 @@ namespace RomRepoMgr.Core.Workers;
public sealed class DatImporter public sealed class DatImporter
{ {
private static readonly object _dbLock = new(); static readonly Lock DbLock = new();
readonly string _category; readonly string _category;
readonly string _datFilesPath; readonly string _datFilesPath;
readonly string _datPath; readonly string _datPath;
@@ -133,7 +134,7 @@ public sealed class DatImporter
Category = _category Category = _category
}; };
lock(_dbLock) lock(DbLock)
{ {
ctx.RomSets.Add(romSet); ctx.RomSets.Add(romSet);
ctx.SaveChanges(); ctx.SaveChanges();
@@ -171,7 +172,7 @@ public sealed class DatImporter
Maximum = machineNames.Count Maximum = machineNames.Count
}); });
var position = 0; int position = 0;
var machines = new Dictionary<string, Machine>(); var machines = new Dictionary<string, Machine>();
foreach(string name in machineNames) foreach(string name in machineNames)
@@ -203,7 +204,7 @@ public sealed class DatImporter
SetIndeterminateProgress?.Invoke(this, System.EventArgs.Empty); SetIndeterminateProgress?.Invoke(this, System.EventArgs.Empty);
lock(_dbLock) lock(DbLock)
{ {
ctx.BulkInsert(machines.Values.ToList(), b => b.SetOutputIdentity = true); ctx.BulkInsert(machines.Values.ToList(), b => b.SetOutputIdentity = true);
ctx.SaveChanges(); ctx.SaveChanges();
@@ -219,29 +220,29 @@ public sealed class DatImporter
var disks = new List<Disk>(); var disks = new List<Disk>();
var medias = new List<Media>(); var medias = new List<Media>();
var tmpRomCrc32Table = Guid.NewGuid().ToString(); string tmpRomCrc32Table = Guid.NewGuid().ToString();
var tmpRomMd5Table = Guid.NewGuid().ToString(); string tmpRomMd5Table = Guid.NewGuid().ToString();
var tmpRomSha1Table = Guid.NewGuid().ToString(); string tmpRomSha1Table = Guid.NewGuid().ToString();
var tmpRomSha256Table = Guid.NewGuid().ToString(); string tmpRomSha256Table = Guid.NewGuid().ToString();
var tmpRomSha384Table = Guid.NewGuid().ToString(); string tmpRomSha384Table = Guid.NewGuid().ToString();
var tmpRomSha512Table = Guid.NewGuid().ToString(); string tmpRomSha512Table = Guid.NewGuid().ToString();
var tmpDiskMd5Table = Guid.NewGuid().ToString(); string tmpDiskMd5Table = Guid.NewGuid().ToString();
var tmpDiskSha1Table = Guid.NewGuid().ToString(); string tmpDiskSha1Table = Guid.NewGuid().ToString();
var tmpMediaMd5Table = Guid.NewGuid().ToString(); string tmpMediaMd5Table = Guid.NewGuid().ToString();
var tmpMediaSha1Table = Guid.NewGuid().ToString(); string tmpMediaSha1Table = Guid.NewGuid().ToString();
var tmpMediaSha256Table = Guid.NewGuid().ToString(); string tmpMediaSha256Table = Guid.NewGuid().ToString();
var romsHaveCrc = false; bool romsHaveCrc = false;
var romsHaveMd5 = false; bool romsHaveMd5 = false;
var romsHaveSha1 = false; bool romsHaveSha1 = false;
var romsHaveSha256 = false; bool romsHaveSha256 = false;
var romsHaveSha384 = false; bool romsHaveSha384 = false;
var romsHaveSha512 = false; bool romsHaveSha512 = false;
var disksHaveMd5 = false; bool disksHaveMd5 = false;
var disksHaveSha1 = false; bool disksHaveSha1 = false;
var mediasHaveMd5 = false; bool mediasHaveMd5 = false;
var mediasHaveSha1 = false; bool mediasHaveSha1 = false;
var mediasHaveSha256 = false; bool mediasHaveSha256 = false;
DbConnection dbConnection = ctx.Database.GetDbConnection(); DbConnection dbConnection = ctx.Database.GetDbConnection();
dbConnection.Open(); dbConnection.Open();
@@ -267,7 +268,7 @@ public sealed class DatImporter
Dictionary<string, DbMedia> pendingMediasBySha1; Dictionary<string, DbMedia> pendingMediasBySha1;
Dictionary<string, DbMedia> pendingMediasBySha256; Dictionary<string, DbMedia> pendingMediasBySha256;
lock(_dbLock) lock(DbLock)
{ {
using(DbTransaction dbTransaction = dbConnection.BeginTransaction()) using(DbTransaction dbTransaction = dbConnection.BeginTransaction())
{ {
@@ -587,7 +588,7 @@ public sealed class DatImporter
pendingFilesBySha384List.Clear(); pendingFilesBySha384List.Clear();
pendingFilesBySha512List.Clear(); pendingFilesBySha512List.Clear();
lock(_dbLock) lock(DbLock)
{ {
ctx.Database.ExecuteSqlRaw($"DROP TABLE [{tmpRomCrc32Table}]"); ctx.Database.ExecuteSqlRaw($"DROP TABLE [{tmpRomCrc32Table}]");
ctx.Database.ExecuteSqlRaw($"DROP TABLE [{tmpRomMd5Table}]"); ctx.Database.ExecuteSqlRaw($"DROP TABLE [{tmpRomMd5Table}]");
@@ -622,7 +623,7 @@ public sealed class DatImporter
foreach(Rom rom in roms) foreach(Rom rom in roms)
{ {
var hashCollision = false; bool hashCollision = false;
SetProgress?.Invoke(this, SetProgress?.Invoke(this,
new ProgressEventArgs new ProgressEventArgs
@@ -644,7 +645,7 @@ public sealed class DatImporter
return; return;
} }
var uSize = (ulong)rom.GetInt64FieldValue(SabreTools.Models.Metadata.Rom.SizeKey); ulong uSize = (ulong)rom.GetInt64FieldValue(SabreTools.Models.Metadata.Rom.SizeKey);
DbFile file = null; DbFile file = null;
@@ -904,7 +905,7 @@ public sealed class DatImporter
SetIndeterminateProgress?.Invoke(this, System.EventArgs.Empty); SetIndeterminateProgress?.Invoke(this, System.EventArgs.Empty);
lock(_dbLock) lock(DbLock)
{ {
ctx.BulkInsert(newFiles, b => b.SetOutputIdentity = true); ctx.BulkInsert(newFiles, b => b.SetOutputIdentity = true);
} }
@@ -915,7 +916,7 @@ public sealed class DatImporter
fbm.MachineId = fbm.Machine.Id; fbm.MachineId = fbm.Machine.Id;
} }
lock(_dbLock) lock(DbLock)
{ {
ctx.BulkInsert(newFilesByMachine); ctx.BulkInsert(newFilesByMachine);
@@ -1043,7 +1044,7 @@ public sealed class DatImporter
SetIndeterminateProgress?.Invoke(this, System.EventArgs.Empty); SetIndeterminateProgress?.Invoke(this, System.EventArgs.Empty);
lock(_dbLock) lock(DbLock)
{ {
ctx.BulkInsert(newDisks, b => b.SetOutputIdentity = true); ctx.BulkInsert(newDisks, b => b.SetOutputIdentity = true);
} }
@@ -1054,7 +1055,7 @@ public sealed class DatImporter
dbm.MachineId = dbm.Machine.Id; dbm.MachineId = dbm.Machine.Id;
} }
lock(_dbLock) lock(DbLock)
{ {
ctx.BulkInsert(newDisksByMachine); ctx.BulkInsert(newDisksByMachine);
@@ -1196,7 +1197,7 @@ public sealed class DatImporter
SetIndeterminateProgress?.Invoke(this, System.EventArgs.Empty); SetIndeterminateProgress?.Invoke(this, System.EventArgs.Empty);
lock(_dbLock) lock(DbLock)
{ {
ctx.BulkInsert(newMedias, b => b.SetOutputIdentity = true); ctx.BulkInsert(newMedias, b => b.SetOutputIdentity = true);
} }
@@ -1207,7 +1208,7 @@ public sealed class DatImporter
mbm.MachineId = mbm.Machine.Id; mbm.MachineId = mbm.Machine.Id;
} }
lock(_dbLock) lock(DbLock)
{ {
ctx.BulkInsert(newMediasByMachine); ctx.BulkInsert(newMediasByMachine);
@@ -1221,7 +1222,7 @@ public sealed class DatImporter
newMediasByMachine.Clear(); newMediasByMachine.Clear();
RomSetStat stats; RomSetStat stats;
lock(_dbLock) lock(DbLock)
{ {
stats = ctx.RomSets.Where(r => r.Id == romSet.Id) stats = ctx.RomSets.Where(r => r.Id == romSet.Id)
.Select(r => new RomSetStat .Select(r => new RomSetStat