mirror of
https://github.com/claunia/romrepomgr.git
synced 2025-12-16 19:24:51 +00:00
[Refactor] Replace object lock with static Lock in DatImporter for improved thread safety
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user