diff --git a/.idea/.idea.DiscImageChef/.idea/contentModel.xml b/.idea/.idea.DiscImageChef/.idea/contentModel.xml index 596b31d4c..2dafa9b32 100644 --- a/.idea/.idea.DiscImageChef/.idea/contentModel.xml +++ b/.idea/.idea.DiscImageChef/.idea/contentModel.xml @@ -324,9 +324,12 @@ + + + @@ -1821,9 +1824,13 @@ + + + + @@ -1866,7 +1873,6 @@ - diff --git a/DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj b/DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj index 42305f78a..26f69da3b 100644 --- a/DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj +++ b/DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj @@ -76,6 +76,7 @@ + diff --git a/DiscImageChef.CommonTypes/Metadata/CdOffset.cs b/DiscImageChef.CommonTypes/Metadata/CdOffset.cs new file mode 100644 index 000000000..f6f20d41f --- /dev/null +++ b/DiscImageChef.CommonTypes/Metadata/CdOffset.cs @@ -0,0 +1,11 @@ +namespace DiscImageChef.CommonTypes.Metadata +{ + public class CdOffset + { + public string Manufacturer { get; set; } + public string Model { get; set; } + public short Offset { get; set; } + public int Submissions { get; set; } + public float Agreement { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Core/DiscImageChef.Core.csproj.DotSettings b/DiscImageChef.Core/DiscImageChef.Core.csproj.DotSettings new file mode 100644 index 000000000..827beb421 --- /dev/null +++ b/DiscImageChef.Core/DiscImageChef.Core.csproj.DotSettings @@ -0,0 +1,2 @@ + + Experimental \ No newline at end of file diff --git a/DiscImageChef.Database/Context.cs b/DiscImageChef.Database/Context.cs index 2b5407768..82fff0d77 100644 --- a/DiscImageChef.Database/Context.cs +++ b/DiscImageChef.Database/Context.cs @@ -56,6 +56,7 @@ namespace DiscImageChef.Database public DbSet Versions { get; set; } public DbSet UsbVendors { get; set; } public DbSet UsbProducts { get; set; } + public DbSet CdOffsets { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { diff --git a/DiscImageChef.Database/DiscImageChef.Database.csproj b/DiscImageChef.Database/DiscImageChef.Database.csproj index 885cd04f1..9e8ca2896 100644 --- a/DiscImageChef.Database/DiscImageChef.Database.csproj +++ b/DiscImageChef.Database/DiscImageChef.Database.csproj @@ -84,7 +84,10 @@ + + + diff --git a/DiscImageChef.Database/Migrations/20181225002740_AddCdOffsets.Designer.cs b/DiscImageChef.Database/Migrations/20181225002740_AddCdOffsets.Designer.cs new file mode 100644 index 000000000..529979024 --- /dev/null +++ b/DiscImageChef.Database/Migrations/20181225002740_AddCdOffsets.Designer.cs @@ -0,0 +1,1425 @@ +// +using System; +using DiscImageChef.Database; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +namespace DiscImageChef.Database.Migrations +{ + [DbContext(typeof(DicContext))] + [Migration("20181225002740_AddCdOffsets")] + partial class AddCdOffsets + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "2.1.4-rtm-31024"); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Ata", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Identify"); + + b.Property("ReadCapabilitiesId"); + + b.HasKey("Id"); + + b.HasIndex("ReadCapabilitiesId"); + + b.ToTable("Ata"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.BlockDescriptor", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BlockLength"); + + b.Property("BlockLengthSql"); + + b.Property("Blocks"); + + b.Property("BlocksSql"); + + b.Property("Density"); + + b.Property("ScsiModeId"); + + b.HasKey("Id"); + + b.HasIndex("ScsiModeId"); + + b.ToTable("BlockDescriptor"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Chs", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Cylinders"); + + b.Property("CylindersSql"); + + b.Property("Heads"); + + b.Property("HeadsSql"); + + b.Property("Sectors"); + + b.Property("SectorsSql"); + + b.HasKey("Id"); + + b.ToTable("Chs"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.DensityCode", b => + { + b.Property("Code") + .ValueGeneratedOnAdd(); + + b.Property("SscSupportedMediaId"); + + b.HasKey("Code"); + + b.HasIndex("SscSupportedMediaId"); + + b.ToTable("DensityCode"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.FireWire", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Manufacturer"); + + b.Property("Product"); + + b.Property("ProductID"); + + b.Property("ProductIDSql"); + + b.Property("RemovableMedia"); + + b.Property("VendorID"); + + b.Property("VendorIDSql"); + + b.HasKey("Id"); + + b.ToTable("FireWire"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Mmc", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("FeaturesId"); + + b.Property("ModeSense2AData"); + + b.HasKey("Id"); + + b.HasIndex("FeaturesId"); + + b.ToTable("Mmc"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.MmcFeatures", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AACSVersion"); + + b.Property("AGIDs"); + + b.Property("BindingNonceBlocks"); + + b.Property("BlocksPerReadableUnit"); + + b.Property("BlocksPerReadableUnitSql"); + + b.Property("BufferUnderrunFreeInDVD"); + + b.Property("BufferUnderrunFreeInSAO"); + + b.Property("BufferUnderrunFreeInTAO"); + + b.Property("CPRMVersion"); + + b.Property("CSSVersion"); + + b.Property("CanAudioScan"); + + b.Property("CanEject"); + + b.Property("CanEraseSector"); + + b.Property("CanExpandBDRESpareArea"); + + b.Property("CanFormat"); + + b.Property("CanFormatBDREWithoutSpare"); + + b.Property("CanFormatCert"); + + b.Property("CanFormatFRF"); + + b.Property("CanFormatQCert"); + + b.Property("CanFormatRRM"); + + b.Property("CanGenerateBindingNonce"); + + b.Property("CanLoad"); + + b.Property("CanMuteSeparateChannels"); + + b.Property("CanOverwriteSAOTrack"); + + b.Property("CanOverwriteTAOTrack"); + + b.Property("CanPlayCDAudio"); + + b.Property("CanPseudoOverwriteBDR"); + + b.Property("CanReadAllDualR"); + + b.Property("CanReadAllDualRW"); + + b.Property("CanReadBD"); + + b.Property("CanReadBDR"); + + b.Property("CanReadBDRE1"); + + b.Property("CanReadBDRE2"); + + b.Property("CanReadBDROM"); + + b.Property("CanReadBluBCA"); + + b.Property("CanReadCD"); + + b.Property("CanReadCDMRW"); + + b.Property("CanReadCPRM_MKB"); + + b.Property("CanReadDDCD"); + + b.Property("CanReadDVD"); + + b.Property("CanReadDVDPlusMRW"); + + b.Property("CanReadDVDPlusR"); + + b.Property("CanReadDVDPlusRDL"); + + b.Property("CanReadDVDPlusRW"); + + b.Property("CanReadDVDPlusRWDL"); + + b.Property("CanReadDriveAACSCertificate"); + + b.Property("CanReadHDDVD"); + + b.Property("CanReadHDDVDR"); + + b.Property("CanReadHDDVDRAM"); + + b.Property("CanReadLeadInCDText"); + + b.Property("CanReadOldBDR"); + + b.Property("CanReadOldBDRE"); + + b.Property("CanReadOldBDROM"); + + b.Property("CanReadSpareAreaInformation"); + + b.Property("CanReportDriveSerial"); + + b.Property("CanReportMediaSerial"); + + b.Property("CanTestWriteDDCDR"); + + b.Property("CanTestWriteDVD"); + + b.Property("CanTestWriteInSAO"); + + b.Property("CanTestWriteInTAO"); + + b.Property("CanUpgradeFirmware"); + + b.Property("CanWriteBD"); + + b.Property("CanWriteBDR"); + + b.Property("CanWriteBDRE1"); + + b.Property("CanWriteBDRE2"); + + b.Property("CanWriteBusEncryptedBlocks"); + + b.Property("CanWriteCDMRW"); + + b.Property("CanWriteCDRW"); + + b.Property("CanWriteCDRWCAV"); + + b.Property("CanWriteCDSAO"); + + b.Property("CanWriteCDTAO"); + + b.Property("CanWriteCSSManagedDVD"); + + b.Property("CanWriteDDCDR"); + + b.Property("CanWriteDDCDRW"); + + b.Property("CanWriteDVDPlusMRW"); + + b.Property("CanWriteDVDPlusR"); + + b.Property("CanWriteDVDPlusRDL"); + + b.Property("CanWriteDVDPlusRW"); + + b.Property("CanWriteDVDPlusRWDL"); + + b.Property("CanWriteDVDR"); + + b.Property("CanWriteDVDRDL"); + + b.Property("CanWriteDVDRW"); + + b.Property("CanWriteHDDVDR"); + + b.Property("CanWriteHDDVDRAM"); + + b.Property("CanWriteOldBDR"); + + b.Property("CanWriteOldBDRE"); + + b.Property("CanWritePackedSubchannelInTAO"); + + b.Property("CanWriteRWSubchannelInSAO"); + + b.Property("CanWriteRWSubchannelInTAO"); + + b.Property("CanWriteRaw"); + + b.Property("CanWriteRawMultiSession"); + + b.Property("CanWriteRawSubchannelInTAO"); + + b.Property("ChangerIsSideChangeCapable"); + + b.Property("ChangerSlots"); + + b.Property("ChangerSupportsDiscPresent"); + + b.Property("DBML"); + + b.Property("DVDMultiRead"); + + b.Property("EmbeddedChanger"); + + b.Property("ErrorRecoveryPage"); + + b.Property("FirmwareDate"); + + b.Property("LoadingMechanismType"); + + b.Property("Locked"); + + b.Property("LogicalBlockSize"); + + b.Property("LogicalBlockSizeSql"); + + b.Property("MultiRead"); + + b.Property("PhysicalInterfaceStandardNumber"); + + b.Property("PhysicalInterfaceStandardNumberSql"); + + b.Property("PreventJumper"); + + b.Property("SupportsAACS"); + + b.Property("SupportsBusEncryption"); + + b.Property("SupportsC2"); + + b.Property("SupportsCPRM"); + + b.Property("SupportsCSS"); + + b.Property("SupportsDAP"); + + b.Property("SupportsDeviceBusyEvent"); + + b.Property("SupportsHybridDiscs"); + + b.Property("SupportsModePage1Ch"); + + b.Property("SupportsOSSC"); + + b.Property("SupportsPWP"); + + b.Property("SupportsSWPP"); + + b.Property("SupportsSecurDisc"); + + b.Property("SupportsSeparateVolume"); + + b.Property("SupportsVCPS"); + + b.Property("SupportsWriteInhibitDCB"); + + b.Property("SupportsWriteProtectPAC"); + + b.Property("VolumeLevels"); + + b.Property("VolumeLevelsSql"); + + b.HasKey("Id"); + + b.ToTable("MmcFeatures"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.MmcSd", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("CID"); + + b.Property("CSD"); + + b.Property("ExtendedCSD"); + + b.Property("OCR"); + + b.Property("SCR"); + + b.HasKey("Id"); + + b.ToTable("MmcSd"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Pcmcia", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("CIS"); + + b.Property("CardCode"); + + b.Property("CardCodeSql"); + + b.Property("Compliance"); + + b.Property("Manufacturer"); + + b.Property("ManufacturerCode"); + + b.Property("ManufacturerCodeSql"); + + b.Property("ProductName"); + + b.HasKey("Id"); + + b.ToTable("Pcmcia"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Scsi", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("InquiryData"); + + b.Property("ModeSense10Data"); + + b.Property("ModeSense6Data"); + + b.Property("ModeSenseId"); + + b.Property("MultiMediaDeviceId"); + + b.Property("ReadCapabilitiesId"); + + b.Property("SequentialDeviceId"); + + b.Property("SupportsModeSense10"); + + b.Property("SupportsModeSense6"); + + b.Property("SupportsModeSubpages"); + + b.HasKey("Id"); + + b.HasIndex("ModeSenseId"); + + b.HasIndex("MultiMediaDeviceId"); + + b.HasIndex("ReadCapabilitiesId"); + + b.HasIndex("SequentialDeviceId"); + + b.ToTable("Scsi"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.ScsiMode", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BlankCheckEnabled"); + + b.Property("BufferedMode"); + + b.Property("DPOandFUA"); + + b.Property("MediumType"); + + b.Property("Speed"); + + b.Property("WriteProtected"); + + b.HasKey("Id"); + + b.ToTable("ScsiMode"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.ScsiPage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ScsiId"); + + b.Property("ScsiModeId"); + + b.Property("page"); + + b.Property("subpage"); + + b.Property("value"); + + b.HasKey("Id"); + + b.HasIndex("ScsiId"); + + b.HasIndex("ScsiModeId"); + + b.ToTable("ScsiPage"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Ssc", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BlockSizeGranularity"); + + b.Property("MaxBlockLength"); + + b.Property("MaxBlockLengthSql"); + + b.Property("MinBlockLength"); + + b.Property("MinBlockLengthSql"); + + b.HasKey("Id"); + + b.ToTable("Ssc"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.SscSupportedMedia", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Description"); + + b.Property("Length"); + + b.Property("LengthSql"); + + b.Property("MediumType"); + + b.Property("Name"); + + b.Property("Organization"); + + b.Property("SscId"); + + b.Property("TestedSequentialMediaId"); + + b.Property("Width"); + + b.Property("WidthSql"); + + b.HasKey("Id"); + + b.HasIndex("SscId"); + + b.HasIndex("TestedSequentialMediaId"); + + b.ToTable("SscSupportedMedia"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.SupportedDensity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BitsPerMm"); + + b.Property("BitsPerMmSql"); + + b.Property("Capacity"); + + b.Property("CapacitySql"); + + b.Property("DefaultDensity"); + + b.Property("Description"); + + b.Property("Duplicate"); + + b.Property("Name"); + + b.Property("Organization"); + + b.Property("PrimaryCode"); + + b.Property("SecondaryCode"); + + b.Property("SscId"); + + b.Property("TestedSequentialMediaId"); + + b.Property("Tracks"); + + b.Property("TracksSql"); + + b.Property("Width"); + + b.Property("WidthSql"); + + b.Property("Writable"); + + b.HasKey("Id"); + + b.HasIndex("SscId"); + + b.HasIndex("TestedSequentialMediaId"); + + b.ToTable("SupportedDensity"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.TestedMedia", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AtaId"); + + b.Property("BlockSize"); + + b.Property("BlockSizeSql"); + + b.Property("Blocks"); + + b.Property("BlocksSql"); + + b.Property("CHSId"); + + b.Property("CanReadAACS"); + + b.Property("CanReadADIP"); + + b.Property("CanReadATIP"); + + b.Property("CanReadBCA"); + + b.Property("CanReadC2Pointers"); + + b.Property("CanReadCMI"); + + b.Property("CanReadCorrectedSubchannel"); + + b.Property("CanReadCorrectedSubchannelWithC2"); + + b.Property("CanReadDCB"); + + b.Property("CanReadDDS"); + + b.Property("CanReadDMI"); + + b.Property("CanReadDiscInformation"); + + b.Property("CanReadFirstTrackPreGap"); + + b.Property("CanReadFullTOC"); + + b.Property("CanReadHDCMI"); + + b.Property("CanReadLayerCapacity"); + + b.Property("CanReadLeadIn"); + + b.Property("CanReadLeadOut"); + + b.Property("CanReadMediaID"); + + b.Property("CanReadMediaSerial"); + + b.Property("CanReadPAC"); + + b.Property("CanReadPFI"); + + b.Property("CanReadPMA"); + + b.Property("CanReadPQSubchannel"); + + b.Property("CanReadPQSubchannelWithC2"); + + b.Property("CanReadPRI"); + + b.Property("CanReadRWSubchannel"); + + b.Property("CanReadRWSubchannelWithC2"); + + b.Property("CanReadRecordablePFI"); + + b.Property("CanReadSpareAreaInformation"); + + b.Property("CanReadTOC"); + + b.Property("CurrentCHSId"); + + b.Property("Density"); + + b.Property("IdentifyData"); + + b.Property("LBA48Sectors"); + + b.Property("LBA48SectorsSql"); + + b.Property("LBASectors"); + + b.Property("LBASectorsSql"); + + b.Property("LogicalAlignment"); + + b.Property("LogicalAlignmentSql"); + + b.Property("LongBlockSize"); + + b.Property("LongBlockSizeSql"); + + b.Property("Manufacturer"); + + b.Property("MediaIsRecognized"); + + b.Property("MediumType"); + + b.Property("MediumTypeName"); + + b.Property("MmcId"); + + b.Property("ModeSense10Data"); + + b.Property("ModeSense6Data"); + + b.Property("Model"); + + b.Property("NominalRotationRate"); + + b.Property("NominalRotationRateSql"); + + b.Property("PhysicalBlockSize"); + + b.Property("PhysicalBlockSizeSql"); + + b.Property("ScsiId"); + + b.Property("SolidStateDevice"); + + b.Property("SupportsHLDTSTReadRawDVD"); + + b.Property("SupportsNECReadCDDA"); + + b.Property("SupportsPioneerReadCDDA"); + + b.Property("SupportsPioneerReadCDDAMSF"); + + b.Property("SupportsPlextorReadCDDA"); + + b.Property("SupportsPlextorReadRawDVD"); + + b.Property("SupportsRead10"); + + b.Property("SupportsRead12"); + + b.Property("SupportsRead16"); + + b.Property("SupportsRead6"); + + b.Property("SupportsReadCapacity"); + + b.Property("SupportsReadCapacity16"); + + b.Property("SupportsReadCd"); + + b.Property("SupportsReadCdMsf"); + + b.Property("SupportsReadCdMsfRaw"); + + b.Property("SupportsReadCdRaw"); + + b.Property("SupportsReadDma"); + + b.Property("SupportsReadDmaLba"); + + b.Property("SupportsReadDmaLba48"); + + b.Property("SupportsReadDmaRetry"); + + b.Property("SupportsReadDmaRetryLba"); + + b.Property("SupportsReadLba"); + + b.Property("SupportsReadLba48"); + + b.Property("SupportsReadLong"); + + b.Property("SupportsReadLong16"); + + b.Property("SupportsReadLongLba"); + + b.Property("SupportsReadLongRetry"); + + b.Property("SupportsReadLongRetryLba"); + + b.Property("SupportsReadRetry"); + + b.Property("SupportsReadRetryLba"); + + b.Property("SupportsReadSectors"); + + b.Property("SupportsSeek"); + + b.Property("SupportsSeekLba"); + + b.Property("UnformattedBPS"); + + b.Property("UnformattedBPSSql"); + + b.Property("UnformattedBPT"); + + b.Property("UnformattedBPTSql"); + + b.HasKey("Id"); + + b.HasIndex("AtaId"); + + b.HasIndex("CHSId"); + + b.HasIndex("CurrentCHSId"); + + b.HasIndex("MmcId"); + + b.HasIndex("ScsiId"); + + b.ToTable("TestedMedia"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.TestedSequentialMedia", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("CanReadMediaSerial"); + + b.Property("Density"); + + b.Property("Manufacturer"); + + b.Property("MediaIsRecognized"); + + b.Property("MediumType"); + + b.Property("MediumTypeName"); + + b.Property("ModeSense10Data"); + + b.Property("ModeSense6Data"); + + b.Property("Model"); + + b.Property("SscId"); + + b.HasKey("Id"); + + b.HasIndex("SscId"); + + b.ToTable("TestedSequentialMedia"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Usb", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Descriptors"); + + b.Property("Manufacturer"); + + b.Property("Product"); + + b.Property("ProductID"); + + b.Property("ProductIDSql"); + + b.Property("RemovableMedia"); + + b.Property("VendorID"); + + b.Property("VendorIDSql"); + + b.HasKey("Id"); + + b.ToTable("Usb"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.CdOffset", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AddedWhen"); + + b.Property("Agreement"); + + b.Property("Manufacturer"); + + b.Property("Model"); + + b.Property("ModifiedWhen"); + + b.Property("Offset"); + + b.Property("Submissions"); + + b.HasKey("Id"); + + b.ToTable("CdOffsets"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Command", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("Name"); + + b.Property("Synchronized"); + + b.HasKey("Id"); + + b.ToTable("Commands"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Device", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ATAId"); + + b.Property("ATAPIId"); + + b.Property("CompactFlash"); + + b.Property("FireWireId"); + + b.Property("LastSynchronized"); + + b.Property("Manufacturer"); + + b.Property("Model"); + + b.Property("MultiMediaCardId"); + + b.Property("PCMCIAId"); + + b.Property("Revision"); + + b.Property("SCSIId"); + + b.Property("SecureDigitalId"); + + b.Property("Type"); + + b.Property("USBId"); + + b.HasKey("Id"); + + b.HasIndex("ATAId"); + + b.HasIndex("ATAPIId"); + + b.HasIndex("FireWireId"); + + b.HasIndex("MultiMediaCardId"); + + b.HasIndex("PCMCIAId"); + + b.HasIndex("SCSIId"); + + b.HasIndex("SecureDigitalId"); + + b.HasIndex("USBId"); + + b.ToTable("Devices"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.DeviceStat", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Bus"); + + b.Property("Manufacturer"); + + b.Property("Model"); + + b.Property("Revision"); + + b.Property("Synchronized"); + + b.HasKey("Id"); + + b.ToTable("SeenDevices"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Filesystem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("Name"); + + b.Property("Synchronized"); + + b.HasKey("Id"); + + b.ToTable("Filesystems"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Filter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("Name"); + + b.Property("Synchronized"); + + b.HasKey("Id"); + + b.ToTable("Filters"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Media", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("Real"); + + b.Property("Synchronized"); + + b.Property("Type"); + + b.HasKey("Id"); + + b.ToTable("Medias"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.MediaFormat", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("Name"); + + b.Property("Synchronized"); + + b.HasKey("Id"); + + b.ToTable("MediaFormats"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.OperatingSystem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("Name"); + + b.Property("Synchronized"); + + b.Property("Version"); + + b.HasKey("Id"); + + b.ToTable("OperatingSystems"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Partition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("Name"); + + b.Property("Synchronized"); + + b.HasKey("Id"); + + b.ToTable("Partitions"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Report", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ATAId"); + + b.Property("ATAPIId"); + + b.Property("CompactFlash"); + + b.Property("Created"); + + b.Property("FireWireId"); + + b.Property("Manufacturer"); + + b.Property("Model"); + + b.Property("MultiMediaCardId"); + + b.Property("PCMCIAId"); + + b.Property("Revision"); + + b.Property("SCSIId"); + + b.Property("SecureDigitalId"); + + b.Property("Type"); + + b.Property("USBId"); + + b.Property("Uploaded"); + + b.HasKey("Id"); + + b.HasIndex("ATAId"); + + b.HasIndex("ATAPIId"); + + b.HasIndex("FireWireId"); + + b.HasIndex("MultiMediaCardId"); + + b.HasIndex("PCMCIAId"); + + b.HasIndex("SCSIId"); + + b.HasIndex("SecureDigitalId"); + + b.HasIndex("USBId"); + + b.ToTable("Reports"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.UsbProduct", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AddedWhen"); + + b.Property("ModifiedWhen"); + + b.Property("Product"); + + b.Property("ProductId"); + + b.Property("VendorId"); + + b.HasKey("Id"); + + b.HasIndex("VendorId"); + + b.ToTable("UsbProducts"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.UsbVendor", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AddedWhen"); + + b.Property("ModifiedWhen"); + + b.Property("Vendor"); + + b.HasKey("Id"); + + b.ToTable("UsbVendors"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Version", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("Synchronized"); + + b.Property("Value"); + + b.HasKey("Id"); + + b.ToTable("Versions"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Ata", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.TestedMedia", "ReadCapabilities") + .WithMany() + .HasForeignKey("ReadCapabilitiesId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.BlockDescriptor", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.ScsiMode") + .WithMany("BlockDescriptors") + .HasForeignKey("ScsiModeId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.DensityCode", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.SscSupportedMedia") + .WithMany("DensityCodes") + .HasForeignKey("SscSupportedMediaId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Mmc", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.MmcFeatures", "Features") + .WithMany() + .HasForeignKey("FeaturesId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Scsi", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.ScsiMode", "ModeSense") + .WithMany() + .HasForeignKey("ModeSenseId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Mmc", "MultiMediaDevice") + .WithMany() + .HasForeignKey("MultiMediaDeviceId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.TestedMedia", "ReadCapabilities") + .WithMany() + .HasForeignKey("ReadCapabilitiesId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ssc", "SequentialDevice") + .WithMany() + .HasForeignKey("SequentialDeviceId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.ScsiPage", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.Scsi") + .WithMany("EVPDPages") + .HasForeignKey("ScsiId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.ScsiMode") + .WithMany("ModePages") + .HasForeignKey("ScsiModeId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.SscSupportedMedia", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ssc") + .WithMany("SupportedMediaTypes") + .HasForeignKey("SscId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.TestedSequentialMedia") + .WithMany("SupportedMediaTypes") + .HasForeignKey("TestedSequentialMediaId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.SupportedDensity", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ssc") + .WithMany("SupportedDensities") + .HasForeignKey("SscId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.TestedSequentialMedia") + .WithMany("SupportedDensities") + .HasForeignKey("TestedSequentialMediaId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.TestedMedia", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ata") + .WithMany("RemovableMedias") + .HasForeignKey("AtaId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Chs", "CHS") + .WithMany() + .HasForeignKey("CHSId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Chs", "CurrentCHS") + .WithMany() + .HasForeignKey("CurrentCHSId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Mmc") + .WithMany("TestedMedia") + .HasForeignKey("MmcId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Scsi") + .WithMany("RemovableMedias") + .HasForeignKey("ScsiId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.TestedSequentialMedia", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ssc") + .WithMany("TestedMedia") + .HasForeignKey("SscId"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Device", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ata", "ATA") + .WithMany() + .HasForeignKey("ATAId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ata", "ATAPI") + .WithMany() + .HasForeignKey("ATAPIId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.FireWire", "FireWire") + .WithMany() + .HasForeignKey("FireWireId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.MmcSd", "MultiMediaCard") + .WithMany() + .HasForeignKey("MultiMediaCardId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Pcmcia", "PCMCIA") + .WithMany() + .HasForeignKey("PCMCIAId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Scsi", "SCSI") + .WithMany() + .HasForeignKey("SCSIId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.MmcSd", "SecureDigital") + .WithMany() + .HasForeignKey("SecureDigitalId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Usb", "USB") + .WithMany() + .HasForeignKey("USBId"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Report", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ata", "ATA") + .WithMany() + .HasForeignKey("ATAId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ata", "ATAPI") + .WithMany() + .HasForeignKey("ATAPIId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.FireWire", "FireWire") + .WithMany() + .HasForeignKey("FireWireId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.MmcSd", "MultiMediaCard") + .WithMany() + .HasForeignKey("MultiMediaCardId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Pcmcia", "PCMCIA") + .WithMany() + .HasForeignKey("PCMCIAId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Scsi", "SCSI") + .WithMany() + .HasForeignKey("SCSIId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.MmcSd", "SecureDigital") + .WithMany() + .HasForeignKey("SecureDigitalId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Usb", "USB") + .WithMany() + .HasForeignKey("USBId"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.UsbProduct", b => + { + b.HasOne("DiscImageChef.Database.Models.UsbVendor", "Vendor") + .WithMany("Products") + .HasForeignKey("VendorId") + .OnDelete(DeleteBehavior.Cascade); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/DiscImageChef.Database/Migrations/20181225002740_AddCdOffsets.cs b/DiscImageChef.Database/Migrations/20181225002740_AddCdOffsets.cs new file mode 100644 index 000000000..9c43cf948 --- /dev/null +++ b/DiscImageChef.Database/Migrations/20181225002740_AddCdOffsets.cs @@ -0,0 +1,30 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace DiscImageChef.Database.Migrations +{ + public partial class AddCdOffsets : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable("CdOffsets", + table => new + { + Manufacturer = table.Column(nullable: true), + Model = table.Column(nullable: true), + Offset = table.Column(nullable: false), + Submissions = table.Column(nullable: false), + Agreement = table.Column(nullable: false), + Id = table.Column(nullable: false) + .Annotation("Sqlite:Autoincrement", true), + AddedWhen = table.Column(nullable: false), + ModifiedWhen = table.Column(nullable: false) + }, constraints: table => { table.PrimaryKey("PK_CdOffsets", x => x.Id); }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable("CdOffsets"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Database/Migrations/DicContextModelSnapshot.cs b/DiscImageChef.Database/Migrations/DicContextModelSnapshot.cs index 14c4cc4e1..6149df69c 100644 --- a/DiscImageChef.Database/Migrations/DicContextModelSnapshot.cs +++ b/DiscImageChef.Database/Migrations/DicContextModelSnapshot.cs @@ -886,6 +886,29 @@ namespace DiscImageChef.Database.Migrations b.ToTable("Usb"); }); + modelBuilder.Entity("DiscImageChef.Database.Models.CdOffset", b => + { + b.Property("Id").ValueGeneratedOnAdd(); + + b.Property("AddedWhen"); + + b.Property("Agreement"); + + b.Property("Manufacturer"); + + b.Property("Model"); + + b.Property("ModifiedWhen"); + + b.Property("Offset"); + + b.Property("Submissions"); + + b.HasKey("Id"); + + b.ToTable("CdOffsets"); + }); + modelBuilder.Entity("DiscImageChef.Database.Models.Command", b => { b.Property("Id").ValueGeneratedOnAdd(); diff --git a/DiscImageChef.Database/Models/CdOffset.cs b/DiscImageChef.Database/Models/CdOffset.cs new file mode 100644 index 000000000..19300f101 --- /dev/null +++ b/DiscImageChef.Database/Models/CdOffset.cs @@ -0,0 +1,25 @@ +using System; +using System.ComponentModel.DataAnnotations.Schema; + +namespace DiscImageChef.Database.Models +{ + public class CdOffset : CommonTypes.Metadata.CdOffset + { + public CdOffset() { } + + public CdOffset(string manufacturer, string model, short offset, int submissions, float agreement) + { + Manufacturer = manufacturer; + Model = model; + Offset = offset; + Submissions = submissions; + Agreement = agreement; + AddedWhen = ModifiedWhen = DateTime.UtcNow; + } + + public int Id { get; set; } + public DateTime AddedWhen { get; set; } + [Index] + public DateTime ModifiedWhen { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server.Task/Program.cs b/DiscImageChef.Server.Task/Program.cs index 2cb51a9d4..774a752fc 100644 --- a/DiscImageChef.Server.Task/Program.cs +++ b/DiscImageChef.Server.Task/Program.cs @@ -175,6 +175,19 @@ namespace DiscImageChef.Server.Task #endif Console.WriteLine("{0}: Exception {1} filling USB IDs...", DateTime.UtcNow, ex); } + + Console.WriteLine("{0}: Fixing all devices without modification time...", DateTime.UtcNow); + start = DateTime.UtcNow; + foreach(Device device in ctx.Devices.Where(d => d.ModifiedWhen == null)) + device.ModifiedWhen = device.AddedWhen; + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds); + + Console.WriteLine("{0}: Committing changes...", DateTime.UtcNow); + start = DateTime.UtcNow; + ctx.SaveChanges(); + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds); } } } \ No newline at end of file diff --git a/DiscImageChef.Server/DiscImageChef.Server.csproj b/DiscImageChef.Server/DiscImageChef.Server.csproj index 4e0e495ae..a208385ee 100644 --- a/DiscImageChef.Server/DiscImageChef.Server.csproj +++ b/DiscImageChef.Server/DiscImageChef.Server.csproj @@ -225,7 +225,12 @@ 201812241719441_FixUsbIdsAndIndexes.cs + + + 201812250223002_AddCdOffsets.cs + + @@ -331,6 +336,9 @@ 201812241719441_FixUsbIdsAndIndexes.cs + + 201812250223002_AddCdOffsets.cs + 10.0 diff --git a/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.Designer.cs b/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.Designer.cs new file mode 100644 index 000000000..5505506ee --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class AddCdOffsets : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(AddCdOffsets)); + + string IMigrationMetadata.Id + { + get { return "201812250223002_AddCdOffsets"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.cs b/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.cs new file mode 100644 index 000000000..3a0a7e130 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.cs @@ -0,0 +1,40 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class AddCdOffsets : DbMigration + { + public override void Up() + { + CreateTable("dbo.CompactDiscOffsets", + c => new + { + Id = c.Int(false, true), + AddedWhen = c.DateTime(false, 0), + ModifiedWhen = c.DateTime(false, 0), + Manufacturer = c.String(unicode: false), + Model = c.String(unicode: false), + Offset = c.Short(false), + Submissions = c.Int(false), + Agreement = c.Single(false) + }).PrimaryKey(t => t.Id).Index(t => t.ModifiedWhen); + + AddColumn("dbo.Devices", "ModifiedWhen", c => c.DateTime(precision: 0)); + AddColumn("dbo.Devices", "CdOffset_Id", c => c.Int()); + CreateIndex("dbo.Devices", "ModifiedWhen"); + CreateIndex("dbo.Devices", "CdOffset_Id"); + AddForeignKey("dbo.Devices", "CdOffset_Id", "dbo.CompactDiscOffsets", "Id"); + } + + public override void Down() + { + DropForeignKey("dbo.Devices", "CdOffset_Id", "dbo.CompactDiscOffsets"); + DropIndex("dbo.Devices", new[] {"CdOffset_Id"}); + DropIndex("dbo.Devices", new[] {"ModifiedWhen"}); + DropIndex("dbo.CompactDiscOffsets", new[] {"ModifiedWhen"}); + DropColumn("dbo.Devices", "CdOffset_Id"); + DropColumn("dbo.Devices", "ModifiedWhen"); + DropTable("dbo.CompactDiscOffsets"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.resx b/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.resx new file mode 100644 index 000000000..84ac80a64 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Models/CdOffset.cs b/DiscImageChef.Server/Models/CdOffset.cs new file mode 100644 index 000000000..ec90fd2c6 --- /dev/null +++ b/DiscImageChef.Server/Models/CdOffset.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using DiscImageChef.CommonTypes.Metadata; + +namespace DiscImageChef.Server.Models +{ + public class CompactDiscOffset : CdOffset + { + public CompactDiscOffset() { } + + public CompactDiscOffset(string manufacturer, string model, short offset, int submissions, float agreement) + { + Manufacturer = manufacturer; + Model = model; + Offset = offset; + Submissions = submissions; + Agreement = agreement; + AddedWhen = ModifiedWhen = DateTime.UtcNow; + } + + public int Id { get; set; } + public DateTime AddedWhen { get; set; } + [Index] + public DateTime ModifiedWhen { get; set; } + public virtual ICollection Devices { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/Context.cs b/DiscImageChef.Server/Models/Context.cs index ec6313247..e9378bc08 100644 --- a/DiscImageChef.Server/Models/Context.cs +++ b/DiscImageChef.Server/Models/Context.cs @@ -38,18 +38,19 @@ namespace DiscImageChef.Server.Models [DbConfigurationType(typeof(MySqlEFConfiguration))] public sealed class DicServerContext : DbContext { - public DbSet Devices { get; set; } - public DbSet Reports { get; set; } - public DbSet Commands { get; set; } - public DbSet DeviceStats { get; set; } - public DbSet Filesystems { get; set; } - public DbSet Filters { get; set; } - public DbSet Medias { get; set; } - public DbSet MediaFormats { get; set; } - public DbSet OperatingSystems { get; set; } - public DbSet Partitions { get; set; } - public DbSet Versions { get; set; } - public DbSet UsbVendors { get; set; } - public DbSet UsbProducts { get; set; } + public DbSet Devices { get; set; } + public DbSet Reports { get; set; } + public DbSet Commands { get; set; } + public DbSet DeviceStats { get; set; } + public DbSet Filesystems { get; set; } + public DbSet Filters { get; set; } + public DbSet Medias { get; set; } + public DbSet MediaFormats { get; set; } + public DbSet OperatingSystems { get; set; } + public DbSet Partitions { get; set; } + public DbSet Versions { get; set; } + public DbSet UsbVendors { get; set; } + public DbSet UsbProducts { get; set; } + public DbSet CdOffsets { get; set; } } } \ No newline at end of file diff --git a/DiscImageChef.Server/Models/Device.cs b/DiscImageChef.Server/Models/Device.cs index 50c3997c2..680cb10b0 100644 --- a/DiscImageChef.Server/Models/Device.cs +++ b/DiscImageChef.Server/Models/Device.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel.DataAnnotations.Schema; using DiscImageChef.CommonTypes.Metadata; namespace DiscImageChef.Server.Models @@ -17,6 +18,7 @@ namespace DiscImageChef.Server.Models CompactFlash = report.CompactFlash; FireWire = report.FireWire; AddedWhen = DateTime.UtcNow; + ModifiedWhen = DateTime.UtcNow; MultiMediaCard = report.MultiMediaCard; PCMCIA = report.PCMCIA; SCSI = report.SCSI; @@ -29,5 +31,8 @@ namespace DiscImageChef.Server.Models } public DateTime AddedWhen { get; set; } + [Index] + public DateTime? ModifiedWhen { get; set; } + public virtual CompactDiscOffset CdOffset { get; set; } } } \ No newline at end of file