2024-03-13 01:22:59 -04:00
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using SabreTools.Core.Tools;
|
|
|
|
|
using SabreTools.DatItems;
|
|
|
|
|
using SabreTools.DatItems.Formats;
|
|
|
|
|
using SabreTools.Hashing;
|
|
|
|
|
|
|
|
|
|
namespace SabreTools.DatFiles
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Statistics wrapper for outputting
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class DatStatistics
|
|
|
|
|
{
|
|
|
|
|
#region Private instance variables
|
|
|
|
|
|
2025-01-29 20:51:03 -05:00
|
|
|
/// <summary>
|
|
|
|
|
/// Number of items for each hash type
|
|
|
|
|
/// </summary>
|
|
|
|
|
private readonly Dictionary<HashType, long> _hashCounts = [];
|
|
|
|
|
|
2025-01-29 20:49:24 -05:00
|
|
|
/// <summary>
|
|
|
|
|
/// Number of items for each item type
|
|
|
|
|
/// </summary>
|
|
|
|
|
private readonly Dictionary<ItemType, long> _itemCounts = [];
|
|
|
|
|
|
2025-01-29 20:51:03 -05:00
|
|
|
/// <summary>
|
|
|
|
|
/// Number of items for each item status
|
|
|
|
|
/// </summary>
|
|
|
|
|
private readonly Dictionary<ItemStatus, long> _statusCounts = [];
|
|
|
|
|
|
2024-03-13 01:22:59 -04:00
|
|
|
/// <summary>
|
|
|
|
|
/// Lock for statistics calculation
|
|
|
|
|
/// </summary>
|
|
|
|
|
private readonly object statsLock = new();
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Fields
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Overall item count
|
|
|
|
|
/// </summary>
|
|
|
|
|
public long TotalCount { get; private set; } = 0;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Number of machines
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <remarks>Special count only used by statistics output</remarks>
|
|
|
|
|
public long GameCount { get; set; } = 0;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Total uncompressed size
|
|
|
|
|
/// </summary>
|
|
|
|
|
public long TotalSize { get; private set; } = 0;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Number of items with the remove flag
|
|
|
|
|
/// </summary>
|
|
|
|
|
public long RemovedCount { get; private set; } = 0;
|
2024-07-17 15:46:42 -04:00
|
|
|
|
2024-03-13 01:22:59 -04:00
|
|
|
/// <summary>
|
|
|
|
|
/// Name to display on output
|
|
|
|
|
/// </summary>
|
|
|
|
|
public string? DisplayName { get; set; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Total machine count to use on output
|
|
|
|
|
/// </summary>
|
2024-10-24 01:51:04 -04:00
|
|
|
public long MachineCount { get; set; }
|
2024-03-13 01:22:59 -04:00
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Determines if statistics are for a directory or not
|
|
|
|
|
/// </summary>
|
2024-10-24 01:51:04 -04:00
|
|
|
public readonly bool IsDirectory;
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Constructors
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Default constructor
|
|
|
|
|
/// </summary>
|
|
|
|
|
public DatStatistics()
|
|
|
|
|
{
|
|
|
|
|
DisplayName = null;
|
|
|
|
|
MachineCount = 0;
|
|
|
|
|
IsDirectory = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Constructor for aggregate data
|
|
|
|
|
/// </summary>
|
|
|
|
|
public DatStatistics(string? displayName, bool isDirectory)
|
|
|
|
|
{
|
|
|
|
|
DisplayName = displayName;
|
|
|
|
|
MachineCount = 0;
|
|
|
|
|
IsDirectory = isDirectory;
|
|
|
|
|
}
|
2024-03-13 01:22:59 -04:00
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Accessors
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2025-02-10 12:51:40 -05:00
|
|
|
/// Add to the statistics for a given DatItem
|
2024-03-13 01:22:59 -04:00
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="item">Item to add info from</param>
|
|
|
|
|
public void AddItemStatistics(DatItem item)
|
|
|
|
|
{
|
|
|
|
|
lock (statsLock)
|
|
|
|
|
{
|
|
|
|
|
// No matter what the item is, we increment the count
|
|
|
|
|
TotalCount++;
|
|
|
|
|
|
|
|
|
|
// Increment removal count
|
|
|
|
|
if (item.GetBoolFieldValue(DatItem.RemoveKey) == true)
|
|
|
|
|
RemovedCount++;
|
|
|
|
|
|
|
|
|
|
// Increment the item count for the type
|
2025-05-11 22:55:38 -04:00
|
|
|
AddItemCount(item.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsItemType());
|
2024-03-13 01:22:59 -04:00
|
|
|
|
|
|
|
|
// Some item types require special processing
|
|
|
|
|
switch (item)
|
|
|
|
|
{
|
|
|
|
|
case Disk disk:
|
2025-02-10 12:51:40 -05:00
|
|
|
AddItemStatistics(disk);
|
2024-03-13 01:22:59 -04:00
|
|
|
break;
|
2025-01-29 20:56:26 -05:00
|
|
|
case DatItems.Formats.File file:
|
2025-02-10 12:51:40 -05:00
|
|
|
AddItemStatistics(file);
|
2025-01-29 20:56:26 -05:00
|
|
|
break;
|
2024-03-13 01:22:59 -04:00
|
|
|
case Media media:
|
2025-02-10 12:51:40 -05:00
|
|
|
AddItemStatistics(media);
|
2024-03-13 01:22:59 -04:00
|
|
|
break;
|
|
|
|
|
case Rom rom:
|
2025-02-10 12:51:40 -05:00
|
|
|
AddItemStatistics(rom);
|
2024-03-13 01:22:59 -04:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-02 15:12:01 -04:00
|
|
|
/// <summary>
|
|
|
|
|
/// Add to the statistics for a given DatItem
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="item">Item to add info from</param>
|
|
|
|
|
public void AddItemStatistics(Models.Metadata.DatItem item)
|
|
|
|
|
{
|
|
|
|
|
lock (statsLock)
|
|
|
|
|
{
|
|
|
|
|
// No matter what the item is, we increment the count
|
|
|
|
|
TotalCount++;
|
|
|
|
|
|
|
|
|
|
// Increment removal count
|
|
|
|
|
if (item.ReadBool(DatItem.RemoveKey) == true)
|
|
|
|
|
RemovedCount++;
|
|
|
|
|
|
|
|
|
|
// Increment the item count for the type
|
2025-05-11 22:55:38 -04:00
|
|
|
AddItemCount(item.ReadString(Models.Metadata.DatItem.TypeKey).AsItemType());
|
2025-05-02 15:12:01 -04:00
|
|
|
|
|
|
|
|
// Some item types require special processing
|
|
|
|
|
switch (item)
|
|
|
|
|
{
|
|
|
|
|
case Models.Metadata.Disk disk:
|
|
|
|
|
AddItemStatistics(disk);
|
|
|
|
|
break;
|
|
|
|
|
case Models.Metadata.Media media:
|
|
|
|
|
AddItemStatistics(media);
|
|
|
|
|
break;
|
|
|
|
|
case Models.Metadata.Rom rom:
|
|
|
|
|
AddItemStatistics(rom);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-13 01:22:59 -04:00
|
|
|
/// <summary>
|
|
|
|
|
/// Add statistics from another DatStatistics object
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="stats">DatStatistics object to add from</param>
|
|
|
|
|
public void AddStatistics(DatStatistics stats)
|
|
|
|
|
{
|
|
|
|
|
TotalCount += stats.TotalCount;
|
|
|
|
|
|
|
|
|
|
// Loop through and add stats for all items
|
2025-01-29 20:49:24 -05:00
|
|
|
foreach (var itemCountKvp in stats._itemCounts)
|
2024-03-13 01:22:59 -04:00
|
|
|
{
|
|
|
|
|
AddItemCount(itemCountKvp.Key, itemCountKvp.Value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
GameCount += stats.GameCount;
|
|
|
|
|
|
|
|
|
|
TotalSize += stats.TotalSize;
|
|
|
|
|
|
|
|
|
|
// Individual hash counts
|
2025-01-29 20:51:03 -05:00
|
|
|
foreach (var hashCountKvp in stats._hashCounts)
|
2024-03-13 01:22:59 -04:00
|
|
|
{
|
|
|
|
|
AddHashCount(hashCountKvp.Key, hashCountKvp.Value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Individual status counts
|
2025-01-29 20:51:03 -05:00
|
|
|
foreach (var statusCountKvp in stats._statusCounts)
|
2024-03-13 01:22:59 -04:00
|
|
|
{
|
|
|
|
|
AddStatusCount(statusCountKvp.Key, statusCountKvp.Value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
RemovedCount += stats.RemovedCount;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Get the item count for a given hash type, defaulting to 0 if it does not exist
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="hashType">Hash type to retrieve</param>
|
|
|
|
|
/// <returns>The number of items with that hash, if it exists</returns>
|
|
|
|
|
public long GetHashCount(HashType hashType)
|
|
|
|
|
{
|
2025-01-29 20:51:03 -05:00
|
|
|
lock (_hashCounts)
|
2024-03-13 01:22:59 -04:00
|
|
|
{
|
2025-01-29 20:51:03 -05:00
|
|
|
if (!_hashCounts.ContainsKey(hashType))
|
2024-03-13 01:22:59 -04:00
|
|
|
return 0;
|
|
|
|
|
|
2025-01-29 20:51:03 -05:00
|
|
|
return _hashCounts[hashType];
|
2024-03-13 01:22:59 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Get the item count for a given item type, defaulting to 0 if it does not exist
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="itemType">Item type to retrieve</param>
|
|
|
|
|
/// <returns>The number of items of that type, if it exists</returns>
|
|
|
|
|
public long GetItemCount(ItemType itemType)
|
|
|
|
|
{
|
2025-01-29 20:49:24 -05:00
|
|
|
lock (_itemCounts)
|
2024-03-13 01:22:59 -04:00
|
|
|
{
|
2025-01-29 20:49:24 -05:00
|
|
|
if (!_itemCounts.ContainsKey(itemType))
|
2024-03-13 01:22:59 -04:00
|
|
|
return 0;
|
|
|
|
|
|
2025-01-29 20:49:24 -05:00
|
|
|
return _itemCounts[itemType];
|
2024-03-13 01:22:59 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Get the item count for a given item status, defaulting to 0 if it does not exist
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="itemStatus">Item status to retrieve</param>
|
|
|
|
|
/// <returns>The number of items of that type, if it exists</returns>
|
|
|
|
|
public long GetStatusCount(ItemStatus itemStatus)
|
|
|
|
|
{
|
2025-01-29 20:51:03 -05:00
|
|
|
lock (_statusCounts)
|
2024-03-13 01:22:59 -04:00
|
|
|
{
|
2025-01-29 20:51:03 -05:00
|
|
|
if (!_statusCounts.ContainsKey(itemStatus))
|
2024-03-13 01:22:59 -04:00
|
|
|
return 0;
|
|
|
|
|
|
2025-01-29 20:51:03 -05:00
|
|
|
return _statusCounts[itemStatus];
|
2024-03-13 01:22:59 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Remove from the statistics given a DatItem
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="item">Item to remove info for</param>
|
|
|
|
|
public void RemoveItemStatistics(DatItem item)
|
|
|
|
|
{
|
|
|
|
|
// If we have a null item, we can't do anything
|
|
|
|
|
if (item == null)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
lock (statsLock)
|
|
|
|
|
{
|
|
|
|
|
// No matter what the item is, we decrease the count
|
|
|
|
|
TotalCount--;
|
|
|
|
|
|
|
|
|
|
// Decrement removal count
|
|
|
|
|
if (item.GetBoolFieldValue(DatItem.RemoveKey) == true)
|
|
|
|
|
RemovedCount--;
|
|
|
|
|
|
|
|
|
|
// Decrement the item count for the type
|
2025-05-11 22:55:38 -04:00
|
|
|
RemoveItemCount(item.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsItemType());
|
2024-03-13 01:22:59 -04:00
|
|
|
|
|
|
|
|
// Some item types require special processing
|
|
|
|
|
switch (item)
|
|
|
|
|
{
|
|
|
|
|
case Disk disk:
|
2025-02-10 12:51:40 -05:00
|
|
|
RemoveItemStatistics(disk);
|
2024-03-13 01:22:59 -04:00
|
|
|
break;
|
2025-01-29 20:56:26 -05:00
|
|
|
case DatItems.Formats.File file:
|
2025-02-10 12:51:40 -05:00
|
|
|
RemoveItemStatistics(file);
|
2025-01-29 20:56:26 -05:00
|
|
|
break;
|
2024-03-13 01:22:59 -04:00
|
|
|
case Media media:
|
2025-02-10 12:51:40 -05:00
|
|
|
RemoveItemStatistics(media);
|
2024-03-13 01:22:59 -04:00
|
|
|
break;
|
|
|
|
|
case Rom rom:
|
2025-02-10 12:51:40 -05:00
|
|
|
RemoveItemStatistics(rom);
|
2024-03-13 01:22:59 -04:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-02 15:12:01 -04:00
|
|
|
/// <summary>
|
|
|
|
|
/// Remove from the statistics given a DatItem
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="item">Item to remove info for</param>
|
|
|
|
|
public void RemoveItemStatistics(Models.Metadata.DatItem item)
|
|
|
|
|
{
|
|
|
|
|
// If we have a null item, we can't do anything
|
|
|
|
|
if (item == null)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
lock (statsLock)
|
|
|
|
|
{
|
|
|
|
|
// No matter what the item is, we decrease the count
|
|
|
|
|
TotalCount--;
|
|
|
|
|
|
|
|
|
|
// Decrement removal count
|
|
|
|
|
if (item.ReadBool(DatItem.RemoveKey) == true)
|
|
|
|
|
RemovedCount--;
|
|
|
|
|
|
|
|
|
|
// Decrement the item count for the type
|
2025-05-11 22:55:38 -04:00
|
|
|
RemoveItemCount(item.ReadString(Models.Metadata.DatItem.TypeKey).AsItemType());
|
2025-05-02 15:12:01 -04:00
|
|
|
|
|
|
|
|
// Some item types require special processing
|
|
|
|
|
switch (item)
|
|
|
|
|
{
|
|
|
|
|
case Models.Metadata.Disk disk:
|
|
|
|
|
RemoveItemStatistics(disk);
|
|
|
|
|
break;
|
|
|
|
|
case Models.Metadata.Media media:
|
|
|
|
|
RemoveItemStatistics(media);
|
|
|
|
|
break;
|
|
|
|
|
case Models.Metadata.Rom rom:
|
|
|
|
|
RemoveItemStatistics(rom);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-13 01:22:59 -04:00
|
|
|
/// <summary>
|
|
|
|
|
/// Reset all statistics
|
|
|
|
|
/// </summary>
|
|
|
|
|
public void ResetStatistics()
|
|
|
|
|
{
|
2025-02-10 12:42:05 -05:00
|
|
|
_hashCounts.Clear();
|
2025-01-29 20:49:24 -05:00
|
|
|
_itemCounts.Clear();
|
2025-02-10 12:42:05 -05:00
|
|
|
_statusCounts.Clear();
|
|
|
|
|
|
|
|
|
|
TotalCount = 0;
|
2024-03-13 01:22:59 -04:00
|
|
|
GameCount = 0;
|
|
|
|
|
TotalSize = 0;
|
|
|
|
|
RemovedCount = 0;
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-29 20:52:40 -05:00
|
|
|
/// <summary>
|
|
|
|
|
/// Increment the hash count for a given hash type
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="hashType">Hash type to increment</param>
|
|
|
|
|
/// <param name="interval">Amount to increment by, defaults to 1</param>
|
|
|
|
|
private void AddHashCount(HashType hashType, long interval = 1)
|
|
|
|
|
{
|
|
|
|
|
lock (_hashCounts)
|
|
|
|
|
{
|
|
|
|
|
if (!_hashCounts.ContainsKey(hashType))
|
|
|
|
|
_hashCounts[hashType] = 0;
|
|
|
|
|
|
|
|
|
|
_hashCounts[hashType] += interval;
|
|
|
|
|
if (_hashCounts[hashType] < 0)
|
|
|
|
|
_hashCounts[hashType] = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Increment the item count for a given item type
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="itemType">Item type to increment</param>
|
|
|
|
|
/// <param name="interval">Amount to increment by, defaults to 1</param>
|
|
|
|
|
private void AddItemCount(ItemType itemType, long interval = 1)
|
|
|
|
|
{
|
|
|
|
|
lock (_itemCounts)
|
|
|
|
|
{
|
|
|
|
|
if (!_itemCounts.ContainsKey(itemType))
|
|
|
|
|
_itemCounts[itemType] = 0;
|
|
|
|
|
|
|
|
|
|
_itemCounts[itemType] += interval;
|
|
|
|
|
if (_itemCounts[itemType] < 0)
|
|
|
|
|
_itemCounts[itemType] = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-10 12:51:40 -05:00
|
|
|
/// <summary>
|
|
|
|
|
/// Add to the statistics for a given Disk
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="disk">Item to add info from</param>
|
|
|
|
|
private void AddItemStatistics(Disk disk)
|
|
|
|
|
{
|
2025-05-11 22:55:38 -04:00
|
|
|
if (disk.GetStringFieldValue(Models.Metadata.Disk.StatusKey).AsItemStatus() != ItemStatus.Nodump)
|
2025-02-10 12:51:40 -05:00
|
|
|
{
|
|
|
|
|
AddHashCount(HashType.MD5, string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.MD5Key)) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.SHA1, string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key)) ? 0 : 1);
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-11 22:55:38 -04:00
|
|
|
AddStatusCount(ItemStatus.BadDump, disk.GetStringFieldValue(Models.Metadata.Disk.StatusKey).AsItemStatus() == ItemStatus.BadDump ? 1 : 0);
|
|
|
|
|
AddStatusCount(ItemStatus.Good, disk.GetStringFieldValue(Models.Metadata.Disk.StatusKey).AsItemStatus() == ItemStatus.Good ? 1 : 0);
|
|
|
|
|
AddStatusCount(ItemStatus.Nodump, disk.GetStringFieldValue(Models.Metadata.Disk.StatusKey).AsItemStatus() == ItemStatus.Nodump ? 1 : 0);
|
|
|
|
|
AddStatusCount(ItemStatus.Verified, disk.GetStringFieldValue(Models.Metadata.Disk.StatusKey).AsItemStatus() == ItemStatus.Verified ? 1 : 0);
|
2025-02-10 12:51:40 -05:00
|
|
|
}
|
|
|
|
|
|
2025-05-02 15:12:01 -04:00
|
|
|
/// <summary>
|
|
|
|
|
/// Add to the statistics for a given Disk
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="disk">Item to add info from</param>
|
|
|
|
|
private void AddItemStatistics(Models.Metadata.Disk disk)
|
|
|
|
|
{
|
2025-05-11 22:55:38 -04:00
|
|
|
if (disk.ReadString(Models.Metadata.Disk.StatusKey).AsItemStatus() != ItemStatus.Nodump)
|
2025-05-02 15:12:01 -04:00
|
|
|
{
|
|
|
|
|
AddHashCount(HashType.MD5, string.IsNullOrEmpty(disk.ReadString(Models.Metadata.Disk.MD5Key)) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.SHA1, string.IsNullOrEmpty(disk.ReadString(Models.Metadata.Disk.SHA1Key)) ? 0 : 1);
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-11 22:55:38 -04:00
|
|
|
AddStatusCount(ItemStatus.BadDump, disk.ReadString(Models.Metadata.Disk.StatusKey).AsItemStatus() == ItemStatus.BadDump ? 1 : 0);
|
|
|
|
|
AddStatusCount(ItemStatus.Good, disk.ReadString(Models.Metadata.Disk.StatusKey).AsItemStatus() == ItemStatus.Good ? 1 : 0);
|
|
|
|
|
AddStatusCount(ItemStatus.Nodump, disk.ReadString(Models.Metadata.Disk.StatusKey).AsItemStatus() == ItemStatus.Nodump ? 1 : 0);
|
|
|
|
|
AddStatusCount(ItemStatus.Verified, disk.ReadString(Models.Metadata.Disk.StatusKey).AsItemStatus() == ItemStatus.Verified ? 1 : 0);
|
2025-05-02 15:12:01 -04:00
|
|
|
}
|
|
|
|
|
|
2025-02-10 12:51:40 -05:00
|
|
|
/// <summary>
|
|
|
|
|
/// Add to the statistics for a given File
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="file">Item to add info from</param>
|
|
|
|
|
private void AddItemStatistics(DatItems.Formats.File file)
|
|
|
|
|
{
|
2025-02-12 10:58:04 -05:00
|
|
|
TotalSize += file.Size ?? 0;
|
2025-02-10 12:51:40 -05:00
|
|
|
AddHashCount(HashType.CRC32, string.IsNullOrEmpty(file.CRC) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.MD5, string.IsNullOrEmpty(file.MD5) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.SHA1, string.IsNullOrEmpty(file.SHA1) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.SHA256, string.IsNullOrEmpty(file.SHA256) ? 0 : 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Add to the statistics for a given Media
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="media">Item to add info from</param>
|
|
|
|
|
private void AddItemStatistics(Media media)
|
|
|
|
|
{
|
|
|
|
|
AddHashCount(HashType.MD5, string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.MD5Key)) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.SHA1, string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SHA1Key)) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.SHA256, string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SHA256Key)) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.SpamSum, string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SpamSumKey)) ? 0 : 1);
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-02 15:12:01 -04:00
|
|
|
/// <summary>
|
|
|
|
|
/// Add to the statistics for a given Media
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="media">Item to add info from</param>
|
|
|
|
|
private void AddItemStatistics(Models.Metadata.Media media)
|
|
|
|
|
{
|
|
|
|
|
AddHashCount(HashType.MD5, string.IsNullOrEmpty(media.ReadString(Models.Metadata.Media.MD5Key)) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.SHA1, string.IsNullOrEmpty(media.ReadString(Models.Metadata.Media.SHA1Key)) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.SHA256, string.IsNullOrEmpty(media.ReadString(Models.Metadata.Media.SHA256Key)) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.SpamSum, string.IsNullOrEmpty(media.ReadString(Models.Metadata.Media.SpamSumKey)) ? 0 : 1);
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-10 12:51:40 -05:00
|
|
|
/// <summary>
|
|
|
|
|
/// Add to the statistics for a given Rom
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="rom">Item to add info from</param>
|
|
|
|
|
private void AddItemStatistics(Rom rom)
|
|
|
|
|
{
|
2025-05-11 22:55:38 -04:00
|
|
|
if (rom.GetStringFieldValue(Models.Metadata.Rom.StatusKey).AsItemStatus() != ItemStatus.Nodump)
|
2025-02-10 12:51:40 -05:00
|
|
|
{
|
|
|
|
|
TotalSize += rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) ?? 0;
|
|
|
|
|
AddHashCount(HashType.CRC32, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey)) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.MD2, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD2Key)) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.MD4, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD4Key)) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.MD5, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key)) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.SHA1, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key)) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.SHA256, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key)) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.SHA384, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA384Key)) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.SHA512, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA512Key)) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.SpamSum, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SpamSumKey)) ? 0 : 1);
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-11 22:55:38 -04:00
|
|
|
AddStatusCount(ItemStatus.BadDump, rom.GetStringFieldValue(Models.Metadata.Rom.StatusKey).AsItemStatus() == ItemStatus.BadDump ? 1 : 0);
|
|
|
|
|
AddStatusCount(ItemStatus.Good, rom.GetStringFieldValue(Models.Metadata.Rom.StatusKey).AsItemStatus() == ItemStatus.Good ? 1 : 0);
|
|
|
|
|
AddStatusCount(ItemStatus.Nodump, rom.GetStringFieldValue(Models.Metadata.Rom.StatusKey).AsItemStatus() == ItemStatus.Nodump ? 1 : 0);
|
|
|
|
|
AddStatusCount(ItemStatus.Verified, rom.GetStringFieldValue(Models.Metadata.Rom.StatusKey).AsItemStatus() == ItemStatus.Verified ? 1 : 0);
|
2025-02-10 12:51:40 -05:00
|
|
|
}
|
|
|
|
|
|
2025-05-02 15:12:01 -04:00
|
|
|
/// <summary>
|
|
|
|
|
/// Add to the statistics for a given Rom
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="rom">Item to add info from</param>
|
|
|
|
|
private void AddItemStatistics(Models.Metadata.Rom rom)
|
|
|
|
|
{
|
2025-05-11 22:55:38 -04:00
|
|
|
if (rom.ReadString(Models.Metadata.Rom.StatusKey).AsItemStatus() != ItemStatus.Nodump)
|
2025-05-02 15:12:01 -04:00
|
|
|
{
|
|
|
|
|
TotalSize += rom.ReadLong(Models.Metadata.Rom.SizeKey) ?? 0;
|
|
|
|
|
AddHashCount(HashType.CRC32, string.IsNullOrEmpty(rom.ReadString(Models.Metadata.Rom.CRCKey)) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.MD2, string.IsNullOrEmpty(rom.ReadString(Models.Metadata.Rom.MD2Key)) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.MD4, string.IsNullOrEmpty(rom.ReadString(Models.Metadata.Rom.MD4Key)) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.MD5, string.IsNullOrEmpty(rom.ReadString(Models.Metadata.Rom.MD5Key)) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.SHA1, string.IsNullOrEmpty(rom.ReadString(Models.Metadata.Rom.SHA1Key)) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.SHA256, string.IsNullOrEmpty(rom.ReadString(Models.Metadata.Rom.SHA256Key)) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.SHA384, string.IsNullOrEmpty(rom.ReadString(Models.Metadata.Rom.SHA384Key)) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.SHA512, string.IsNullOrEmpty(rom.ReadString(Models.Metadata.Rom.SHA512Key)) ? 0 : 1);
|
|
|
|
|
AddHashCount(HashType.SpamSum, string.IsNullOrEmpty(rom.ReadString(Models.Metadata.Rom.SpamSumKey)) ? 0 : 1);
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-11 22:55:38 -04:00
|
|
|
AddStatusCount(ItemStatus.BadDump, rom.ReadString(Models.Metadata.Rom.StatusKey).AsItemStatus() == ItemStatus.BadDump ? 1 : 0);
|
|
|
|
|
AddStatusCount(ItemStatus.Good, rom.ReadString(Models.Metadata.Rom.StatusKey).AsItemStatus() == ItemStatus.Good ? 1 : 0);
|
|
|
|
|
AddStatusCount(ItemStatus.Nodump, rom.ReadString(Models.Metadata.Rom.StatusKey).AsItemStatus() == ItemStatus.Nodump ? 1 : 0);
|
|
|
|
|
AddStatusCount(ItemStatus.Verified, rom.ReadString(Models.Metadata.Rom.StatusKey).AsItemStatus() == ItemStatus.Verified ? 1 : 0);
|
2025-05-02 15:12:01 -04:00
|
|
|
}
|
|
|
|
|
|
2025-01-29 20:52:40 -05:00
|
|
|
/// <summary>
|
|
|
|
|
/// Increment the item count for a given item status
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="itemStatus">Item type to increment</param>
|
|
|
|
|
/// <param name="interval">Amount to increment by, defaults to 1</param>
|
|
|
|
|
private void AddStatusCount(ItemStatus itemStatus, long interval = 1)
|
|
|
|
|
{
|
|
|
|
|
lock (_statusCounts)
|
|
|
|
|
{
|
|
|
|
|
if (!_statusCounts.ContainsKey(itemStatus))
|
|
|
|
|
_statusCounts[itemStatus] = 0;
|
|
|
|
|
|
|
|
|
|
_statusCounts[itemStatus] += interval;
|
|
|
|
|
if (_statusCounts[itemStatus] < 0)
|
|
|
|
|
_statusCounts[itemStatus] = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-13 01:22:59 -04:00
|
|
|
/// <summary>
|
|
|
|
|
/// Decrement the hash count for a given hash type
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="hashType">Hash type to increment</param>
|
|
|
|
|
/// <param name="interval">Amount to increment by, defaults to 1</param>
|
|
|
|
|
private void RemoveHashCount(HashType hashType, long interval = 1)
|
|
|
|
|
{
|
2025-01-29 20:51:03 -05:00
|
|
|
lock (_hashCounts)
|
2024-03-13 01:22:59 -04:00
|
|
|
{
|
2025-01-29 20:51:03 -05:00
|
|
|
if (!_hashCounts.ContainsKey(hashType))
|
2024-03-13 01:22:59 -04:00
|
|
|
return;
|
|
|
|
|
|
2025-01-29 20:51:03 -05:00
|
|
|
_hashCounts[hashType] -= interval;
|
|
|
|
|
if (_hashCounts[hashType] < 0)
|
|
|
|
|
_hashCounts[hashType] = 0;
|
2024-03-13 01:22:59 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Decrement the item count for a given item type
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="itemType">Item type to decrement</param>
|
|
|
|
|
/// <param name="interval">Amount to increment by, defaults to 1</param>
|
|
|
|
|
private void RemoveItemCount(ItemType itemType, long interval = 1)
|
|
|
|
|
{
|
2025-01-29 20:49:24 -05:00
|
|
|
lock (_itemCounts)
|
2024-03-13 01:22:59 -04:00
|
|
|
{
|
2025-01-29 20:49:24 -05:00
|
|
|
if (!_itemCounts.ContainsKey(itemType))
|
2024-03-13 01:22:59 -04:00
|
|
|
return;
|
|
|
|
|
|
2025-01-29 20:49:24 -05:00
|
|
|
_itemCounts[itemType] -= interval;
|
|
|
|
|
if (_itemCounts[itemType] < 0)
|
|
|
|
|
_itemCounts[itemType] = 0;
|
2024-03-13 01:22:59 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-10 12:51:40 -05:00
|
|
|
/// <summary>
|
|
|
|
|
/// Remove from the statistics given a Disk
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="disk">Item to remove info for</param>
|
|
|
|
|
private void RemoveItemStatistics(Disk disk)
|
|
|
|
|
{
|
2025-05-11 22:55:38 -04:00
|
|
|
if (disk.GetStringFieldValue(Models.Metadata.Disk.StatusKey).AsItemStatus() != ItemStatus.Nodump)
|
2025-02-10 12:51:40 -05:00
|
|
|
{
|
|
|
|
|
RemoveHashCount(HashType.MD5, string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.MD5Key)) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key)) ? 0 : 1);
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-11 22:55:38 -04:00
|
|
|
RemoveStatusCount(ItemStatus.BadDump, disk.GetStringFieldValue(Models.Metadata.Disk.StatusKey).AsItemStatus() == ItemStatus.BadDump ? 1 : 0);
|
|
|
|
|
RemoveStatusCount(ItemStatus.Good, disk.GetStringFieldValue(Models.Metadata.Disk.StatusKey).AsItemStatus() == ItemStatus.Good ? 1 : 0);
|
|
|
|
|
RemoveStatusCount(ItemStatus.Nodump, disk.GetStringFieldValue(Models.Metadata.Disk.StatusKey).AsItemStatus() == ItemStatus.Nodump ? 1 : 0);
|
|
|
|
|
RemoveStatusCount(ItemStatus.Verified, disk.GetStringFieldValue(Models.Metadata.Disk.StatusKey).AsItemStatus() == ItemStatus.Verified ? 1 : 0);
|
2025-02-10 12:51:40 -05:00
|
|
|
}
|
|
|
|
|
|
2025-05-02 15:12:01 -04:00
|
|
|
/// <summary>
|
|
|
|
|
/// Remove from the statistics given a Disk
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="disk">Item to remove info for</param>
|
|
|
|
|
private void RemoveItemStatistics(Models.Metadata.Disk disk)
|
|
|
|
|
{
|
2025-05-11 22:55:38 -04:00
|
|
|
if (disk.ReadString(Models.Metadata.Disk.StatusKey).AsItemStatus() != ItemStatus.Nodump)
|
2025-05-02 15:12:01 -04:00
|
|
|
{
|
|
|
|
|
RemoveHashCount(HashType.MD5, string.IsNullOrEmpty(disk.ReadString(Models.Metadata.Disk.MD5Key)) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(disk.ReadString(Models.Metadata.Disk.SHA1Key)) ? 0 : 1);
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-11 22:55:38 -04:00
|
|
|
RemoveStatusCount(ItemStatus.BadDump, disk.ReadString(Models.Metadata.Disk.StatusKey).AsItemStatus() == ItemStatus.BadDump ? 1 : 0);
|
|
|
|
|
RemoveStatusCount(ItemStatus.Good, disk.ReadString(Models.Metadata.Disk.StatusKey).AsItemStatus() == ItemStatus.Good ? 1 : 0);
|
|
|
|
|
RemoveStatusCount(ItemStatus.Nodump, disk.ReadString(Models.Metadata.Disk.StatusKey).AsItemStatus() == ItemStatus.Nodump ? 1 : 0);
|
|
|
|
|
RemoveStatusCount(ItemStatus.Verified, disk.ReadString(Models.Metadata.Disk.StatusKey).AsItemStatus() == ItemStatus.Verified ? 1 : 0);
|
2025-05-02 15:12:01 -04:00
|
|
|
}
|
|
|
|
|
|
2025-02-10 12:51:40 -05:00
|
|
|
/// <summary>
|
|
|
|
|
/// Remove from the statistics given a File
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="file">Item to remove info for</param>
|
|
|
|
|
private void RemoveItemStatistics(DatItems.Formats.File file)
|
|
|
|
|
{
|
2025-02-12 10:58:04 -05:00
|
|
|
TotalSize -= file.Size ?? 0;
|
2025-02-10 12:51:40 -05:00
|
|
|
RemoveHashCount(HashType.CRC32, string.IsNullOrEmpty(file.CRC) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.MD5, string.IsNullOrEmpty(file.MD5) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(file.SHA1) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.SHA256, string.IsNullOrEmpty(file.SHA256) ? 0 : 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Remove from the statistics given a Media
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="media">Item to remove info for</param>
|
|
|
|
|
private void RemoveItemStatistics(Media media)
|
|
|
|
|
{
|
|
|
|
|
RemoveHashCount(HashType.MD5, string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.MD5Key)) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SHA1Key)) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.SHA256, string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SHA256Key)) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.SpamSum, string.IsNullOrEmpty(media.GetStringFieldValue(Models.Metadata.Media.SpamSumKey)) ? 0 : 1);
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-02 15:12:01 -04:00
|
|
|
/// <summary>
|
|
|
|
|
/// Remove from the statistics given a Media
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="media">Item to remove info for</param>
|
|
|
|
|
private void RemoveItemStatistics(Models.Metadata.Media media)
|
|
|
|
|
{
|
|
|
|
|
RemoveHashCount(HashType.MD5, string.IsNullOrEmpty(media.ReadString(Models.Metadata.Media.MD5Key)) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(media.ReadString(Models.Metadata.Media.SHA1Key)) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.SHA256, string.IsNullOrEmpty(media.ReadString(Models.Metadata.Media.SHA256Key)) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.SpamSum, string.IsNullOrEmpty(media.ReadString(Models.Metadata.Media.SpamSumKey)) ? 0 : 1);
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-10 12:51:40 -05:00
|
|
|
/// <summary>
|
|
|
|
|
/// Remove from the statistics given a Rom
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="rom">Item to remove info for</param>
|
|
|
|
|
private void RemoveItemStatistics(Rom rom)
|
|
|
|
|
{
|
2025-05-11 22:55:38 -04:00
|
|
|
if (rom.GetStringFieldValue(Models.Metadata.Rom.StatusKey).AsItemStatus() != ItemStatus.Nodump)
|
2025-02-10 12:51:40 -05:00
|
|
|
{
|
|
|
|
|
TotalSize -= rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey) ?? 0;
|
|
|
|
|
RemoveHashCount(HashType.CRC32, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey)) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.MD2, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD2Key)) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.MD4, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD4Key)) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.MD5, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key)) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key)) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.SHA256, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key)) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.SHA384, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA384Key)) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.SHA512, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA512Key)) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.SpamSum, string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SpamSumKey)) ? 0 : 1);
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-11 22:55:38 -04:00
|
|
|
RemoveStatusCount(ItemStatus.BadDump, rom.GetStringFieldValue(Models.Metadata.Rom.StatusKey).AsItemStatus() == ItemStatus.BadDump ? 1 : 0);
|
|
|
|
|
RemoveStatusCount(ItemStatus.Good, rom.GetStringFieldValue(Models.Metadata.Rom.StatusKey).AsItemStatus() == ItemStatus.Good ? 1 : 0);
|
|
|
|
|
RemoveStatusCount(ItemStatus.Nodump, rom.GetStringFieldValue(Models.Metadata.Rom.StatusKey).AsItemStatus() == ItemStatus.Nodump ? 1 : 0);
|
|
|
|
|
RemoveStatusCount(ItemStatus.Verified, rom.GetStringFieldValue(Models.Metadata.Rom.StatusKey).AsItemStatus() == ItemStatus.Verified ? 1 : 0);
|
2025-02-10 12:51:40 -05:00
|
|
|
}
|
|
|
|
|
|
2025-05-02 15:12:01 -04:00
|
|
|
/// <summary>
|
|
|
|
|
/// Remove from the statistics given a Rom
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="rom">Item to remove info for</param>
|
|
|
|
|
private void RemoveItemStatistics(Models.Metadata.Rom rom)
|
|
|
|
|
{
|
2025-05-11 22:55:38 -04:00
|
|
|
if (rom.ReadString(Models.Metadata.Rom.StatusKey).AsItemStatus() != ItemStatus.Nodump)
|
2025-05-02 15:12:01 -04:00
|
|
|
{
|
|
|
|
|
TotalSize -= rom.ReadLong(Models.Metadata.Rom.SizeKey) ?? 0;
|
|
|
|
|
RemoveHashCount(HashType.CRC32, string.IsNullOrEmpty(rom.ReadString(Models.Metadata.Rom.CRCKey)) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.MD2, string.IsNullOrEmpty(rom.ReadString(Models.Metadata.Rom.MD2Key)) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.MD4, string.IsNullOrEmpty(rom.ReadString(Models.Metadata.Rom.MD4Key)) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.MD5, string.IsNullOrEmpty(rom.ReadString(Models.Metadata.Rom.MD5Key)) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.SHA1, string.IsNullOrEmpty(rom.ReadString(Models.Metadata.Rom.SHA1Key)) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.SHA256, string.IsNullOrEmpty(rom.ReadString(Models.Metadata.Rom.SHA256Key)) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.SHA384, string.IsNullOrEmpty(rom.ReadString(Models.Metadata.Rom.SHA384Key)) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.SHA512, string.IsNullOrEmpty(rom.ReadString(Models.Metadata.Rom.SHA512Key)) ? 0 : 1);
|
|
|
|
|
RemoveHashCount(HashType.SpamSum, string.IsNullOrEmpty(rom.ReadString(Models.Metadata.Rom.SpamSumKey)) ? 0 : 1);
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-11 22:55:38 -04:00
|
|
|
RemoveStatusCount(ItemStatus.BadDump, rom.ReadString(Models.Metadata.Rom.StatusKey).AsItemStatus() == ItemStatus.BadDump ? 1 : 0);
|
|
|
|
|
RemoveStatusCount(ItemStatus.Good, rom.ReadString(Models.Metadata.Rom.StatusKey).AsItemStatus() == ItemStatus.Good ? 1 : 0);
|
|
|
|
|
RemoveStatusCount(ItemStatus.Nodump, rom.ReadString(Models.Metadata.Rom.StatusKey).AsItemStatus() == ItemStatus.Nodump ? 1 : 0);
|
|
|
|
|
RemoveStatusCount(ItemStatus.Verified, rom.ReadString(Models.Metadata.Rom.StatusKey).AsItemStatus() == ItemStatus.Verified ? 1 : 0);
|
2025-05-02 15:12:01 -04:00
|
|
|
}
|
|
|
|
|
|
2024-03-13 01:22:59 -04:00
|
|
|
/// <summary>
|
|
|
|
|
/// Decrement the item count for a given item status
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="itemStatus">Item type to decrement</param>
|
|
|
|
|
/// <param name="interval">Amount to increment by, defaults to 1</param>
|
|
|
|
|
private void RemoveStatusCount(ItemStatus itemStatus, long interval = 1)
|
|
|
|
|
{
|
2025-01-29 20:51:03 -05:00
|
|
|
lock (_statusCounts)
|
2024-03-13 01:22:59 -04:00
|
|
|
{
|
2025-01-29 20:51:03 -05:00
|
|
|
if (!_statusCounts.ContainsKey(itemStatus))
|
2024-03-13 01:22:59 -04:00
|
|
|
return;
|
|
|
|
|
|
2025-01-29 20:51:03 -05:00
|
|
|
_statusCounts[itemStatus] -= interval;
|
|
|
|
|
if (_statusCounts[itemStatus] < 0)
|
|
|
|
|
_statusCounts[itemStatus] = 0;
|
2024-03-13 01:22:59 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
}
|