Allow callers to set source and machine index

This commit is contained in:
Matt Nadareski
2026-04-16 13:27:29 -04:00
parent 334ab130da
commit 8f746824d6
5 changed files with 251 additions and 96 deletions

View File

@@ -451,7 +451,8 @@ namespace SabreTools.Metadata.DatFiles
.Contains(mergeTag))
{
item.Value.MachineIndex = cloneOfMachine.Key;
ItemsDB.AddItem(item.Value, cloneOfMachine.Key, source.Key);
item.Value.SourceIndex = source.Key;
ItemsDB.AddItemInternal(item.Value);
}
// If there is no merge tag, add to parent
@@ -461,7 +462,8 @@ namespace SabreTools.Metadata.DatFiles
.Contains(disk.Name))
{
item.Value.MachineIndex = cloneOfMachine.Key;
ItemsDB.AddItem(item.Value, cloneOfMachine.Key, source.Key);
item.Value.SourceIndex = source.Key;
ItemsDB.AddItemInternal(item.Value);
}
}
@@ -489,7 +491,8 @@ namespace SabreTools.Metadata.DatFiles
rom.Name = $"{machineName}\\{rom.Name}";
item.Value.MachineIndex = cloneOfMachine.Key;
ItemsDB.AddItem(item.Value, cloneOfMachine.Key, source.Key);
item.Value.SourceIndex = source.Key;
ItemsDB.AddItemInternal(item.Value);
}
// If the parent doesn't already contain this item, add to subfolder of parent
@@ -499,7 +502,8 @@ namespace SabreTools.Metadata.DatFiles
rom.Name = $"{machineName}\\{rom.Name}";
item.Value.MachineIndex = cloneOfMachine.Key;
ItemsDB.AddItem(item.Value, cloneOfMachine.Key, source.Key);
item.Value.SourceIndex = source.Key;
ItemsDB.AddItemInternal(item.Value);
}
}
@@ -510,7 +514,8 @@ namespace SabreTools.Metadata.DatFiles
item.Value.SetName($"{machineName}\\{item.Value.GetName()}");
item.Value.MachineIndex = cloneOfMachine.Key;
ItemsDB.AddItem(item.Value, cloneOfMachine.Key, source.Key);
item.Value.SourceIndex = source.Key;
ItemsDB.AddItemInternal(item.Value);
}
// Remove the current item
@@ -609,10 +614,13 @@ namespace SabreTools.Metadata.DatFiles
foreach (var item in parentItems)
{
DatItem datItem = (DatItem)item.Value.Clone();
datItem.MachineIndex = machine.Key;
datItem.SourceIndex = source.Key;
if (items.Values.Any(i => i.GetName()?.ToLowerInvariant() == datItem.GetName()?.ToLowerInvariant())
&& items.Values.Any(i => i == datItem))
{
ItemsDB.AddItem(datItem, machine.Key, source.Key);
ItemsDB.AddItemInternal(datItem);
}
}
@@ -874,7 +882,10 @@ namespace SabreTools.Metadata.DatFiles
// Clone the item and then add it
DatItem datItem = (DatItem)item.Clone();
ItemsDB.AddItem(datItem, machine.Key, source.Key);
datItem.MachineIndex = machine.Key;
datItem.SourceIndex = source.Key;
ItemsDB.AddItemInternal(datItem);
}
}
}
@@ -884,8 +895,14 @@ namespace SabreTools.Metadata.DatFiles
{
if (!deviceReferences.Contains(deviceReference))
{
var deviceRef = new DeviceRef { Name = deviceReference };
ItemsDB.AddItem(deviceRef, machine.Key, source.Key);
var deviceRef = new DeviceRef
{
MachineIndex = machine.Key,
SourceIndex = source.Key,
Name = deviceReference,
};
ItemsDB.AddItemInternal(deviceRef);
}
}
}
@@ -929,7 +946,10 @@ namespace SabreTools.Metadata.DatFiles
// Clone the item and then add it
DatItem datItem = (DatItem)item.Clone();
ItemsDB.AddItem(datItem, machine.Key, source.Key);
datItem.MachineIndex = machine.Key;
datItem.SourceIndex = source.Key;
ItemsDB.AddItemInternal(datItem);
}
}
}
@@ -939,11 +959,21 @@ namespace SabreTools.Metadata.DatFiles
{
if (!slotOptions.Contains(slotOption))
{
var slotOptionItem = new SlotOption { DevName = slotOption };
var slotOptionItem = new SlotOption
{
MachineIndex = machine.Key,
SourceIndex = source.Key,
DevName = slotOption,
};
var slotItem = new Slot { SlotOption = [slotOptionItem] };
var slotItem = new Slot
{
MachineIndex = machine.Key,
SourceIndex = source.Key,
SlotOption = [slotOptionItem],
};
ItemsDB.AddItem(slotItem, machine.Key, source.Key);
ItemsDB.AddItemInternal(slotItem);
}
}
}
@@ -1027,10 +1057,13 @@ namespace SabreTools.Metadata.DatFiles
foreach (var item in parentItems)
{
DatItem datItem = (DatItem)item.Value.Clone();
datItem.MachineIndex = machine.Key;
datItem.SourceIndex = source.Key;
if (items.Any(i => i.Value.GetName() == datItem.GetName())
&& items.Any(i => i.Value == datItem))
{
ItemsDB.AddItem(datItem, machine.Key, source.Key);
ItemsDB.AddItemInternal(datItem);
}
}
}

View File

@@ -227,7 +227,11 @@ namespace SabreTools.Metadata.DatFiles
/// <returns>The index for the added item, -1 on error</returns>
public long AddItemDB(DatItem item, long machineIndex, long sourceIndex, bool statsOnly)
{
return ItemsDB.AddItem(item, machineIndex, sourceIndex, statsOnly);
// TODO: Have the callers of this method set them instead
item.MachineIndex = machineIndex;
item.SourceIndex = sourceIndex;
return ItemsDB.AddItem(item, statsOnly);
}
/// <summary>

View File

@@ -157,11 +157,9 @@ namespace SabreTools.Metadata.DatFiles
/// Add a DatItem to the dictionary after validation
/// </summary>
/// <param name="item">Item data to validate</param>
/// <param name="machineIndex">Index of the machine related to the item</param>
/// <param name="sourceIndex">Index of the source related to the item</param>
/// <param name="statsOnly">True to only add item statistics while parsing, false otherwise</param>
/// <returns>The index for the added item, -1 on error</returns>
public long AddItem(DatItem item, long machineIndex, long sourceIndex, bool statsOnly)
public long AddItem(DatItem item, bool statsOnly)
{
// If we have a Disk, File, Media, or Rom, clean the hash data
if (item is Disk disk)
@@ -261,7 +259,7 @@ namespace SabreTools.Metadata.DatFiles
}
else
{
return AddItem(item, machineIndex, sourceIndex);
return AddItemInternal(item);
}
}
@@ -517,12 +515,8 @@ namespace SabreTools.Metadata.DatFiles
/// <summary>
/// Add an item, returning the insert index
/// </summary>
internal long AddItem(DatItem item, long machineIndex, long sourceIndex)
internal long AddItemInternal(DatItem item)
{
// Add the machine and source index
item.MachineIndex = machineIndex;
item.SourceIndex = sourceIndex;
#if NET40_OR_GREATER || NETCOREAPP || NETSTANDARD2_0_OR_GREATER
// Add the item with a new index
long index = Interlocked.Increment(ref _itemIndex) - 1;
@@ -586,20 +580,9 @@ namespace SabreTools.Metadata.DatFiles
Sort(ref sortedList, false);
sortedList = Merge(sortedList);
// Get all existing mappings
List<ItemMappings> currentMappings = sortedList.ConvertAll(item =>
{
return new ItemMappings(
item.Value,
GetMachineForItem(item.Key).Key,
GetSourceForItem(item.Key).Key
);
});
// Add the list back to the dictionary
RemoveBucket(key);
currentMappings.ForEach(map =>
AddItem(map.Item, map.MachineId, map.SourceId));
sortedList.ForEach(item => AddItemInternal(item.Value));
#if NET40_OR_GREATER || NETCOREAPP || NETSTANDARD2_0_OR_GREATER
});
#else

View File

@@ -1,12 +0,0 @@
namespace SabreTools.Metadata.DatFiles
{
/// <summary>
/// Class used during deduplication
/// </summary>
public struct ItemMappings(DatItems.DatItem item, long machineId, long sourceId)
{
public DatItems.DatItem Item = item;
public long MachineId = machineId;
public long SourceId = sourceId;
}
}