2020-08-22 04:40:39 +01:00
|
|
|
/******************************************************************************
|
|
|
|
|
// RomRepoMgr - ROM repository manager
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
//
|
|
|
|
|
// Author(s) : Natalia Portillo <claunia@claunia.com>
|
|
|
|
|
//
|
|
|
|
|
// --[ License ] --------------------------------------------------------------
|
|
|
|
|
//
|
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
|
|
|
// it under the terms of the GNU General Public License as
|
|
|
|
|
// published by the Free Software Foundation, either version 3 of the
|
|
|
|
|
// License, or (at your option) any later version.
|
|
|
|
|
//
|
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
|
//
|
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
//
|
|
|
|
|
// ----------------------------------------------------------------------------
|
2024-11-08 19:13:57 +00:00
|
|
|
// Copyright © 2020-2024 Natalia Portillo
|
2020-08-22 04:40:39 +01:00
|
|
|
*******************************************************************************/
|
|
|
|
|
|
|
|
|
|
using System;
|
2020-08-22 14:20:59 +01:00
|
|
|
using System.Collections.Generic;
|
2020-09-07 00:03:09 +01:00
|
|
|
using System.Data.Common;
|
2020-08-22 04:40:39 +01:00
|
|
|
using System.Diagnostics;
|
2020-09-06 19:09:35 +01:00
|
|
|
using System.Globalization;
|
2020-08-22 05:14:52 +01:00
|
|
|
using System.IO;
|
2020-08-22 14:20:59 +01:00
|
|
|
using System.Linq;
|
2025-07-14 16:42:36 +01:00
|
|
|
using System.Threading;
|
2020-09-06 17:24:32 +01:00
|
|
|
using EFCore.BulkExtensions;
|
2020-09-07 00:03:09 +01:00
|
|
|
using Microsoft.EntityFrameworkCore;
|
2025-07-24 21:23:53 +01:00
|
|
|
using Microsoft.Extensions.Logging;
|
2025-07-24 15:46:20 +01:00
|
|
|
using RomRepoMgr.Core.Checksums;
|
2020-08-22 04:40:39 +01:00
|
|
|
using RomRepoMgr.Core.EventArgs;
|
2020-08-22 13:44:40 +01:00
|
|
|
using RomRepoMgr.Core.Models;
|
2020-08-30 03:00:14 +01:00
|
|
|
using RomRepoMgr.Core.Resources;
|
2020-08-22 05:40:50 +01:00
|
|
|
using RomRepoMgr.Database;
|
|
|
|
|
using RomRepoMgr.Database.Models;
|
2020-12-20 23:17:18 +00:00
|
|
|
using SabreTools.DatFiles;
|
2025-07-07 20:45:13 +01:00
|
|
|
using SabreTools.DatTools;
|
2024-11-10 06:42:15 +00:00
|
|
|
using SabreTools.Models.Metadata;
|
|
|
|
|
using DatItem = SabreTools.DatItems.DatItem;
|
|
|
|
|
using Disk = SabreTools.DatItems.Formats.Disk;
|
2020-08-22 05:14:52 +01:00
|
|
|
using ErrorEventArgs = RomRepoMgr.Core.EventArgs.ErrorEventArgs;
|
2024-11-10 06:42:15 +00:00
|
|
|
using File = System.IO.File;
|
2020-08-22 17:14:52 +01:00
|
|
|
using Machine = RomRepoMgr.Database.Models.Machine;
|
2024-11-10 06:42:15 +00:00
|
|
|
using Media = SabreTools.DatItems.Formats.Media;
|
|
|
|
|
using Rom = SabreTools.DatItems.Formats.Rom;
|
2020-08-22 04:40:39 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
namespace RomRepoMgr.Core.Workers;
|
|
|
|
|
|
|
|
|
|
public sealed class DatImporter
|
2020-08-22 04:40:39 +01:00
|
|
|
{
|
2025-07-24 21:23:53 +01:00
|
|
|
static readonly Lock DbLock = new();
|
|
|
|
|
readonly string _category;
|
|
|
|
|
readonly string _datFilesPath;
|
|
|
|
|
readonly string _datPath;
|
|
|
|
|
readonly ILoggerFactory _loggerFactory;
|
|
|
|
|
bool _aborted;
|
2020-08-22 04:40:39 +01:00
|
|
|
|
2025-07-24 21:23:53 +01:00
|
|
|
public DatImporter(string datPath, string category, ILoggerFactory loggerFactory)
|
2024-11-09 01:37:59 +00:00
|
|
|
{
|
2025-07-24 21:23:53 +01:00
|
|
|
_datPath = datPath;
|
|
|
|
|
_datFilesPath = Path.Combine(Settings.Settings.Current.RepositoryPath, "datfiles");
|
|
|
|
|
_loggerFactory = loggerFactory;
|
2020-09-05 01:52:43 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
if(!string.IsNullOrWhiteSpace(category)) _category = category;
|
|
|
|
|
}
|
2020-08-22 04:40:39 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
public void Import()
|
|
|
|
|
{
|
|
|
|
|
try
|
2020-08-22 04:40:39 +01:00
|
|
|
{
|
2025-07-24 21:23:53 +01:00
|
|
|
using var ctx = Context.Create(Settings.Settings.Current.DatabasePath, _loggerFactory);
|
2020-09-05 02:49:41 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
SetIndeterminateProgress?.Invoke(this, System.EventArgs.Empty);
|
2020-08-22 04:40:39 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
SetMessage?.Invoke(this,
|
|
|
|
|
new MessageEventArgs
|
|
|
|
|
{
|
|
|
|
|
Message = Localization.ParsinDatFile
|
|
|
|
|
});
|
2020-08-22 04:40:39 +01:00
|
|
|
|
2025-07-07 20:45:13 +01:00
|
|
|
DatFile datFile = Parser.ParseStatistics(_datPath);
|
|
|
|
|
Parser.ParseInto(datFile, _datPath, throwOnError: true);
|
2020-08-22 04:40:39 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
SetMessage?.Invoke(this,
|
|
|
|
|
new MessageEventArgs
|
|
|
|
|
{
|
|
|
|
|
Message = Localization.HashingDatFile
|
|
|
|
|
});
|
2020-08-22 05:14:52 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
string datHash = Sha384Context.File(_datPath, out byte[] datHashBinary);
|
2020-08-22 12:38:21 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
string datHash32 = Base32.ToBase32String(datHashBinary);
|
2020-08-22 05:14:52 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
if(!Directory.Exists(_datFilesPath)) Directory.CreateDirectory(_datFilesPath);
|
2020-08-22 05:14:52 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
string compressedDatPath = Path.Combine(_datFilesPath, datHash32 + ".lz");
|
2020-08-22 05:14:52 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
if(File.Exists(compressedDatPath))
|
|
|
|
|
{
|
|
|
|
|
ErrorOccurred?.Invoke(this,
|
|
|
|
|
new ErrorEventArgs
|
|
|
|
|
{
|
|
|
|
|
Message = Localization.DatAlreadyInDatabase
|
|
|
|
|
});
|
2020-08-22 05:14:52 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
return;
|
|
|
|
|
}
|
2020-08-22 05:14:52 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
SetMessage?.Invoke(this,
|
|
|
|
|
new MessageEventArgs
|
|
|
|
|
{
|
|
|
|
|
Message = Localization.AddingDatToDatabase
|
|
|
|
|
});
|
2020-08-22 05:40:50 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
// TODO: Check if there is a hash in database but not in repo
|
2020-08-22 05:40:50 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
var romSet = new RomSet
|
|
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
Author = datFile.Header.GetStringFieldValue(Header.AuthorKey),
|
|
|
|
|
Comment = datFile.Header.GetStringFieldValue(Header.CommentKey),
|
|
|
|
|
Date = datFile.Header.GetStringFieldValue(Header.DateKey),
|
|
|
|
|
Description = datFile.Header.GetStringFieldValue(Header.DescriptionKey),
|
2024-11-09 01:37:59 +00:00
|
|
|
Filename = Path.GetFileName(_datPath),
|
2024-11-10 06:42:15 +00:00
|
|
|
Homepage = datFile.Header.GetStringFieldValue(Header.HomepageKey),
|
|
|
|
|
Name = datFile.Header.GetStringFieldValue(Header.NameKey),
|
2024-11-09 01:37:59 +00:00
|
|
|
Sha384 = datHash,
|
2024-11-10 06:42:15 +00:00
|
|
|
Version = datFile.Header.GetStringFieldValue(Header.VersionKey),
|
2024-11-09 01:37:59 +00:00
|
|
|
CreatedOn = DateTime.UtcNow,
|
|
|
|
|
UpdatedOn = DateTime.UtcNow,
|
|
|
|
|
Category = _category
|
|
|
|
|
};
|
|
|
|
|
|
2025-07-14 16:42:36 +01:00
|
|
|
lock(DbLock)
|
2025-07-11 18:40:14 +01:00
|
|
|
{
|
|
|
|
|
ctx.RomSets.Add(romSet);
|
|
|
|
|
ctx.SaveChanges();
|
|
|
|
|
}
|
2024-11-09 01:37:59 +00:00
|
|
|
|
|
|
|
|
SetMessage?.Invoke(this,
|
|
|
|
|
new MessageEventArgs
|
|
|
|
|
{
|
|
|
|
|
Message = Localization.CompressingDatFile
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var datCompress = new Compression();
|
|
|
|
|
datCompress.SetProgress += SetProgress;
|
|
|
|
|
datCompress.SetProgressBounds += SetProgressBounds;
|
|
|
|
|
datCompress.CompressFile(_datPath, compressedDatPath);
|
|
|
|
|
|
|
|
|
|
SetMessage?.Invoke(this,
|
|
|
|
|
new MessageEventArgs
|
|
|
|
|
{
|
|
|
|
|
Message = Localization.GettingMachineNames
|
|
|
|
|
});
|
|
|
|
|
|
2025-07-07 20:45:13 +01:00
|
|
|
var machineNames = datFile.Items.SortedKeys.Distinct().ToList();
|
2024-11-09 01:37:59 +00:00
|
|
|
|
|
|
|
|
SetMessage?.Invoke(this,
|
|
|
|
|
new MessageEventArgs
|
|
|
|
|
{
|
|
|
|
|
Message = Localization.AddingMachines
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
SetProgressBounds?.Invoke(this,
|
|
|
|
|
new ProgressBoundsEventArgs
|
|
|
|
|
{
|
|
|
|
|
Minimum = 0,
|
|
|
|
|
Maximum = machineNames.Count
|
|
|
|
|
});
|
|
|
|
|
|
2025-07-27 17:32:31 +01:00
|
|
|
int position = 0;
|
2024-11-09 01:37:59 +00:00
|
|
|
var machines = new Dictionary<string, Machine>();
|
|
|
|
|
|
|
|
|
|
foreach(string name in machineNames)
|
|
|
|
|
{
|
|
|
|
|
SetProgress?.Invoke(this,
|
|
|
|
|
new ProgressEventArgs
|
|
|
|
|
{
|
|
|
|
|
Value = position
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var machine = new Machine
|
2020-08-22 05:40:50 +01:00
|
|
|
{
|
2024-11-09 01:37:59 +00:00
|
|
|
Name = name,
|
|
|
|
|
RomSetId = romSet.Id,
|
|
|
|
|
CreatedOn = DateTime.UtcNow,
|
|
|
|
|
UpdatedOn = DateTime.UtcNow
|
2020-08-22 05:40:50 +01:00
|
|
|
};
|
|
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
machines[name] = machine;
|
2020-08-22 05:40:50 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
position++;
|
|
|
|
|
}
|
2020-08-22 05:14:52 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
SetMessage?.Invoke(this,
|
|
|
|
|
new MessageEventArgs
|
|
|
|
|
{
|
|
|
|
|
Message = Localization.SavingChangesToDatabase
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
SetIndeterminateProgress?.Invoke(this, System.EventArgs.Empty);
|
|
|
|
|
|
2025-07-14 16:42:36 +01:00
|
|
|
lock(DbLock)
|
2025-07-11 18:40:14 +01:00
|
|
|
{
|
|
|
|
|
ctx.BulkInsert(machines.Values.ToList(), b => b.SetOutputIdentity = true);
|
|
|
|
|
ctx.SaveChanges();
|
|
|
|
|
}
|
2024-11-09 01:37:59 +00:00
|
|
|
|
|
|
|
|
SetMessage?.Invoke(this,
|
|
|
|
|
new MessageEventArgs
|
|
|
|
|
{
|
|
|
|
|
Message = Localization.RetrievingRomsAndDisks
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var roms = new List<Rom>();
|
|
|
|
|
var disks = new List<Disk>();
|
|
|
|
|
var medias = new List<Media>();
|
|
|
|
|
|
2025-07-27 17:32:31 +01:00
|
|
|
string tmpRomCrc32Table = Guid.NewGuid().ToString();
|
|
|
|
|
string tmpRomMd5Table = Guid.NewGuid().ToString();
|
|
|
|
|
string tmpRomSha1Table = Guid.NewGuid().ToString();
|
|
|
|
|
string tmpRomSha256Table = Guid.NewGuid().ToString();
|
|
|
|
|
string tmpRomSha384Table = Guid.NewGuid().ToString();
|
|
|
|
|
string tmpRomSha512Table = Guid.NewGuid().ToString();
|
|
|
|
|
string tmpDiskMd5Table = Guid.NewGuid().ToString();
|
|
|
|
|
string tmpDiskSha1Table = Guid.NewGuid().ToString();
|
|
|
|
|
string tmpMediaMd5Table = Guid.NewGuid().ToString();
|
|
|
|
|
string tmpMediaSha1Table = Guid.NewGuid().ToString();
|
|
|
|
|
string tmpMediaSha256Table = Guid.NewGuid().ToString();
|
|
|
|
|
|
|
|
|
|
bool romsHaveCrc = false;
|
|
|
|
|
bool romsHaveMd5 = false;
|
|
|
|
|
bool romsHaveSha1 = false;
|
|
|
|
|
bool romsHaveSha256 = false;
|
|
|
|
|
bool romsHaveSha384 = false;
|
|
|
|
|
bool romsHaveSha512 = false;
|
|
|
|
|
bool disksHaveMd5 = false;
|
|
|
|
|
bool disksHaveSha1 = false;
|
|
|
|
|
bool mediasHaveMd5 = false;
|
|
|
|
|
bool mediasHaveSha1 = false;
|
|
|
|
|
bool mediasHaveSha256 = false;
|
2024-11-09 01:37:59 +00:00
|
|
|
|
|
|
|
|
DbConnection dbConnection = ctx.Database.GetDbConnection();
|
|
|
|
|
dbConnection.Open();
|
|
|
|
|
|
|
|
|
|
position = 0;
|
|
|
|
|
|
|
|
|
|
SetProgressBounds?.Invoke(this,
|
|
|
|
|
new ProgressBoundsEventArgs
|
|
|
|
|
{
|
|
|
|
|
Minimum = 0,
|
2025-07-07 20:45:13 +01:00
|
|
|
Maximum = datFile.Items.SortedKeys.Length
|
2024-11-09 01:37:59 +00:00
|
|
|
});
|
|
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
List<DbFile> pendingFilesByCrcList;
|
|
|
|
|
List<DbFile> pendingFilesByMd5List;
|
|
|
|
|
List<DbFile> pendingFilesBySha1List;
|
|
|
|
|
List<DbFile> pendingFilesBySha256List;
|
|
|
|
|
List<DbFile> pendingFilesBySha384List;
|
|
|
|
|
List<DbFile> pendingFilesBySha512List;
|
|
|
|
|
Dictionary<string, DbDisk> pendingDisksByMd5;
|
|
|
|
|
Dictionary<string, DbDisk> pendingDisksBySha1;
|
|
|
|
|
Dictionary<string, DbMedia> pendingMediasByMd5;
|
|
|
|
|
Dictionary<string, DbMedia> pendingMediasBySha1;
|
|
|
|
|
Dictionary<string, DbMedia> pendingMediasBySha256;
|
|
|
|
|
|
2025-07-14 16:42:36 +01:00
|
|
|
lock(DbLock)
|
2024-11-09 01:37:59 +00:00
|
|
|
{
|
2025-07-11 18:40:14 +01:00
|
|
|
using(DbTransaction dbTransaction = dbConnection.BeginTransaction())
|
|
|
|
|
{
|
|
|
|
|
DbCommand dbcc = dbConnection.CreateCommand();
|
2020-08-22 14:20:59 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.CommandText =
|
|
|
|
|
$"CREATE TABLE \"{tmpRomCrc32Table}\" (\"Size\" INTEGER NOT NULL, \"Crc32\" TEXT NOT NULL);";
|
2020-08-22 14:20:59 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.ExecuteNonQuery();
|
|
|
|
|
dbcc = dbConnection.CreateCommand();
|
2020-08-22 14:20:59 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.CommandText =
|
|
|
|
|
$"CREATE TABLE \"{tmpRomMd5Table}\" (\"Size\" INTEGER NOT NULL, \"Md5\" TEXT NOT NULL);";
|
2020-08-22 14:20:59 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.ExecuteNonQuery();
|
|
|
|
|
dbcc = dbConnection.CreateCommand();
|
2020-08-22 14:20:59 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.CommandText =
|
|
|
|
|
$"CREATE TABLE \"{tmpRomSha1Table}\" (\"Size\" INTEGER NOT NULL, \"Sha1\" TEXT NOT NULL);";
|
2020-08-22 14:20:59 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.ExecuteNonQuery();
|
|
|
|
|
dbcc = dbConnection.CreateCommand();
|
2020-08-22 14:20:59 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.CommandText =
|
|
|
|
|
$"CREATE TABLE \"{tmpRomSha256Table}\" (\"Size\" INTEGER NOT NULL, \"Sha256\" TEXT NOT NULL);";
|
2020-08-22 14:20:59 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.ExecuteNonQuery();
|
|
|
|
|
dbcc = dbConnection.CreateCommand();
|
2020-08-22 14:20:59 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.CommandText =
|
|
|
|
|
$"CREATE TABLE \"{tmpRomSha384Table}\" (\"Size\" INTEGER NOT NULL, \"Sha384\" TEXT NOT NULL);";
|
2020-08-22 14:20:59 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.ExecuteNonQuery();
|
|
|
|
|
dbcc = dbConnection.CreateCommand();
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.CommandText =
|
|
|
|
|
$"CREATE TABLE \"{tmpRomSha512Table}\" (\"Size\" INTEGER NOT NULL, \"Sha512\" TEXT NOT NULL);";
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.ExecuteNonQuery();
|
|
|
|
|
dbcc = dbConnection.CreateCommand();
|
|
|
|
|
dbcc.CommandText = $"CREATE TABLE \"{tmpDiskMd5Table}\" (\"Md5\" TEXT NOT NULL);";
|
|
|
|
|
dbcc.ExecuteNonQuery();
|
|
|
|
|
dbcc = dbConnection.CreateCommand();
|
|
|
|
|
dbcc.CommandText = $"CREATE TABLE \"{tmpDiskSha1Table}\" (\"Sha1\" TEXT NOT NULL);";
|
|
|
|
|
dbcc.ExecuteNonQuery();
|
|
|
|
|
dbcc = dbConnection.CreateCommand();
|
|
|
|
|
dbcc.CommandText = $"CREATE TABLE \"{tmpMediaMd5Table}\" (\"Md5\" TEXT NOT NULL);";
|
|
|
|
|
dbcc.ExecuteNonQuery();
|
|
|
|
|
dbcc = dbConnection.CreateCommand();
|
|
|
|
|
dbcc.CommandText = $"CREATE TABLE \"{tmpMediaSha1Table}\" (\"Sha1\" TEXT NOT NULL);";
|
|
|
|
|
dbcc.ExecuteNonQuery();
|
|
|
|
|
dbcc = dbConnection.CreateCommand();
|
|
|
|
|
dbcc.CommandText = $"CREATE TABLE \"{tmpMediaSha256Table}\" (\"Sha256\" TEXT NOT NULL);";
|
|
|
|
|
dbcc.ExecuteNonQuery();
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
foreach(string key in datFile.Items.SortedKeys)
|
2020-08-22 17:14:52 +01:00
|
|
|
{
|
2025-07-11 18:40:14 +01:00
|
|
|
SetProgress?.Invoke(this,
|
|
|
|
|
new ProgressEventArgs
|
|
|
|
|
{
|
|
|
|
|
Value = position
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
foreach(DatItem item in datFile.GetItemsForBucket(key))
|
2020-09-07 00:03:09 +01:00
|
|
|
{
|
2025-07-11 18:40:14 +01:00
|
|
|
switch(item)
|
|
|
|
|
{
|
|
|
|
|
case Rom rom:
|
|
|
|
|
if(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.CRCKey) != null)
|
|
|
|
|
{
|
|
|
|
|
dbcc = dbConnection.CreateCommand();
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.CommandText =
|
|
|
|
|
$"INSERT INTO \"{tmpRomCrc32Table}\" (\"Size\", \"Crc32\") VALUES (\"{(ulong)rom.GetInt64FieldValue(SabreTools.Models.Metadata.Rom.SizeKey)}\", \"{rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.CRCKey)}\");";
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.ExecuteNonQuery();
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
romsHaveCrc = true;
|
|
|
|
|
}
|
2020-09-11 01:50:31 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
if(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.MD5Key) != null)
|
|
|
|
|
{
|
|
|
|
|
dbcc = dbConnection.CreateCommand();
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.CommandText =
|
|
|
|
|
$"INSERT INTO \"{tmpRomMd5Table}\" (\"Size\", \"Md5\") VALUES (\"{(ulong)rom.GetInt64FieldValue(SabreTools.Models.Metadata.Rom.SizeKey)}\", \"{rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.MD5Key)}\");";
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.ExecuteNonQuery();
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
romsHaveMd5 = true;
|
|
|
|
|
}
|
2020-09-11 01:50:31 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
if(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key) != null)
|
|
|
|
|
{
|
|
|
|
|
dbcc = dbConnection.CreateCommand();
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.CommandText =
|
|
|
|
|
$"INSERT INTO \"{tmpRomSha1Table}\" (\"Size\", \"Sha1\") VALUES (\"{(ulong)rom.GetInt64FieldValue(SabreTools.Models.Metadata.Rom.SizeKey)}\", \"{rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key)}\");";
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.ExecuteNonQuery();
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
romsHaveSha1 = true;
|
|
|
|
|
}
|
2020-09-11 01:50:31 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
if(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA256Key) != null)
|
|
|
|
|
{
|
|
|
|
|
dbcc = dbConnection.CreateCommand();
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.CommandText =
|
|
|
|
|
$"INSERT INTO \"{tmpRomSha256Table}\" (\"Size\", \"Sha256\") VALUES (\"{(ulong)rom.GetInt64FieldValue(SabreTools.Models.Metadata.Rom.SizeKey)}\", \"{rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA256Key)}\");";
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.ExecuteNonQuery();
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
romsHaveSha256 = true;
|
|
|
|
|
}
|
2020-09-11 01:50:31 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
if(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA384Key) != null)
|
|
|
|
|
{
|
|
|
|
|
dbcc = dbConnection.CreateCommand();
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.CommandText =
|
|
|
|
|
$"INSERT INTO \"{tmpRomSha384Table}\" (\"Size\", \"Sha384\") VALUES (\"{(ulong)rom.GetInt64FieldValue(SabreTools.Models.Metadata.Rom.SizeKey)}\", \"{rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA384Key)}\");";
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.ExecuteNonQuery();
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
romsHaveSha384 = true;
|
|
|
|
|
}
|
2020-09-11 01:50:31 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
if(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA512Key) != null)
|
|
|
|
|
{
|
|
|
|
|
dbcc = dbConnection.CreateCommand();
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.CommandText =
|
|
|
|
|
$"INSERT INTO \"{tmpRomSha512Table}\" (\"Size\", \"Sha512\") VALUES (\"{(ulong)rom.GetInt64FieldValue(SabreTools.Models.Metadata.Rom.SizeKey)}\", \"{rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA512Key)}\");";
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.ExecuteNonQuery();
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
romsHaveSha512 = true;
|
|
|
|
|
}
|
2020-09-11 01:50:31 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
roms.Add(rom);
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
continue;
|
|
|
|
|
case Disk disk:
|
|
|
|
|
if(disk.GetStringFieldValue(SabreTools.Models.Metadata.Disk.MD5Key) != null)
|
|
|
|
|
{
|
|
|
|
|
dbcc = dbConnection.CreateCommand();
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.CommandText =
|
|
|
|
|
$"INSERT INTO \"{tmpDiskMd5Table}\" (\"Md5\") VALUES (\"{disk.GetStringFieldValue(SabreTools.Models.Metadata.Disk.MD5Key)}\");";
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.ExecuteNonQuery();
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
disksHaveMd5 = true;
|
|
|
|
|
}
|
2020-09-11 01:50:31 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
if(disk.GetStringFieldValue(SabreTools.Models.Metadata.Disk.SHA1Key) != null)
|
|
|
|
|
{
|
|
|
|
|
dbcc = dbConnection.CreateCommand();
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.CommandText =
|
|
|
|
|
$"INSERT INTO \"{tmpDiskSha1Table}\" (\"Sha1\") VALUES (\"{disk.GetStringFieldValue(SabreTools.Models.Metadata.Disk.SHA1Key)}\");";
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.ExecuteNonQuery();
|
2020-09-11 01:50:31 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
disksHaveSha1 = true;
|
|
|
|
|
}
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
disks.Add(disk);
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
continue;
|
|
|
|
|
case Media media:
|
|
|
|
|
if(media.GetStringFieldValue(SabreTools.Models.Metadata.Media.MD5Key) != null)
|
|
|
|
|
{
|
|
|
|
|
dbcc = dbConnection.CreateCommand();
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.CommandText =
|
|
|
|
|
$"INSERT INTO \"{tmpMediaMd5Table}\" (\"Md5\") VALUES (\"{media.GetStringFieldValue(SabreTools.Models.Metadata.Media.MD5Key)}\");";
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.ExecuteNonQuery();
|
2020-09-11 01:50:31 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
mediasHaveMd5 = true;
|
|
|
|
|
}
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
if(media.GetStringFieldValue(SabreTools.Models.Metadata.Media.SHA1Key) != null)
|
|
|
|
|
{
|
|
|
|
|
dbcc = dbConnection.CreateCommand();
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.CommandText =
|
|
|
|
|
$"INSERT INTO \"{tmpMediaSha1Table}\" (\"Sha1\") VALUES (\"{media.GetStringFieldValue(SabreTools.Models.Metadata.Media.SHA1Key)}\");";
|
2020-09-06 19:09:35 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.ExecuteNonQuery();
|
2020-09-11 01:50:31 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
mediasHaveSha1 = true;
|
|
|
|
|
}
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
if(media.GetStringFieldValue(SabreTools.Models.Metadata.Media.SHA256Key) != null)
|
|
|
|
|
{
|
|
|
|
|
dbcc = dbConnection.CreateCommand();
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.CommandText =
|
|
|
|
|
$"INSERT INTO \"{tmpMediaSha256Table}\" (\"Sha256\") VALUES (\"{media.GetStringFieldValue(SabreTools.Models.Metadata.Media.SHA256Key)}\");";
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbcc.ExecuteNonQuery();
|
2020-09-11 01:50:31 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
mediasHaveSha256 = true;
|
|
|
|
|
}
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
medias.Add(media);
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
continue;
|
|
|
|
|
}
|
2020-08-22 17:14:52 +01:00
|
|
|
}
|
2025-07-11 18:40:14 +01:00
|
|
|
|
|
|
|
|
position++;
|
2020-08-22 17:14:52 +01:00
|
|
|
}
|
2020-09-07 00:03:09 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
SetIndeterminateProgress?.Invoke(this, System.EventArgs.Empty);
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
dbTransaction.Commit();
|
|
|
|
|
}
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
pendingFilesByCrcList = romsHaveCrc
|
|
|
|
|
? ctx.Files
|
|
|
|
|
.FromSqlRaw($"SELECT DISTINCT f.* FROM Files AS f, [{tmpRomCrc32Table}] AS t WHERE f.Crc32 = t.Crc32 AND f.Size = t.Size")
|
|
|
|
|
.ToList()
|
|
|
|
|
: [];
|
|
|
|
|
|
|
|
|
|
pendingFilesByMd5List = romsHaveMd5
|
|
|
|
|
? ctx.Files
|
|
|
|
|
.FromSqlRaw($"SELECT DISTINCT f.* FROM Files AS f, [{tmpRomMd5Table}] AS t WHERE f.Md5 = t.Md5 AND f.Size = t.Size")
|
|
|
|
|
.ToList()
|
|
|
|
|
: [];
|
|
|
|
|
|
|
|
|
|
pendingFilesBySha1List = romsHaveSha1
|
|
|
|
|
? ctx.Files
|
|
|
|
|
.FromSqlRaw($"SELECT DISTINCT f.* FROM Files AS f, [{tmpRomSha1Table}] AS t WHERE f.Sha1 = t.Sha1 AND f.Size = t.Size")
|
|
|
|
|
.ToList()
|
|
|
|
|
: [];
|
|
|
|
|
|
|
|
|
|
pendingFilesBySha256List = romsHaveSha256
|
|
|
|
|
? ctx.Files
|
|
|
|
|
.FromSqlRaw($"SELECT DISTINCT f.* FROM Files AS f, [{tmpRomSha256Table}] AS t WHERE f.Sha256 = t.Sha256 AND f.Size = t.Size")
|
|
|
|
|
.ToList()
|
|
|
|
|
: [];
|
|
|
|
|
|
|
|
|
|
pendingFilesBySha384List = romsHaveSha384
|
|
|
|
|
? ctx.Files
|
|
|
|
|
.FromSqlRaw($"SELECT DISTINCT f.* FROM Files AS f, [{tmpRomSha384Table}] AS t WHERE f.Sha384 = t.Sha384 AND f.Size = t.Size")
|
|
|
|
|
.ToList()
|
|
|
|
|
: [];
|
|
|
|
|
|
|
|
|
|
pendingFilesBySha512List = romsHaveSha512
|
|
|
|
|
? ctx.Files
|
|
|
|
|
.FromSqlRaw($"SELECT DISTINCT f.* FROM Files AS f, [{tmpRomSha512Table}] AS t WHERE f.Sha512 = t.Sha512 AND f.Size = t.Size")
|
|
|
|
|
.ToList()
|
|
|
|
|
: [];
|
|
|
|
|
|
|
|
|
|
pendingDisksByMd5 = disksHaveMd5
|
|
|
|
|
? ctx.Disks
|
|
|
|
|
.FromSqlRaw($"SELECT DISTINCT f.* FROM Disks AS f, [{tmpDiskMd5Table}] AS t WHERE f.Md5 = t.Md5")
|
|
|
|
|
.ToDictionary(f => f.Md5)
|
|
|
|
|
: [];
|
|
|
|
|
|
|
|
|
|
pendingDisksBySha1 = disksHaveSha1
|
|
|
|
|
? ctx.Disks
|
|
|
|
|
.FromSqlRaw($"SELECT DISTINCT f.* FROM Disks AS f, [{tmpDiskSha1Table}] AS t WHERE f.Sha1 = t.Sha1")
|
|
|
|
|
.ToDictionary(f => f.Sha1)
|
|
|
|
|
: [];
|
|
|
|
|
|
|
|
|
|
pendingMediasByMd5 = mediasHaveMd5
|
|
|
|
|
? ctx.Medias
|
|
|
|
|
.FromSqlRaw($"SELECT DISTINCT f.* FROM Medias AS f, [{tmpMediaMd5Table}] AS t WHERE f.Md5 = t.Md5")
|
|
|
|
|
.ToDictionary(f => f.Md5)
|
|
|
|
|
: [];
|
|
|
|
|
|
|
|
|
|
pendingMediasBySha1 = mediasHaveSha1
|
|
|
|
|
? ctx.Medias
|
|
|
|
|
.FromSqlRaw($"SELECT DISTINCT f.* FROM Medias AS f, [{tmpMediaSha1Table}] AS t WHERE f.Sha1 = t.Sha1")
|
|
|
|
|
.ToDictionary(f => f.Sha1)
|
|
|
|
|
: [];
|
|
|
|
|
|
|
|
|
|
pendingMediasBySha256 = mediasHaveSha256
|
|
|
|
|
? ctx.Medias
|
|
|
|
|
.FromSqlRaw($"SELECT DISTINCT f.* FROM Medias AS f, [{tmpMediaSha256Table}] AS t WHERE f.Sha256 = t.Sha256")
|
|
|
|
|
.ToDictionary(f => f.Sha256)
|
|
|
|
|
: [];
|
2024-11-09 01:37:59 +00:00
|
|
|
}
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
var pendingFilesByCrc = new Dictionary<string, DbFile>();
|
|
|
|
|
var pendingFilesByMd5 = new Dictionary<string, DbFile>();
|
|
|
|
|
var pendingFilesBySha1 = new Dictionary<string, DbFile>();
|
|
|
|
|
var pendingFilesBySha256 = new Dictionary<string, DbFile>();
|
|
|
|
|
var pendingFilesBySha384 = new Dictionary<string, DbFile>();
|
|
|
|
|
var pendingFilesBySha512 = new Dictionary<string, DbFile>();
|
|
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
var pendingFiles = pendingFilesByCrcList.Where(item => !pendingFilesByCrc.TryAdd(item.Crc32, item))
|
|
|
|
|
.ToList();
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
pendingFiles.AddRange(pendingFilesByMd5List.Where(item => !pendingFilesByMd5.TryAdd(item.Md5, item)));
|
|
|
|
|
pendingFiles.AddRange(pendingFilesBySha1List.Where(item => !pendingFilesBySha1.TryAdd(item.Sha1, item)));
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
pendingFiles.AddRange(pendingFilesBySha256List.Where(item => !pendingFilesBySha256
|
|
|
|
|
.TryAdd(item.Sha256, item)));
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
pendingFiles.AddRange(pendingFilesBySha384List.Where(item => !pendingFilesBySha384
|
|
|
|
|
.TryAdd(item.Sha384, item)));
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
pendingFiles.AddRange(pendingFilesBySha512List.Where(item => !pendingFilesBySha512
|
|
|
|
|
.TryAdd(item.Sha512, item)));
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
// Clear some memory
|
|
|
|
|
pendingFilesByCrcList.Clear();
|
|
|
|
|
pendingFilesByMd5List.Clear();
|
|
|
|
|
pendingFilesBySha1List.Clear();
|
|
|
|
|
pendingFilesBySha256List.Clear();
|
|
|
|
|
pendingFilesBySha384List.Clear();
|
|
|
|
|
pendingFilesBySha512List.Clear();
|
|
|
|
|
|
2025-07-14 16:42:36 +01:00
|
|
|
lock(DbLock)
|
2025-07-11 18:40:14 +01:00
|
|
|
{
|
|
|
|
|
ctx.Database.ExecuteSqlRaw($"DROP TABLE [{tmpRomCrc32Table}]");
|
|
|
|
|
ctx.Database.ExecuteSqlRaw($"DROP TABLE [{tmpRomMd5Table}]");
|
|
|
|
|
ctx.Database.ExecuteSqlRaw($"DROP TABLE [{tmpRomSha1Table}]");
|
|
|
|
|
ctx.Database.ExecuteSqlRaw($"DROP TABLE [{tmpRomSha256Table}]");
|
|
|
|
|
ctx.Database.ExecuteSqlRaw($"DROP TABLE [{tmpRomSha384Table}]");
|
|
|
|
|
ctx.Database.ExecuteSqlRaw($"DROP TABLE [{tmpRomSha512Table}]");
|
|
|
|
|
ctx.Database.ExecuteSqlRaw($"DROP TABLE [{tmpDiskMd5Table}]");
|
|
|
|
|
ctx.Database.ExecuteSqlRaw($"DROP TABLE [{tmpDiskSha1Table}]");
|
|
|
|
|
ctx.Database.ExecuteSqlRaw($"DROP TABLE [{tmpMediaMd5Table}]");
|
|
|
|
|
ctx.Database.ExecuteSqlRaw($"DROP TABLE [{tmpMediaSha1Table}]");
|
|
|
|
|
ctx.Database.ExecuteSqlRaw($"DROP TABLE [{tmpMediaSha256Table}]");
|
|
|
|
|
}
|
2024-11-09 01:37:59 +00:00
|
|
|
|
|
|
|
|
SetProgressBounds?.Invoke(this,
|
|
|
|
|
new ProgressBoundsEventArgs
|
|
|
|
|
{
|
|
|
|
|
Minimum = 0,
|
|
|
|
|
Maximum = roms.Count
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
SetMessage?.Invoke(this,
|
|
|
|
|
new MessageEventArgs
|
|
|
|
|
{
|
|
|
|
|
Message = Localization.AddingRoms
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
position = 0;
|
|
|
|
|
|
|
|
|
|
var newFiles = new List<DbFile>();
|
|
|
|
|
var newFilesByMachine = new List<FileByMachine>();
|
|
|
|
|
|
|
|
|
|
foreach(Rom rom in roms)
|
|
|
|
|
{
|
2025-07-27 17:32:31 +01:00
|
|
|
bool hashCollision = false;
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
SetProgress?.Invoke(this,
|
|
|
|
|
new ProgressEventArgs
|
|
|
|
|
{
|
|
|
|
|
Value = position
|
|
|
|
|
});
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(!machines.TryGetValue(rom.GetFieldValue<SabreTools.DatItems.Machine>(DatItem.MachineKey)
|
2025-07-07 21:01:48 +01:00
|
|
|
?.GetStringFieldValue(SabreTools.Models.Metadata.Machine.NameKey)
|
|
|
|
|
?.ToLowerInvariant(),
|
2024-11-10 06:42:15 +00:00
|
|
|
out Machine machine))
|
2024-11-09 01:37:59 +00:00
|
|
|
{
|
|
|
|
|
ErrorOccurred?.Invoke(this,
|
|
|
|
|
new ErrorEventArgs
|
|
|
|
|
{
|
|
|
|
|
Message = Localization.FoundRomWithoutMachine
|
|
|
|
|
});
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
return;
|
|
|
|
|
}
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2025-07-27 17:32:31 +01:00
|
|
|
ulong uSize = (ulong)rom.GetInt64FieldValue(SabreTools.Models.Metadata.Rom.SizeKey);
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
DbFile file = null;
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA512Key) != null)
|
2024-11-09 01:37:59 +00:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
if(pendingFilesBySha512.TryGetValue(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom
|
|
|
|
|
.SHA512Key),
|
|
|
|
|
out file))
|
2020-08-22 17:14:52 +01:00
|
|
|
{
|
2024-11-09 01:37:59 +00:00
|
|
|
if(file.Size != uSize)
|
2020-08-22 17:14:52 +01:00
|
|
|
{
|
2024-11-09 01:37:59 +00:00
|
|
|
hashCollision = true;
|
|
|
|
|
file = null;
|
|
|
|
|
}
|
2020-08-22 17:14:52 +01:00
|
|
|
}
|
2024-11-09 01:37:59 +00:00
|
|
|
}
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA384Key) != null && file == null)
|
2024-11-09 01:37:59 +00:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
if(pendingFilesBySha384.TryGetValue(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom
|
|
|
|
|
.SHA384Key),
|
|
|
|
|
out file))
|
2020-08-22 17:14:52 +01:00
|
|
|
{
|
2024-11-09 01:37:59 +00:00
|
|
|
if(file.Size != uSize)
|
|
|
|
|
{
|
|
|
|
|
hashCollision = true;
|
|
|
|
|
file = null;
|
|
|
|
|
}
|
2020-08-22 17:14:52 +01:00
|
|
|
}
|
2024-11-09 01:37:59 +00:00
|
|
|
}
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA256Key) != null && file == null)
|
2024-11-09 01:37:59 +00:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
if(pendingFilesBySha256.TryGetValue(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom
|
|
|
|
|
.SHA256Key),
|
|
|
|
|
out file))
|
2020-08-22 17:14:52 +01:00
|
|
|
{
|
2024-11-09 01:37:59 +00:00
|
|
|
if(file.Size != uSize)
|
|
|
|
|
{
|
|
|
|
|
hashCollision = true;
|
|
|
|
|
file = null;
|
|
|
|
|
}
|
2020-08-22 17:14:52 +01:00
|
|
|
}
|
2024-11-09 01:37:59 +00:00
|
|
|
}
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key) != null && file == null)
|
2024-11-09 01:37:59 +00:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
if(pendingFilesBySha1.TryGetValue(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key),
|
|
|
|
|
out file))
|
2020-08-22 17:14:52 +01:00
|
|
|
{
|
2024-11-09 01:37:59 +00:00
|
|
|
if(file.Size != uSize)
|
|
|
|
|
{
|
|
|
|
|
hashCollision = true;
|
|
|
|
|
file = null;
|
|
|
|
|
}
|
2020-08-22 17:14:52 +01:00
|
|
|
}
|
2024-11-09 01:37:59 +00:00
|
|
|
}
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.MD5Key) != null && file == null)
|
2024-11-09 01:37:59 +00:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
if(pendingFilesByMd5.TryGetValue(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.MD5Key),
|
|
|
|
|
out file))
|
2020-08-22 17:14:52 +01:00
|
|
|
{
|
2024-11-09 01:37:59 +00:00
|
|
|
if(file.Size != uSize)
|
|
|
|
|
{
|
|
|
|
|
hashCollision = true;
|
|
|
|
|
file = null;
|
|
|
|
|
}
|
2020-08-22 17:14:52 +01:00
|
|
|
}
|
2024-11-09 01:37:59 +00:00
|
|
|
}
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.CRCKey) != null && file == null)
|
2024-11-09 01:37:59 +00:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
if(pendingFilesByCrc.TryGetValue(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.CRCKey),
|
|
|
|
|
out file))
|
2020-08-22 17:14:52 +01:00
|
|
|
{
|
2024-11-09 01:37:59 +00:00
|
|
|
if(file.Size != uSize)
|
|
|
|
|
{
|
|
|
|
|
hashCollision = true;
|
|
|
|
|
file = null;
|
|
|
|
|
}
|
2020-08-22 17:14:52 +01:00
|
|
|
}
|
2024-11-09 01:37:59 +00:00
|
|
|
}
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
if(file == null && hashCollision)
|
|
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
if(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA512Key) != null)
|
2024-11-12 06:39:06 +00:00
|
|
|
{
|
2024-11-12 06:46:10 +00:00
|
|
|
file = pendingFiles.Find(f => f.Sha512 ==
|
|
|
|
|
rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom
|
|
|
|
|
.SHA512Key) &&
|
|
|
|
|
f.Size == uSize);
|
2024-11-12 06:39:06 +00:00
|
|
|
}
|
2024-11-10 06:42:15 +00:00
|
|
|
|
|
|
|
|
if(file == null && rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA384Key) != null)
|
2024-11-12 06:39:06 +00:00
|
|
|
{
|
2024-11-12 06:46:10 +00:00
|
|
|
file = pendingFiles.Find(f => f.Sha384 ==
|
|
|
|
|
rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom
|
|
|
|
|
.SHA384Key) &&
|
|
|
|
|
f.Size == uSize);
|
2024-11-12 06:39:06 +00:00
|
|
|
}
|
2024-11-10 06:42:15 +00:00
|
|
|
|
|
|
|
|
if(file == null && rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA256Key) != null)
|
2024-11-12 06:39:06 +00:00
|
|
|
{
|
2024-11-12 06:46:10 +00:00
|
|
|
file = pendingFiles.Find(f => f.Sha256 ==
|
|
|
|
|
rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom
|
|
|
|
|
.SHA256Key) &&
|
|
|
|
|
f.Size == uSize);
|
2024-11-12 06:39:06 +00:00
|
|
|
}
|
2024-11-10 06:42:15 +00:00
|
|
|
|
|
|
|
|
if(file == null && rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key) != null)
|
2024-11-12 06:39:06 +00:00
|
|
|
{
|
2024-11-12 06:46:10 +00:00
|
|
|
file = pendingFiles.Find(f => f.Sha1 ==
|
|
|
|
|
rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key) &&
|
|
|
|
|
f.Size == uSize);
|
2024-11-12 06:39:06 +00:00
|
|
|
}
|
2024-11-10 06:42:15 +00:00
|
|
|
|
|
|
|
|
if(file == null && rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.MD5Key) != null)
|
2024-11-12 06:39:06 +00:00
|
|
|
{
|
2024-11-12 06:46:10 +00:00
|
|
|
file = pendingFiles.Find(f => f.Md5 ==
|
|
|
|
|
rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.MD5Key) &&
|
|
|
|
|
f.Size == uSize);
|
2024-11-12 06:39:06 +00:00
|
|
|
}
|
2024-11-10 06:42:15 +00:00
|
|
|
|
|
|
|
|
if(file == null && rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.CRCKey) != null)
|
2024-11-12 06:39:06 +00:00
|
|
|
{
|
2024-11-12 06:46:10 +00:00
|
|
|
file = pendingFiles.Find(f => f.Crc32 ==
|
|
|
|
|
rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.CRCKey) &&
|
|
|
|
|
f.Size == uSize);
|
2024-11-12 06:39:06 +00:00
|
|
|
}
|
2024-11-09 01:37:59 +00:00
|
|
|
}
|
2020-09-06 20:15:29 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
if(file == null)
|
|
|
|
|
{
|
|
|
|
|
file = new DbFile
|
2020-08-22 17:14:52 +01:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
Crc32 = rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.CRCKey),
|
2024-11-09 01:37:59 +00:00
|
|
|
CreatedOn = DateTime.UtcNow,
|
2024-11-10 06:42:15 +00:00
|
|
|
Md5 = rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.MD5Key),
|
|
|
|
|
Sha1 = rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key),
|
|
|
|
|
Sha256 = rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA256Key),
|
|
|
|
|
Sha384 = rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA384Key),
|
|
|
|
|
Sha512 = rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA512Key),
|
2024-11-09 01:37:59 +00:00
|
|
|
Size = uSize,
|
|
|
|
|
UpdatedOn = DateTime.UtcNow
|
|
|
|
|
};
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
newFiles.Add(file);
|
2020-08-22 17:14:52 +01:00
|
|
|
}
|
|
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(string.IsNullOrEmpty(file.Crc32) &&
|
|
|
|
|
!string.IsNullOrEmpty(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.CRCKey)))
|
2020-08-22 17:14:52 +01:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
file.Crc32 = rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.CRCKey);
|
2024-11-09 01:37:59 +00:00
|
|
|
file.UpdatedOn = DateTime.UtcNow;
|
|
|
|
|
}
|
2020-09-06 17:24:32 +01:00
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(string.IsNullOrEmpty(file.Md5) &&
|
|
|
|
|
!string.IsNullOrEmpty(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.MD5Key)))
|
2020-09-06 17:24:32 +01:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
file.Md5 = rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.MD5Key);
|
2024-11-09 01:37:59 +00:00
|
|
|
file.UpdatedOn = DateTime.UtcNow;
|
2020-09-06 17:24:32 +01:00
|
|
|
}
|
|
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(string.IsNullOrEmpty(file.Sha1) &&
|
|
|
|
|
!string.IsNullOrEmpty(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key)))
|
2024-11-09 01:37:59 +00:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
file.Sha1 = rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA1Key);
|
2024-11-09 01:37:59 +00:00
|
|
|
file.UpdatedOn = DateTime.UtcNow;
|
|
|
|
|
}
|
2020-09-03 19:45:39 +01:00
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(string.IsNullOrEmpty(file.Sha256) &&
|
|
|
|
|
!string.IsNullOrEmpty(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA256Key)))
|
2024-11-09 01:37:59 +00:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
file.Sha256 = rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA256Key);
|
2024-11-09 01:37:59 +00:00
|
|
|
file.UpdatedOn = DateTime.UtcNow;
|
|
|
|
|
}
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(string.IsNullOrEmpty(file.Sha384) &&
|
|
|
|
|
!string.IsNullOrEmpty(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA384Key)))
|
2024-11-09 01:37:59 +00:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
file.Sha384 = rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA384Key);
|
2024-11-09 01:37:59 +00:00
|
|
|
file.UpdatedOn = DateTime.UtcNow;
|
|
|
|
|
}
|
2020-09-04 02:14:23 +01:00
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(string.IsNullOrEmpty(file.Sha512) &&
|
|
|
|
|
!string.IsNullOrEmpty(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA512Key)))
|
2020-08-22 17:14:52 +01:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
file.Sha512 = rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.SHA512Key);
|
2024-11-09 01:37:59 +00:00
|
|
|
file.UpdatedOn = DateTime.UtcNow;
|
|
|
|
|
}
|
2020-08-22 17:14:52 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
DateTime? fileModificationDate = null;
|
|
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(!string.IsNullOrEmpty(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.DateKey)))
|
2020-08-22 17:14:52 +01:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
string romDate = rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.DateKey).Replace("/", "\\");
|
2024-11-09 01:37:59 +00:00
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(DateTime.TryParseExact(romDate,
|
2024-11-09 01:37:59 +00:00
|
|
|
@"yyyy\\M\\d H:mm",
|
|
|
|
|
CultureInfo.InvariantCulture,
|
|
|
|
|
DateTimeStyles.AssumeUniversal,
|
|
|
|
|
out DateTime date))
|
|
|
|
|
fileModificationDate = date;
|
|
|
|
|
}
|
2020-09-04 03:15:26 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
string filename;
|
|
|
|
|
string path = null;
|
2020-09-04 03:15:26 +01:00
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.NameKey).Contains('\\'))
|
2024-11-09 01:37:59 +00:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
filename = Path.GetFileName(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.NameKey)
|
|
|
|
|
.Replace('\\', '/'));
|
|
|
|
|
|
|
|
|
|
path = Path.GetDirectoryName(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.NameKey)
|
|
|
|
|
.Replace('\\', '/'));
|
2024-11-09 01:37:59 +00:00
|
|
|
}
|
2024-11-10 06:42:15 +00:00
|
|
|
else if(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.NameKey).Contains('/'))
|
2024-11-09 01:37:59 +00:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
filename = Path.GetFileName(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.NameKey));
|
|
|
|
|
path = Path.GetDirectoryName(rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.NameKey));
|
2024-11-09 01:37:59 +00:00
|
|
|
}
|
|
|
|
|
else
|
2024-11-10 06:42:15 +00:00
|
|
|
filename = rom.GetStringFieldValue(SabreTools.Models.Metadata.Rom.NameKey);
|
2020-09-04 03:15:26 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
newFilesByMachine.Add(new FileByMachine
|
2020-09-04 03:15:26 +01:00
|
|
|
{
|
2024-11-09 01:37:59 +00:00
|
|
|
File = file,
|
|
|
|
|
Machine = machine,
|
|
|
|
|
Name = filename,
|
|
|
|
|
FileLastModification = fileModificationDate,
|
|
|
|
|
Path = path
|
|
|
|
|
});
|
2020-09-04 03:15:26 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
if(hashCollision)
|
|
|
|
|
pendingFiles.Add(file);
|
|
|
|
|
else if(file.Sha512 != null)
|
|
|
|
|
pendingFilesBySha512[file.Sha512] = file;
|
|
|
|
|
else if(file.Sha384 != null)
|
|
|
|
|
pendingFilesBySha384[file.Sha384] = file;
|
|
|
|
|
else if(file.Sha256 != null)
|
|
|
|
|
pendingFilesBySha256[file.Sha256] = file;
|
|
|
|
|
else if(file.Sha1 != null)
|
|
|
|
|
pendingFilesBySha1[file.Sha1] = file;
|
|
|
|
|
else if(file.Md5 != null)
|
|
|
|
|
pendingFilesByMd5[file.Md5] = file;
|
|
|
|
|
else if(file.Crc32 != null) pendingFilesByCrc[file.Crc32] = file;
|
|
|
|
|
|
|
|
|
|
position++;
|
|
|
|
|
}
|
2020-09-04 03:15:26 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
SetMessage?.Invoke(this,
|
|
|
|
|
new MessageEventArgs
|
|
|
|
|
{
|
|
|
|
|
Message = Localization.SavingChangesToDatabase
|
|
|
|
|
});
|
2020-09-04 03:15:26 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
SetIndeterminateProgress?.Invoke(this, System.EventArgs.Empty);
|
2020-09-04 03:15:26 +01:00
|
|
|
|
2025-07-14 16:42:36 +01:00
|
|
|
lock(DbLock)
|
2025-07-11 18:40:14 +01:00
|
|
|
{
|
|
|
|
|
ctx.BulkInsert(newFiles, b => b.SetOutputIdentity = true);
|
|
|
|
|
}
|
2020-09-04 03:15:26 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
foreach(FileByMachine fbm in newFilesByMachine)
|
|
|
|
|
{
|
|
|
|
|
fbm.FileId = fbm.File.Id;
|
|
|
|
|
fbm.MachineId = fbm.Machine.Id;
|
|
|
|
|
}
|
2020-09-04 03:15:26 +01:00
|
|
|
|
2025-07-14 16:42:36 +01:00
|
|
|
lock(DbLock)
|
2025-07-11 18:40:14 +01:00
|
|
|
{
|
|
|
|
|
ctx.BulkInsert(newFilesByMachine);
|
2020-09-04 03:15:26 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
ctx.SaveChanges();
|
|
|
|
|
}
|
2020-09-04 03:15:26 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
pendingFilesBySha512.Clear();
|
|
|
|
|
pendingFilesBySha384.Clear();
|
|
|
|
|
pendingFilesBySha256.Clear();
|
|
|
|
|
pendingFilesBySha1.Clear();
|
|
|
|
|
pendingFilesByMd5.Clear();
|
|
|
|
|
pendingFilesByCrc.Clear();
|
|
|
|
|
pendingFiles.Clear();
|
|
|
|
|
newFiles.Clear();
|
|
|
|
|
newFilesByMachine.Clear();
|
2020-09-04 03:15:26 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
SetProgressBounds?.Invoke(this,
|
|
|
|
|
new ProgressBoundsEventArgs
|
|
|
|
|
{
|
|
|
|
|
Minimum = 0,
|
|
|
|
|
Maximum = disks.Count
|
|
|
|
|
});
|
2020-09-04 03:15:26 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
SetMessage?.Invoke(this,
|
|
|
|
|
new MessageEventArgs
|
|
|
|
|
{
|
|
|
|
|
Message = Localization.AddingDisks
|
|
|
|
|
});
|
2020-09-04 03:15:26 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
position = 0;
|
2020-09-04 03:15:26 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
var newDisks = new List<DbDisk>();
|
|
|
|
|
var newDisksByMachine = new List<DiskByMachine>();
|
2020-09-04 03:15:26 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
foreach(Disk disk in disks)
|
|
|
|
|
{
|
|
|
|
|
SetProgress?.Invoke(this,
|
|
|
|
|
new ProgressEventArgs
|
|
|
|
|
{
|
|
|
|
|
Value = position
|
|
|
|
|
});
|
2020-09-04 03:15:26 +01:00
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(!machines.TryGetValue(disk.GetFieldValue<SabreTools.DatItems.Machine>(DatItem.MachineKey)
|
2025-07-07 21:01:48 +01:00
|
|
|
?.GetStringFieldValue(SabreTools.Models.Metadata.Machine.NameKey)
|
|
|
|
|
?.ToLowerInvariant(),
|
2024-11-10 06:42:15 +00:00
|
|
|
out Machine machine))
|
2024-11-09 01:37:59 +00:00
|
|
|
{
|
|
|
|
|
ErrorOccurred?.Invoke(this,
|
|
|
|
|
new ErrorEventArgs
|
|
|
|
|
{
|
|
|
|
|
Message = Localization.FoundDiskWithoutMachine
|
|
|
|
|
});
|
2020-09-04 03:15:26 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
return;
|
2020-09-04 03:15:26 +01:00
|
|
|
}
|
|
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(disk.GetStringFieldValue(SabreTools.Models.Metadata.Disk.MD5Key) == null &&
|
|
|
|
|
disk.GetStringFieldValue(SabreTools.Models.Metadata.Disk.SHA1Key) == null)
|
2020-09-04 03:15:26 +01:00
|
|
|
{
|
2024-11-09 01:37:59 +00:00
|
|
|
position++;
|
2020-09-06 17:24:32 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
continue;
|
2020-09-06 17:24:32 +01:00
|
|
|
}
|
|
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
DbDisk dbDisk = null;
|
2020-09-04 03:15:26 +01:00
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(disk.GetStringFieldValue(SabreTools.Models.Metadata.Disk.SHA1Key) != null && dbDisk == null)
|
2024-11-12 06:39:06 +00:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
pendingDisksBySha1.TryGetValue(disk.GetStringFieldValue(SabreTools.Models.Metadata.Disk.SHA1Key),
|
|
|
|
|
out dbDisk);
|
2024-11-12 06:39:06 +00:00
|
|
|
}
|
2020-09-04 03:15:26 +01:00
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(disk.GetStringFieldValue(SabreTools.Models.Metadata.Disk.MD5Key) != null && dbDisk == null)
|
2024-11-12 06:39:06 +00:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
pendingDisksByMd5.TryGetValue(disk.GetStringFieldValue(SabreTools.Models.Metadata.Disk.MD5Key),
|
|
|
|
|
out dbDisk);
|
2024-11-12 06:39:06 +00:00
|
|
|
}
|
2020-09-04 03:15:26 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
if(dbDisk == null)
|
2020-09-04 22:19:40 +01:00
|
|
|
{
|
2024-11-09 01:37:59 +00:00
|
|
|
dbDisk = new DbDisk
|
|
|
|
|
{
|
|
|
|
|
CreatedOn = DateTime.UtcNow,
|
2024-11-10 06:42:15 +00:00
|
|
|
Md5 = disk.GetStringFieldValue(SabreTools.Models.Metadata.Disk.MD5Key),
|
|
|
|
|
Sha1 = disk.GetStringFieldValue(SabreTools.Models.Metadata.Disk.SHA1Key),
|
2024-11-09 01:37:59 +00:00
|
|
|
UpdatedOn = DateTime.UtcNow
|
|
|
|
|
};
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
newDisks.Add(dbDisk);
|
|
|
|
|
}
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(string.IsNullOrEmpty(dbDisk.Md5) &&
|
|
|
|
|
!string.IsNullOrEmpty(disk.GetStringFieldValue(SabreTools.Models.Metadata.Disk.MD5Key)))
|
2024-11-09 01:37:59 +00:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
dbDisk.Md5 = disk.GetStringFieldValue(SabreTools.Models.Metadata.Disk.MD5Key);
|
2024-11-09 01:37:59 +00:00
|
|
|
dbDisk.UpdatedOn = DateTime.UtcNow;
|
|
|
|
|
}
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(string.IsNullOrEmpty(dbDisk.Sha1) &&
|
|
|
|
|
!string.IsNullOrEmpty(disk.GetStringFieldValue(SabreTools.Models.Metadata.Disk.SHA1Key)))
|
2024-11-09 01:37:59 +00:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
dbDisk.Sha1 = disk.GetStringFieldValue(SabreTools.Models.Metadata.Disk.SHA1Key);
|
2024-11-09 01:37:59 +00:00
|
|
|
dbDisk.UpdatedOn = DateTime.UtcNow;
|
|
|
|
|
}
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
newDisksByMachine.Add(new DiskByMachine
|
2020-09-04 22:19:40 +01:00
|
|
|
{
|
2024-11-09 01:37:59 +00:00
|
|
|
Disk = dbDisk,
|
|
|
|
|
Machine = machine,
|
2024-11-10 06:42:15 +00:00
|
|
|
Name = disk.GetStringFieldValue(SabreTools.Models.Metadata.Media.NameKey)
|
2024-11-09 01:37:59 +00:00
|
|
|
});
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
if(dbDisk.Sha1 != null) pendingDisksBySha1[dbDisk.Sha1] = dbDisk;
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
if(dbDisk.Md5 != null) pendingDisksByMd5[dbDisk.Md5] = dbDisk;
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
position++;
|
|
|
|
|
}
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
SetMessage?.Invoke(this,
|
|
|
|
|
new MessageEventArgs
|
|
|
|
|
{
|
|
|
|
|
Message = Localization.SavingChangesToDatabase
|
|
|
|
|
});
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
SetIndeterminateProgress?.Invoke(this, System.EventArgs.Empty);
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2025-07-14 16:42:36 +01:00
|
|
|
lock(DbLock)
|
2025-07-11 18:40:14 +01:00
|
|
|
{
|
|
|
|
|
ctx.BulkInsert(newDisks, b => b.SetOutputIdentity = true);
|
|
|
|
|
}
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
foreach(DiskByMachine dbm in newDisksByMachine)
|
|
|
|
|
{
|
|
|
|
|
dbm.DiskId = dbm.Disk.Id;
|
|
|
|
|
dbm.MachineId = dbm.Machine.Id;
|
|
|
|
|
}
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2025-07-14 16:42:36 +01:00
|
|
|
lock(DbLock)
|
2025-07-11 18:40:14 +01:00
|
|
|
{
|
|
|
|
|
ctx.BulkInsert(newDisksByMachine);
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
ctx.SaveChanges();
|
|
|
|
|
}
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
pendingDisksBySha1.Clear();
|
|
|
|
|
pendingDisksByMd5.Clear();
|
|
|
|
|
newDisks.Clear();
|
|
|
|
|
newDisksByMachine.Clear();
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
SetProgressBounds?.Invoke(this,
|
|
|
|
|
new ProgressBoundsEventArgs
|
|
|
|
|
{
|
|
|
|
|
Minimum = 0,
|
|
|
|
|
Maximum = medias.Count
|
|
|
|
|
});
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
SetMessage?.Invoke(this,
|
|
|
|
|
new MessageEventArgs
|
|
|
|
|
{
|
|
|
|
|
Message = Localization.AddingMedias
|
|
|
|
|
});
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
position = 0;
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
var newMedias = new List<DbMedia>();
|
|
|
|
|
var newMediasByMachine = new List<MediaByMachine>();
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
foreach(Media media in medias)
|
|
|
|
|
{
|
|
|
|
|
SetProgress?.Invoke(this,
|
|
|
|
|
new ProgressEventArgs
|
|
|
|
|
{
|
|
|
|
|
Value = position
|
|
|
|
|
});
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(!machines.TryGetValue(media.GetFieldValue<SabreTools.DatItems.Machine>(DatItem.MachineKey)
|
2025-07-07 21:01:48 +01:00
|
|
|
?.GetStringFieldValue(SabreTools.Models.Metadata.Machine.NameKey)
|
|
|
|
|
?.ToLowerInvariant(),
|
2024-11-10 06:42:15 +00:00
|
|
|
out Machine machine))
|
2024-11-09 01:37:59 +00:00
|
|
|
{
|
|
|
|
|
ErrorOccurred?.Invoke(this,
|
|
|
|
|
new ErrorEventArgs
|
|
|
|
|
{
|
|
|
|
|
Message = Localization.FoundMediaWithoutMachine
|
|
|
|
|
});
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
return;
|
2020-09-04 22:19:40 +01:00
|
|
|
}
|
|
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(media.GetStringFieldValue(SabreTools.Models.Metadata.Media.MD5Key) == null &&
|
|
|
|
|
media.GetStringFieldValue(SabreTools.Models.Metadata.Media.SHA1Key) == null &&
|
|
|
|
|
media.GetStringFieldValue(SabreTools.Models.Metadata.Media.SHA256Key) == null)
|
2020-09-04 22:19:40 +01:00
|
|
|
{
|
2024-11-09 01:37:59 +00:00
|
|
|
position++;
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
continue;
|
|
|
|
|
}
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
DbMedia dbMedia = null;
|
2020-09-06 17:24:32 +01:00
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(media.GetStringFieldValue(SabreTools.Models.Metadata.Media.SHA256Key) != null && dbMedia == null)
|
2024-11-12 06:39:06 +00:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
pendingMediasBySha256.TryGetValue(media.GetStringFieldValue(SabreTools.Models.Metadata.Media
|
|
|
|
|
.SHA256Key),
|
|
|
|
|
out dbMedia);
|
2024-11-12 06:39:06 +00:00
|
|
|
}
|
2020-09-06 17:24:32 +01:00
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(media.GetStringFieldValue(SabreTools.Models.Metadata.Media.SHA1Key) != null && dbMedia == null)
|
2024-11-12 06:39:06 +00:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
pendingMediasBySha1.TryGetValue(media.GetStringFieldValue(SabreTools.Models.Metadata.Media.SHA1Key),
|
|
|
|
|
out dbMedia);
|
2024-11-12 06:39:06 +00:00
|
|
|
}
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(media.GetStringFieldValue(SabreTools.Models.Metadata.Media.MD5Key) != null && dbMedia == null)
|
2024-11-12 06:39:06 +00:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
pendingMediasByMd5.TryGetValue(media.GetStringFieldValue(SabreTools.Models.Metadata.Media.MD5Key),
|
|
|
|
|
out dbMedia);
|
2024-11-12 06:39:06 +00:00
|
|
|
}
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
// TODO: SpamSum
|
|
|
|
|
if(dbMedia == null)
|
|
|
|
|
{
|
|
|
|
|
dbMedia = new DbMedia
|
|
|
|
|
{
|
|
|
|
|
CreatedOn = DateTime.UtcNow,
|
2024-11-10 06:42:15 +00:00
|
|
|
Md5 = media.GetStringFieldValue(SabreTools.Models.Metadata.Media.MD5Key),
|
|
|
|
|
Sha1 = media.GetStringFieldValue(SabreTools.Models.Metadata.Media.SHA1Key),
|
|
|
|
|
Sha256 = media.GetStringFieldValue(SabreTools.Models.Metadata.Media.SHA256Key),
|
2024-11-09 01:37:59 +00:00
|
|
|
UpdatedOn = DateTime.UtcNow
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
newMedias.Add(dbMedia);
|
|
|
|
|
}
|
2020-09-04 22:19:40 +01:00
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(string.IsNullOrEmpty(dbMedia.Md5) &&
|
|
|
|
|
!string.IsNullOrEmpty(media.GetStringFieldValue(SabreTools.Models.Metadata.Media.MD5Key)))
|
2020-09-11 00:42:24 +01:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
dbMedia.Md5 = media.GetStringFieldValue(SabreTools.Models.Metadata.Media.MD5Key);
|
2024-11-09 01:37:59 +00:00
|
|
|
dbMedia.UpdatedOn = DateTime.UtcNow;
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(string.IsNullOrEmpty(dbMedia.Sha1) &&
|
|
|
|
|
!string.IsNullOrEmpty(media.GetStringFieldValue(SabreTools.Models.Metadata.Media.SHA1Key)))
|
2020-09-21 00:47:07 +01:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
dbMedia.Sha1 = media.GetStringFieldValue(SabreTools.Models.Metadata.Media.SHA1Key);
|
2024-11-09 01:37:59 +00:00
|
|
|
dbMedia.UpdatedOn = DateTime.UtcNow;
|
|
|
|
|
}
|
2020-08-24 01:57:15 +01:00
|
|
|
|
2024-11-10 06:42:15 +00:00
|
|
|
if(string.IsNullOrEmpty(dbMedia.Sha256) &&
|
|
|
|
|
!string.IsNullOrEmpty(media.GetStringFieldValue(SabreTools.Models.Metadata.Media.SHA256Key)))
|
2020-08-24 01:57:15 +01:00
|
|
|
{
|
2024-11-10 06:42:15 +00:00
|
|
|
dbMedia.Sha256 = media.GetStringFieldValue(SabreTools.Models.Metadata.Media.SHA256Key);
|
2024-11-09 01:37:59 +00:00
|
|
|
dbMedia.UpdatedOn = DateTime.UtcNow;
|
|
|
|
|
}
|
2020-08-22 04:40:39 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
newMediasByMachine.Add(new MediaByMachine
|
2020-08-22 04:40:39 +01:00
|
|
|
{
|
2024-11-09 01:37:59 +00:00
|
|
|
Media = dbMedia,
|
|
|
|
|
Machine = machine,
|
2024-11-10 06:42:15 +00:00
|
|
|
Name = media.GetStringFieldValue(SabreTools.Models.Metadata.Media.NameKey)
|
2020-08-22 04:40:39 +01:00
|
|
|
});
|
2024-11-09 01:37:59 +00:00
|
|
|
|
|
|
|
|
if(dbMedia.Sha256 != null) pendingMediasBySha256[dbMedia.Sha256] = dbMedia;
|
|
|
|
|
|
|
|
|
|
if(dbMedia.Sha1 != null) pendingMediasBySha1[dbMedia.Sha1] = dbMedia;
|
|
|
|
|
|
|
|
|
|
if(dbMedia.Md5 != null) pendingMediasByMd5[dbMedia.Md5] = dbMedia;
|
|
|
|
|
|
|
|
|
|
position++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SetMessage?.Invoke(this,
|
|
|
|
|
new MessageEventArgs
|
|
|
|
|
{
|
|
|
|
|
Message = Localization.SavingChangesToDatabase
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
SetIndeterminateProgress?.Invoke(this, System.EventArgs.Empty);
|
|
|
|
|
|
2025-07-14 16:42:36 +01:00
|
|
|
lock(DbLock)
|
2025-07-11 18:40:14 +01:00
|
|
|
{
|
|
|
|
|
ctx.BulkInsert(newMedias, b => b.SetOutputIdentity = true);
|
|
|
|
|
}
|
2024-11-09 01:37:59 +00:00
|
|
|
|
|
|
|
|
foreach(MediaByMachine mbm in newMediasByMachine)
|
|
|
|
|
{
|
|
|
|
|
mbm.MediaId = mbm.Media.Id;
|
|
|
|
|
mbm.MachineId = mbm.Machine.Id;
|
2020-08-22 04:40:39 +01:00
|
|
|
}
|
|
|
|
|
|
2025-07-14 16:42:36 +01:00
|
|
|
lock(DbLock)
|
2025-07-11 18:40:14 +01:00
|
|
|
{
|
|
|
|
|
ctx.BulkInsert(newMediasByMachine);
|
2024-11-09 01:37:59 +00:00
|
|
|
|
2025-07-11 18:40:14 +01:00
|
|
|
ctx.SaveChanges();
|
|
|
|
|
}
|
2024-11-09 01:37:59 +00:00
|
|
|
|
|
|
|
|
pendingMediasBySha256.Clear();
|
|
|
|
|
pendingMediasBySha1.Clear();
|
|
|
|
|
pendingMediasByMd5.Clear();
|
|
|
|
|
newMedias.Clear();
|
|
|
|
|
newMediasByMachine.Clear();
|
2025-07-11 18:40:14 +01:00
|
|
|
RomSetStat stats;
|
2024-11-09 01:37:59 +00:00
|
|
|
|
2025-07-14 16:42:36 +01:00
|
|
|
lock(DbLock)
|
2025-07-11 18:40:14 +01:00
|
|
|
{
|
|
|
|
|
stats = ctx.RomSets.Where(r => r.Id == romSet.Id)
|
|
|
|
|
.Select(r => new RomSetStat
|
|
|
|
|
{
|
|
|
|
|
RomSetId = r.Id,
|
|
|
|
|
TotalMachines = r.Machines.Count,
|
|
|
|
|
CompleteMachines =
|
|
|
|
|
r.Machines.Count(m => m.Files.Count > 0 &&
|
|
|
|
|
m.Disks.Count == 0 &&
|
|
|
|
|
m.Files.All(f => f.File.IsInRepo)) +
|
|
|
|
|
r.Machines.Count(m => m.Disks.Count > 0 &&
|
|
|
|
|
m.Files.Count == 0 &&
|
|
|
|
|
m.Disks.All(f => f.Disk.IsInRepo)) +
|
|
|
|
|
r.Machines.Count(m => m.Files.Count > 0 &&
|
|
|
|
|
m.Disks.Count > 0 &&
|
|
|
|
|
m.Files.All(f => f.File.IsInRepo) &&
|
|
|
|
|
m.Disks.All(f => f.Disk.IsInRepo)),
|
|
|
|
|
IncompleteMachines =
|
|
|
|
|
r.Machines.Count(m => m.Files.Count > 0 &&
|
|
|
|
|
m.Disks.Count == 0 &&
|
|
|
|
|
m.Files.Any(f => !f.File.IsInRepo)) +
|
|
|
|
|
r.Machines.Count(m => m.Disks.Count > 0 &&
|
|
|
|
|
m.Files.Count == 0 &&
|
|
|
|
|
m.Disks.Any(f => !f.Disk.IsInRepo)) +
|
|
|
|
|
r.Machines.Count(m => m.Files.Count > 0 &&
|
|
|
|
|
m.Disks.Count > 0 &&
|
|
|
|
|
(m.Files.Any(f => !f.File.IsInRepo) ||
|
|
|
|
|
m.Disks.Any(f => !f.Disk.IsInRepo))),
|
|
|
|
|
TotalRoms =
|
|
|
|
|
r.Machines.Sum(m => m.Files.Count) +
|
|
|
|
|
r.Machines.Sum(m => m.Disks.Count) +
|
|
|
|
|
r.Machines.Sum(m => m.Medias.Count),
|
|
|
|
|
HaveRoms = r.Machines.Sum(m => m.Files.Count(f => f.File.IsInRepo)) +
|
|
|
|
|
r.Machines.Sum(m => m.Disks.Count(f => f.Disk.IsInRepo)) +
|
|
|
|
|
r.Machines.Sum(m => m.Medias.Count(f => f.Media.IsInRepo)),
|
|
|
|
|
MissRoms = r.Machines.Sum(m => m.Files.Count(f => !f.File.IsInRepo)) +
|
|
|
|
|
r.Machines.Sum(m => m.Disks.Count(f => !f.Disk.IsInRepo)) +
|
|
|
|
|
r.Machines.Sum(m => m.Medias.Count(f => !f.Media.IsInRepo))
|
|
|
|
|
})
|
|
|
|
|
.FirstOrDefault();
|
|
|
|
|
|
|
|
|
|
RomSetStat oldStats = ctx.RomSetStats.Find(stats.RomSetId);
|
|
|
|
|
|
|
|
|
|
if(oldStats != null) ctx.Remove(oldStats);
|
|
|
|
|
|
|
|
|
|
ctx.RomSetStats.Add(stats);
|
|
|
|
|
|
|
|
|
|
ctx.SaveChanges();
|
|
|
|
|
}
|
2024-11-09 01:37:59 +00:00
|
|
|
|
|
|
|
|
WorkFinished?.Invoke(this,
|
|
|
|
|
new MessageEventArgs
|
|
|
|
|
{
|
|
|
|
|
Message = string.Format(Localization.DatImportSuccess,
|
|
|
|
|
stats.TotalMachines,
|
|
|
|
|
stats.TotalRoms)
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
RomSetAdded?.Invoke(this,
|
|
|
|
|
new RomSetEventArgs
|
|
|
|
|
{
|
|
|
|
|
RomSet = new RomSetModel
|
|
|
|
|
{
|
|
|
|
|
Id = romSet.Id,
|
|
|
|
|
Author = romSet.Author,
|
|
|
|
|
Comment = romSet.Comment,
|
|
|
|
|
Date = romSet.Date,
|
|
|
|
|
Description = romSet.Description,
|
|
|
|
|
Filename = romSet.Filename,
|
|
|
|
|
Homepage = romSet.Homepage,
|
|
|
|
|
Name = romSet.Name,
|
|
|
|
|
Sha384 = romSet.Sha384,
|
|
|
|
|
Version = romSet.Version,
|
|
|
|
|
TotalMachines = stats.TotalMachines,
|
|
|
|
|
CompleteMachines = stats.CompleteMachines,
|
|
|
|
|
IncompleteMachines = stats.IncompleteMachines,
|
|
|
|
|
TotalRoms = stats.TotalRoms,
|
|
|
|
|
HaveRoms = stats.HaveRoms,
|
|
|
|
|
MissRoms = stats.MissRoms,
|
|
|
|
|
Category = romSet.Category
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
catch(Exception e)
|
|
|
|
|
{
|
|
|
|
|
if(Debugger.IsAttached) throw;
|
2020-08-22 04:40:39 +01:00
|
|
|
|
2024-11-09 01:37:59 +00:00
|
|
|
ErrorOccurred?.Invoke(this,
|
|
|
|
|
new ErrorEventArgs
|
|
|
|
|
{
|
|
|
|
|
Message = Localization.UnhandledException
|
|
|
|
|
});
|
|
|
|
|
}
|
2020-08-22 04:40:39 +01:00
|
|
|
}
|
2024-11-09 01:37:59 +00:00
|
|
|
|
|
|
|
|
// TODO: Cancel and get back
|
|
|
|
|
public void Abort() => _aborted = true;
|
|
|
|
|
|
|
|
|
|
public event EventHandler SetIndeterminateProgress;
|
|
|
|
|
public event EventHandler<MessageEventArgs> WorkFinished;
|
|
|
|
|
public event EventHandler<ErrorEventArgs> ErrorOccurred;
|
|
|
|
|
public event EventHandler<ProgressBoundsEventArgs> SetProgressBounds;
|
|
|
|
|
public event EventHandler<ProgressEventArgs> SetProgress;
|
|
|
|
|
public event EventHandler<MessageEventArgs> SetMessage;
|
|
|
|
|
public event EventHandler<RomSetEventArgs> RomSetAdded;
|
2020-08-22 04:40:39 +01:00
|
|
|
}
|