" +
+ html.Substring(html.IndexOf("", StringComparison.Ordinal));
+
+ var doc = new HtmlDocument();
+ doc.LoadHtml(html);
+ HtmlNode firstTable = doc.DocumentNode.SelectSingleNode("/html[1]/body[1]/table[1]");
+
+ bool firstRow = true;
+
+ int addedOffsets = 0;
+ int modifiedOffsets = 0;
+
+ System.Console.WriteLine("{0}: Processing offsets...", DateTime.UtcNow);
+ start = DateTime.UtcNow;
+
+ foreach(HtmlNode row in firstTable.Descendants("tr"))
+ {
+ HtmlNode[] columns = row.Descendants("td").ToArray();
+
+ if(columns.Length != 4)
+ {
+ System.Console.WriteLine("{0}: Row does not have correct number of columns...",
+ DateTime.UtcNow);
+
+ continue;
+ }
+
+ string column0 = columns[0].InnerText;
+ string column1 = columns[1].InnerText;
+ string column2 = columns[2].InnerText;
+ string column3 = columns[3].InnerText;
+
+ if(firstRow)
+ {
+ if(column0.ToLowerInvariant() != "cd drive")
+ {
+ System.Console.WriteLine("{0}: Unexpected header \"{1}\" found...", DateTime.UtcNow,
+ columns[0].InnerText);
+
+ break;
+ }
+
+ if(column1.ToLowerInvariant() != "correction offset")
+ {
+ System.Console.WriteLine("{0}: Unexpected header \"{1}\" found...", DateTime.UtcNow,
+ columns[1].InnerText);
+
+ break;
+ }
+
+ if(column2.ToLowerInvariant() != "submitted by")
+ {
+ System.Console.WriteLine("{0}: Unexpected header \"{1}\" found...", DateTime.UtcNow,
+ columns[2].InnerText);
+
+ break;
+ }
+
+ if(column3.ToLowerInvariant() != "percentage agree")
+ {
+ System.Console.WriteLine("{0}: Unexpected header \"{1}\" found...", DateTime.UtcNow,
+ columns[3].InnerText);
+
+ break;
+ }
+
+ firstRow = false;
+
+ continue;
+ }
+
+ string manufacturer;
+ string model;
+
+ if(column0[0] == '-' &&
+ column0[1] == ' ')
+ {
+ manufacturer = null;
+ model = column0.Substring(2).Trim();
+ }
+ else
+ {
+ int cutOffset = column0.IndexOf(" - ", StringComparison.Ordinal);
+
+ if(cutOffset == -1)
+ {
+ manufacturer = null;
+ model = column0;
+ }
+ else
+ {
+ manufacturer = column0.Substring(0, cutOffset).Trim();
+ model = column0.Substring(cutOffset + 3).Trim();
+ }
+ }
+
+ switch(manufacturer)
+ {
+ case "Lite-ON":
+ manufacturer = "JLMS";
+
+ break;
+ case "LG Electronics":
+ manufacturer = "HL-DT-ST";
+
+ break;
+ case "Panasonic":
+ manufacturer = "MATSHITA";
+
+ break;
+ }
+
+ CompactDiscOffset cdOffset =
+ ctx.CdOffsets.FirstOrDefault(o => o.Manufacturer == manufacturer && o.Model == model);
+
+ if(column1.ToLowerInvariant() == "[purged]")
+ {
+ if(cdOffset != null)
+ ctx.CdOffsets.Remove(cdOffset);
+
+ continue;
+ }
+
+ if(!short.TryParse(column1, out short offset))
+ continue;
+
+ if(!int.TryParse(column2, out int submissions))
+ continue;
+
+ if(column3[^1] != '%')
+ continue;
+
+ column3 = column3.Substring(0, column3.Length - 1);
+
+ if(!float.TryParse(column3, out float percentage))
+ continue;
+
+ percentage /= 100;
+
+ if(cdOffset is null)
+ {
+ cdOffset = new CompactDiscOffset
+ {
+ AddedWhen = DateTime.UtcNow,
+ ModifiedWhen = DateTime.UtcNow,
+ Agreement = percentage,
+ Manufacturer = manufacturer,
+ Model = model,
+ Offset = offset,
+ Submissions = submissions
+ };
+
+ ctx.CdOffsets.Add(cdOffset);
+ addedOffsets++;
+ }
+ else
+ {
+ if(Math.Abs(cdOffset.Agreement - percentage) > 0)
+ {
+ cdOffset.Agreement = percentage;
+ cdOffset.ModifiedWhen = DateTime.UtcNow;
+ }
+
+ if(cdOffset.Offset != offset)
+ {
+ cdOffset.Offset = offset;
+ cdOffset.ModifiedWhen = DateTime.UtcNow;
+ }
+
+ if(cdOffset.Submissions != submissions)
+ {
+ cdOffset.Submissions = submissions;
+ cdOffset.ModifiedWhen = DateTime.UtcNow;
+ }
+
+ if(Math.Abs(cdOffset.Agreement - percentage) > 0 ||
+ cdOffset.Offset != offset ||
+ cdOffset.Submissions != submissions)
+ modifiedOffsets++;
+ }
+
+ foreach(Device device in ctx.Devices.
+ Where(d => d.Manufacturer == null && d.Model != null &&
+ d.Model.Trim() == model).
+ Union(ctx.Devices.Where(d => d.Manufacturer != null &&
+ d.Manufacturer.Trim() == manufacturer &&
+ d.Model != null && d.Model == model)))
+ {
+ if(device.CdOffset == cdOffset &&
+ device.ModifiedWhen == cdOffset.ModifiedWhen)
+ continue;
+
+ device.CdOffset = cdOffset;
+ device.ModifiedWhen = cdOffset.ModifiedWhen;
+ }
+ }
+
+ end = DateTime.UtcNow;
+ System.Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds);
+
+ if(File.Exists("drive_offsets.json"))
+ {
+ var sr = new StreamReader("drive_offsets.json");
+
+ CompactDiscOffset[] offsets = JsonSerializer.Deserialize(sr.ReadToEnd());
+
+ if(offsets != null)
+ {
+ foreach(CompactDiscOffset offset in offsets)
+ {
+ CompactDiscOffset cdOffset =
+ ctx.CdOffsets.FirstOrDefault(o => o.Manufacturer == offset.Manufacturer &&
+ o.Model == offset.Model);
+
+ if(cdOffset is null)
+ {
+ offset.ModifiedWhen = DateTime.UtcNow;
+
+ ctx.CdOffsets.Add(offset);
+ addedOffsets++;
+ }
+ else
+ {
+ if(Math.Abs(cdOffset.Agreement - offset.Agreement) > 0 ||
+ offset.Agreement < 0)
+ {
+ cdOffset.Agreement = offset.Agreement;
+ cdOffset.ModifiedWhen = DateTime.UtcNow;
+ }
+
+ if(cdOffset.Offset != offset.Offset)
+ {
+ cdOffset.Offset = offset.Offset;
+ cdOffset.ModifiedWhen = DateTime.UtcNow;
+ }
+
+ if(cdOffset.Submissions != offset.Submissions)
+ {
+ cdOffset.Submissions = offset.Submissions;
+ cdOffset.ModifiedWhen = DateTime.UtcNow;
+ }
+
+ if(Math.Abs(cdOffset.Agreement - offset.Agreement) > 0 ||
+ cdOffset.Offset != offset.Offset ||
+ cdOffset.Submissions != offset.Submissions)
+ modifiedOffsets++;
+ }
+ }
+ }
+ }
+
System.Console.WriteLine("{0}: Committing changes...", DateTime.UtcNow);
start = DateTime.UtcNow;
ctx.SaveChanges();
end = DateTime.UtcNow;
System.Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds);
- try
- {
- System.Console.WriteLine("{0}: Retrieving CompactDisc read offsets from AccurateRip...",
- DateTime.UtcNow);
-
- start = DateTime.UtcNow;
-
- client = new WebClient();
- string html = client.DownloadString("http://www.accuraterip.com/driveoffsets.htm");
- end = DateTime.UtcNow;
- System.Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds);
-
- // The HTML is too malformed to process easily, so find start of table
- html = "" +
- html.Substring(html.IndexOf("| ", StringComparison.Ordinal));
-
- var doc = new HtmlDocument();
- doc.LoadHtml(html);
- HtmlNode firstTable = doc.DocumentNode.SelectSingleNode("/html[1]/body[1]/table[1]");
-
- bool firstRow = true;
-
- int addedOffsets = 0;
- int modifiedOffsets = 0;
-
- System.Console.WriteLine("{0}: Processing offsets...", DateTime.UtcNow);
- start = DateTime.UtcNow;
-
- foreach(HtmlNode row in firstTable.Descendants("tr"))
- {
- HtmlNode[] columns = row.Descendants("td").ToArray();
-
- if(columns.Length != 4)
- {
- System.Console.WriteLine("{0}: Row does not have correct number of columns...",
- DateTime.UtcNow);
-
- continue;
- }
-
- string column0 = columns[0].InnerText;
- string column1 = columns[1].InnerText;
- string column2 = columns[2].InnerText;
- string column3 = columns[3].InnerText;
-
- if(firstRow)
- {
- if(column0.ToLowerInvariant() != "cd drive")
- {
- System.Console.WriteLine("{0}: Unexpected header \"{1}\" found...", DateTime.UtcNow,
- columns[0].InnerText);
-
- break;
- }
-
- if(column1.ToLowerInvariant() != "correction offset")
- {
- System.Console.WriteLine("{0}: Unexpected header \"{1}\" found...", DateTime.UtcNow,
- columns[1].InnerText);
-
- break;
- }
-
- if(column2.ToLowerInvariant() != "submitted by")
- {
- System.Console.WriteLine("{0}: Unexpected header \"{1}\" found...", DateTime.UtcNow,
- columns[2].InnerText);
-
- break;
- }
-
- if(column3.ToLowerInvariant() != "percentage agree")
- {
- System.Console.WriteLine("{0}: Unexpected header \"{1}\" found...", DateTime.UtcNow,
- columns[3].InnerText);
-
- break;
- }
-
- firstRow = false;
-
- continue;
- }
-
- string manufacturer;
- string model;
-
- if(column0[0] == '-' &&
- column0[1] == ' ')
- {
- manufacturer = null;
- model = column0.Substring(2).Trim();
- }
- else
- {
- int cutOffset = column0.IndexOf(" - ", StringComparison.Ordinal);
-
- if(cutOffset == -1)
- {
- manufacturer = null;
- model = column0;
- }
- else
- {
- manufacturer = column0.Substring(0, cutOffset).Trim();
- model = column0.Substring(cutOffset + 3).Trim();
- }
- }
-
- switch(manufacturer)
- {
- case "Lite-ON":
- manufacturer = "JLMS";
-
- break;
- case "LG Electronics":
- manufacturer = "HL-DT-ST";
-
- break;
- case "Panasonic":
- manufacturer = "MATSHITA";
-
- break;
- }
-
- CompactDiscOffset cdOffset =
- ctx.CdOffsets.FirstOrDefault(o => o.Manufacturer == manufacturer && o.Model == model);
-
- if(column1.ToLowerInvariant() == "[purged]")
- {
- if(cdOffset != null)
- ctx.CdOffsets.Remove(cdOffset);
-
- continue;
- }
-
- if(!short.TryParse(column1, out short offset))
- continue;
-
- if(!int.TryParse(column2, out int submissions))
- continue;
-
- if(column3[^1] != '%')
- continue;
-
- column3 = column3.Substring(0, column3.Length - 1);
-
- if(!float.TryParse(column3, out float percentage))
- continue;
-
- percentage /= 100;
-
- if(cdOffset is null)
- {
- cdOffset = new CompactDiscOffset
- {
- AddedWhen = DateTime.UtcNow,
- ModifiedWhen = DateTime.UtcNow,
- Agreement = percentage,
- Manufacturer = manufacturer,
- Model = model,
- Offset = offset,
- Submissions = submissions
- };
-
- ctx.CdOffsets.Add(cdOffset);
- addedOffsets++;
- }
- else
- {
- if(Math.Abs(cdOffset.Agreement - percentage) > 0)
- {
- cdOffset.Agreement = percentage;
- cdOffset.ModifiedWhen = DateTime.UtcNow;
- }
-
- if(cdOffset.Offset != offset)
- {
- cdOffset.Offset = offset;
- cdOffset.ModifiedWhen = DateTime.UtcNow;
- }
-
- if(cdOffset.Submissions != submissions)
- {
- cdOffset.Submissions = submissions;
- cdOffset.ModifiedWhen = DateTime.UtcNow;
- }
-
- if(Math.Abs(cdOffset.Agreement - percentage) > 0 ||
- cdOffset.Offset != offset ||
- cdOffset.Submissions != submissions)
- modifiedOffsets++;
- }
-
- foreach(Device device in ctx.Devices.
- Where(d => d.Manufacturer == null && d.Model != null &&
- d.Model.Trim() == model).
- Union(ctx.Devices.Where(d => d.Manufacturer != null &&
- d.Manufacturer.Trim() == manufacturer &&
- d.Model != null && d.Model == model)))
- {
- if(device.CdOffset == cdOffset &&
- device.ModifiedWhen == cdOffset.ModifiedWhen)
- continue;
-
- device.CdOffset = cdOffset;
- device.ModifiedWhen = cdOffset.ModifiedWhen;
- }
- }
-
- end = DateTime.UtcNow;
- System.Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds);
-
- if(File.Exists("drive_offsets.json"))
- {
- var sr = new StreamReader("drive_offsets.json");
-
- CompactDiscOffset[] offsets = JsonSerializer.Deserialize(sr.ReadToEnd());
-
- if(offsets != null)
- {
- foreach(CompactDiscOffset offset in offsets)
- {
- CompactDiscOffset cdOffset =
- ctx.CdOffsets.FirstOrDefault(o => o.Manufacturer == offset.Manufacturer &&
- o.Model == offset.Model);
-
- if(cdOffset is null)
- {
- offset.ModifiedWhen = DateTime.UtcNow;
-
- ctx.CdOffsets.Add(offset);
- addedOffsets++;
- }
- else
- {
- if(Math.Abs(cdOffset.Agreement - offset.Agreement) > 0 ||
- offset.Agreement < 0)
- {
- cdOffset.Agreement = offset.Agreement;
- cdOffset.ModifiedWhen = DateTime.UtcNow;
- }
-
- if(cdOffset.Offset != offset.Offset)
- {
- cdOffset.Offset = offset.Offset;
- cdOffset.ModifiedWhen = DateTime.UtcNow;
- }
-
- if(cdOffset.Submissions != offset.Submissions)
- {
- cdOffset.Submissions = offset.Submissions;
- cdOffset.ModifiedWhen = DateTime.UtcNow;
- }
-
- if(Math.Abs(cdOffset.Agreement - offset.Agreement) > 0 ||
- cdOffset.Offset != offset.Offset ||
- cdOffset.Submissions != offset.Submissions)
- modifiedOffsets++;
- }
- }
- }
- }
-
- System.Console.WriteLine("{0}: Committing changes...", DateTime.UtcNow);
- start = DateTime.UtcNow;
- ctx.SaveChanges();
- end = DateTime.UtcNow;
- System.Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds);
-
- System.Console.WriteLine("{0}: Added {1} offsets", end, addedOffsets);
- System.Console.WriteLine("{0}: Modified {1} offsets", end, modifiedOffsets);
- }
- catch(Exception ex)
- {
- #if DEBUG
- if(Debugger.IsAttached)
- throw;
- #endif
- System.Console.WriteLine("{0}: Exception {1} filling CompactDisc read offsets...", DateTime.UtcNow, ex);
- }
+ System.Console.WriteLine("{0}: Added {1} offsets", end, addedOffsets);
+ System.Console.WriteLine("{0}: Modified {1} offsets", end, modifiedOffsets);
+ }
+ catch(Exception ex)
+ {
+ #if DEBUG
+ if(Debugger.IsAttached)
+ throw;
+ #endif
+ System.Console.WriteLine("{0}: Exception {1} filling CompactDisc read offsets...", DateTime.UtcNow, ex);
}
}
}
\ No newline at end of file
diff --git a/Aaru.Server/Areas/Admin/Controllers/AtasController.cs b/Aaru.Server/Areas/Admin/Controllers/AtasController.cs
index f37be22e..0596f637 100644
--- a/Aaru.Server/Areas/Admin/Controllers/AtasController.cs
+++ b/Aaru.Server/Areas/Admin/Controllers/AtasController.cs
@@ -13,436 +13,496 @@ using Newtonsoft.Json;
using Ata = Aaru.CommonTypes.Metadata.Ata;
using TestedMedia = Aaru.CommonTypes.Metadata.TestedMedia;
-namespace Aaru.Server.Areas.Admin.Controllers
+namespace Aaru.Server.Areas.Admin.Controllers;
+
+[Area("Admin"), Authorize]
+public sealed class AtasController : Controller
{
- [Area("Admin"), Authorize]
- public sealed class AtasController : Controller
+ readonly AaruServerContext _context;
+
+ public AtasController(AaruServerContext context) => _context = context;
+
+ // GET: Admin/Atas
+ public IActionResult Index() => View(_context.Ata.AsEnumerable().OrderBy(m => m.IdentifyDevice?.Model).
+ ThenBy(m => m.IdentifyDevice?.FirmwareRevision));
+
+ // GET: Admin/Atas/Details/5
+ public async Task Details(int? id)
{
- readonly AaruServerContext _context;
-
- public AtasController(AaruServerContext context) => _context = context;
-
- // GET: Admin/Atas
- public IActionResult Index() => View(_context.Ata.AsEnumerable().OrderBy(m => m.IdentifyDevice?.Model).
- ThenBy(m => m.IdentifyDevice?.FirmwareRevision));
-
- // GET: Admin/Atas/Details/5
- public async Task Details(int? id)
+ if(id == null)
{
- if(id == null)
- {
- return NotFound();
- }
-
- Ata ata = await _context.Ata.FirstOrDefaultAsync(m => m.Id == id);
-
- if(ata == null)
- {
- return NotFound();
- }
-
- return View(ata);
+ return NotFound();
}
- // GET: Admin/Atas/Delete/5
- public async Task Delete(int? id)
+ Ata ata = await _context.Ata.FirstOrDefaultAsync(m => m.Id == id);
+
+ if(ata == null)
{
- if(id == null)
- {
- return NotFound();
- }
-
- Ata ata = await _context.Ata.FirstOrDefaultAsync(m => m.Id == id);
-
- if(ata == null)
- {
- return NotFound();
- }
-
- return View(ata);
+ return NotFound();
}
- // POST: Admin/Atas/Delete/5
- [HttpPost, ActionName("Delete"), ValidateAntiForgeryToken]
- public async Task DeleteConfirmed(int id)
- {
- Ata ata = await _context.Ata.FindAsync(id);
- _context.Ata.Remove(ata);
- await _context.SaveChangesAsync();
+ return View(ata);
+ }
- return RedirectToAction(nameof(Index));
+ // GET: Admin/Atas/Delete/5
+ public async Task Delete(int? id)
+ {
+ if(id == null)
+ {
+ return NotFound();
}
- public IActionResult Consolidate()
+ Ata ata = await _context.Ata.FirstOrDefaultAsync(m => m.Id == id);
+
+ if(ata == null)
{
- List hashes = _context.Ata.Select(m => new IdHashModel(m.Id, Hash.Sha512(m.Identify))).
- ToList();
-
- List dups = hashes.GroupBy(x => x.Hash).Where(g => g.Count() > 1).
- Select(x => hashes.FirstOrDefault(y => y.Hash == x.Key)).ToList();
-
- for(int i = 0; i < dups.Count; i++)
- {
- Ata unique = _context.Ata.First(a => a.Id == dups[i].Id);
-
- dups[i].Description = unique.IdentifyDevice?.Model;
- dups[i].Duplicates = hashes.Where(h => h.Hash == dups[i].Hash).Skip(1).Select(x => x.Id).ToArray();
- }
-
- return View(new IdHashModelForView
- {
- List = dups,
- Json = JsonConvert.SerializeObject(dups)
- });
+ return NotFound();
}
- [HttpPost, ActionName("Consolidate"), ValidateAntiForgeryToken]
- public IActionResult ConsolidateConfirmed(string models)
+ return View(ata);
+ }
+
+ // POST: Admin/Atas/Delete/5
+ [HttpPost, ActionName("Delete"), ValidateAntiForgeryToken]
+ public async Task DeleteConfirmed(int id)
+ {
+ Ata ata = await _context.Ata.FindAsync(id);
+ _context.Ata.Remove(ata);
+ await _context.SaveChangesAsync();
+
+ return RedirectToAction(nameof(Index));
+ }
+
+ public IActionResult Consolidate()
+ {
+ List hashes = _context.Ata.Select(m => new IdHashModel(m.Id, Hash.Sha512(m.Identify))).
+ ToList();
+
+ List dups = hashes.GroupBy(x => x.Hash).Where(g => g.Count() > 1).
+ Select(x => hashes.FirstOrDefault(y => y.Hash == x.Key)).ToList();
+
+ for(int i = 0; i < dups.Count; i++)
{
- IdHashModel[] duplicates;
+ Ata unique = _context.Ata.First(a => a.Id == dups[i].Id);
- try
- {
- duplicates = JsonConvert.DeserializeObject(models);
- }
- catch(JsonSerializationException)
- {
- return BadRequest();
- }
-
- if(duplicates is null)
- return BadRequest();
-
- foreach(IdHashModel duplicate in duplicates)
- {
- Ata master = _context.Ata.FirstOrDefault(m => m.Id == duplicate.Id);
-
- if(master is null)
- continue;
-
- foreach(int duplicateId in duplicate.Duplicates)
- {
- Ata slave = _context.Ata.FirstOrDefault(m => m.Id == duplicateId);
-
- if(slave is null)
- continue;
-
- foreach(Device ataDevice in _context.Devices.Where(d => d.ATA.Id == duplicateId))
- {
- ataDevice.ATA = master;
- }
-
- foreach(Device atapiDevice in _context.Devices.Where(d => d.ATAPI.Id == duplicateId))
- {
- atapiDevice.ATAPI = master;
- }
-
- foreach(UploadedReport ataReport in _context.Reports.Where(d => d.ATA.Id == duplicateId))
- {
- ataReport.ATA = master;
- }
-
- foreach(UploadedReport atapiReport in _context.Reports.Where(d => d.ATAPI.Id == duplicateId))
- {
- atapiReport.ATAPI = master;
- }
-
- foreach(TestedMedia testedMedia in _context.TestedMedia.Where(d => d.AtaId == duplicateId))
- {
- testedMedia.AtaId = duplicate.Id;
- _context.Update(testedMedia);
- }
-
- if(master.ReadCapabilities is null &&
- slave.ReadCapabilities != null)
- master.ReadCapabilities = slave.ReadCapabilities;
-
- _context.Ata.Remove(slave);
- }
- }
-
- _context.SaveChanges();
-
- return RedirectToAction(nameof(Index));
+ dups[i].Description = unique.IdentifyDevice?.Model;
+ dups[i].Duplicates = hashes.Where(h => h.Hash == dups[i].Hash).Skip(1).Select(x => x.Id).ToArray();
}
- public IActionResult ConsolidateWithIds(int masterId, int slaveId)
+ return View(new IdHashModelForView
{
- Ata master = _context.Ata.FirstOrDefault(m => m.Id == masterId);
+ List = dups,
+ Json = JsonConvert.SerializeObject(dups)
+ });
+ }
+
+ [HttpPost, ActionName("Consolidate"), ValidateAntiForgeryToken]
+ public IActionResult ConsolidateConfirmed(string models)
+ {
+ IdHashModel[] duplicates;
+
+ try
+ {
+ duplicates = JsonConvert.DeserializeObject(models);
+ }
+ catch(JsonSerializationException)
+ {
+ return BadRequest();
+ }
+
+ if(duplicates is null)
+ return BadRequest();
+
+ foreach(IdHashModel duplicate in duplicates)
+ {
+ Ata master = _context.Ata.FirstOrDefault(m => m.Id == duplicate.Id);
if(master is null)
- return RedirectToAction(nameof(Compare), new
+ continue;
+
+ foreach(int duplicateId in duplicate.Duplicates)
+ {
+ Ata slave = _context.Ata.FirstOrDefault(m => m.Id == duplicateId);
+
+ if(slave is null)
+ continue;
+
+ foreach(Device ataDevice in _context.Devices.Where(d => d.ATA.Id == duplicateId))
{
- id = masterId,
- rightId = slaveId
- });
+ ataDevice.ATA = master;
+ }
- Ata slave = _context.Ata.FirstOrDefault(m => m.Id == slaveId);
-
- if(slave is null)
- return RedirectToAction(nameof(Compare), new
+ foreach(Device atapiDevice in _context.Devices.Where(d => d.ATAPI.Id == duplicateId))
{
- id = masterId,
- rightId = slaveId
- });
+ atapiDevice.ATAPI = master;
+ }
- foreach(Device ataDevice in _context.Devices.Where(d => d.ATA.Id == slaveId))
- {
- ataDevice.ATA = master;
+ foreach(UploadedReport ataReport in _context.Reports.Where(d => d.ATA.Id == duplicateId))
+ {
+ ataReport.ATA = master;
+ }
+
+ foreach(UploadedReport atapiReport in _context.Reports.Where(d => d.ATAPI.Id == duplicateId))
+ {
+ atapiReport.ATAPI = master;
+ }
+
+ foreach(TestedMedia testedMedia in _context.TestedMedia.Where(d => d.AtaId == duplicateId))
+ {
+ testedMedia.AtaId = duplicate.Id;
+ _context.Update(testedMedia);
+ }
+
+ if(master.ReadCapabilities is null &&
+ slave.ReadCapabilities != null)
+ master.ReadCapabilities = slave.ReadCapabilities;
+
+ _context.Ata.Remove(slave);
}
-
- foreach(Device atapiDevice in _context.Devices.Where(d => d.ATAPI.Id == slaveId))
- {
- atapiDevice.ATAPI = master;
- }
-
- foreach(UploadedReport ataReport in _context.Reports.Where(d => d.ATA.Id == slaveId))
- {
- ataReport.ATA = master;
- }
-
- foreach(UploadedReport atapiReport in _context.Reports.Where(d => d.ATAPI.Id == slaveId))
- {
- atapiReport.ATAPI = master;
- }
-
- foreach(TestedMedia testedMedia in _context.TestedMedia.Where(d => d.AtaId == slaveId))
- {
- testedMedia.AtaId = masterId;
- _context.Update(testedMedia);
- }
-
- if(master.ReadCapabilities is null &&
- slave.ReadCapabilities != null)
- master.ReadCapabilities = slave.ReadCapabilities;
-
- _context.Ata.Remove(slave);
-
- _context.SaveChanges();
-
- return RedirectToAction(nameof(Index));
}
- public IActionResult Compare(int id, int rightId)
+ _context.SaveChanges();
+
+ return RedirectToAction(nameof(Index));
+ }
+
+ public IActionResult ConsolidateWithIds(int masterId, int slaveId)
+ {
+ Ata master = _context.Ata.FirstOrDefault(m => m.Id == masterId);
+
+ if(master is null)
+ return RedirectToAction(nameof(Compare), new
+ {
+ id = masterId,
+ rightId = slaveId
+ });
+
+ Ata slave = _context.Ata.FirstOrDefault(m => m.Id == slaveId);
+
+ if(slave is null)
+ return RedirectToAction(nameof(Compare), new
+ {
+ id = masterId,
+ rightId = slaveId
+ });
+
+ foreach(Device ataDevice in _context.Devices.Where(d => d.ATA.Id == slaveId))
{
- var model = new CompareModel
- {
- LeftId = id,
- RightId = rightId
- };
+ ataDevice.ATA = master;
+ }
- Ata left = _context.Ata.FirstOrDefault(l => l.Id == id);
- Ata right = _context.Ata.FirstOrDefault(r => r.Id == rightId);
+ foreach(Device atapiDevice in _context.Devices.Where(d => d.ATAPI.Id == slaveId))
+ {
+ atapiDevice.ATAPI = master;
+ }
- if(left is null)
- {
- model.ErrorMessage = $"ATA with id {id} has not been found";
- model.HasError = true;
+ foreach(UploadedReport ataReport in _context.Reports.Where(d => d.ATA.Id == slaveId))
+ {
+ ataReport.ATA = master;
+ }
- return View(model);
- }
+ foreach(UploadedReport atapiReport in _context.Reports.Where(d => d.ATAPI.Id == slaveId))
+ {
+ atapiReport.ATAPI = master;
+ }
- if(right is null)
- {
- model.ErrorMessage = $"ATA with id {rightId} has not been found";
- model.HasError = true;
+ foreach(TestedMedia testedMedia in _context.TestedMedia.Where(d => d.AtaId == slaveId))
+ {
+ testedMedia.AtaId = masterId;
+ _context.Update(testedMedia);
+ }
- return View(model);
- }
+ if(master.ReadCapabilities is null &&
+ slave.ReadCapabilities != null)
+ master.ReadCapabilities = slave.ReadCapabilities;
- Identify.IdentifyDevice? leftNullable = left.IdentifyDevice;
- Identify.IdentifyDevice? rightNullable = right.IdentifyDevice;
- model.ValueNames = new List();
- model.LeftValues = new List();
- model.RightValues = new List();
+ _context.Ata.Remove(slave);
- if(!leftNullable.HasValue &&
- !rightNullable.HasValue)
- {
- model.AreEqual = true;
+ _context.SaveChanges();
- return View(model);
- }
+ return RedirectToAction(nameof(Index));
+ }
- if(leftNullable.HasValue &&
- !rightNullable.HasValue)
- {
- model.ValueNames.Add("Decoded");
- model.LeftValues.Add("decoded");
- model.RightValues.Add("null");
+ public IActionResult Compare(int id, int rightId)
+ {
+ var model = new CompareModel
+ {
+ LeftId = id,
+ RightId = rightId
+ };
- return View(model);
- }
+ Ata left = _context.Ata.FirstOrDefault(l => l.Id == id);
+ Ata right = _context.Ata.FirstOrDefault(r => r.Id == rightId);
- if(!leftNullable.HasValue)
- {
- model.ValueNames.Add("Decoded");
- model.LeftValues.Add("null");
- model.RightValues.Add("decoded");
-
- return View(model);
- }
-
- Identify.IdentifyDevice leftValue = left.IdentifyDevice.Value;
- Identify.IdentifyDevice rightValue = right.IdentifyDevice.Value;
-
- foreach(FieldInfo fieldInfo in leftValue.GetType().GetFields())
- {
- object lv = fieldInfo.GetValue(leftValue);
- object rv = fieldInfo.GetValue(rightValue);
-
- if(fieldInfo.FieldType.IsArray)
- {
- var la = lv as Array;
- var ra = rv as Array;
-
- switch(la)
- {
- case null when ra is null: continue;
- case null:
- model.ValueNames.Add(fieldInfo.Name);
- model.LeftValues.Add("null");
- model.RightValues.Add("[]");
-
- continue;
- }
-
- if(ra is null)
- {
- model.ValueNames.Add(fieldInfo.Name);
- model.LeftValues.Add("[]");
- model.RightValues.Add("null");
-
- continue;
- }
-
- List |
|