private void Update(EntityContext entityContext, PackageArchiveEntity existing, PackageArchiveEntity latest) { Mapper.Map(latest, existing); latest.PackageEntries.Sort((a, b) => a.Index.CompareTo(b.Index)); existing.PackageEntries.Sort((a, b) => a.Index.CompareTo(b.Index)); for (var index = 0; index < latest.PackageEntries.Count; index++) { var latestEntry = latest.PackageEntries[index]; if (index < existing.PackageEntries.Count) { var existingEntry = existing.PackageEntries[index]; if (existingEntry.Index != (ulong)index) { throw new InvalidOperationException("One of the package archive entries seems to have an incorrect index."); } Mapper.Map(latestEntry, existingEntry); } else if (index == existing.PackageEntries.Count) { latestEntry.PackageKey = existing.PackageKey; latestEntry.PackageArchive = existing; existing.PackageEntries.Add(latestEntry); entityContext.PackageEntries.Add(latestEntry); } else { throw new InvalidOperationException("The list of existing package entries should have grown."); } } while (latest.PackageEntries.Count < existing.PackageEntries.Count) { var last = existing.PackageEntries.Last(); existing.PackageEntries.RemoveAt(existing.PackageEntries.Count - 1); entityContext.PackageEntries.Remove(last); } }
private PackageArchiveEntity Initialize(PackageArchiveEntity entity, PackageArchiveMetadata metadata) { entity.Size = metadata.Size; entity.EntryCount = metadata.ZipDirectory.Entries.Count; entity.CentralDirectorySize = metadata.ZipDirectory.CentralDirectorySize; entity.Comment = metadata.ZipDirectory.Comment; entity.CommentSize = metadata.ZipDirectory.CommentSize; entity.DiskWithStartOfCentralDirectory = metadata.ZipDirectory.DiskWithStartOfCentralDirectory; entity.EntriesForWholeCentralDirectory = metadata.ZipDirectory.EntriesForWholeCentralDirectory; entity.EntriesInThisDisk = metadata.ZipDirectory.EntriesInThisDisk; entity.NumberOfThisDisk = metadata.ZipDirectory.NumberOfThisDisk; entity.OffsetAfterEndOfCentralDirectory = metadata.ZipDirectory.OffsetAfterEndOfCentralDirectory; entity.OffsetOfCentralDirectory = metadata.ZipDirectory.OffsetOfCentralDirectory; entity.Zip64CentralDirectorySize = metadata.ZipDirectory.Zip64?.CentralDirectorySize; entity.Zip64DiskWithStartOfCentralDirectory = metadata.ZipDirectory.Zip64?.DiskWithStartOfCentralDirectory; entity.Zip64DiskWithStartOfEndOfCentralDirectory = metadata.ZipDirectory.Zip64?.DiskWithStartOfEndOfCentralDirectory; entity.Zip64EndOfCentralDirectoryOffset = metadata.ZipDirectory.Zip64?.EndOfCentralDirectoryOffset; entity.Zip64EntriesForWholeCentralDirectory = metadata.ZipDirectory.Zip64?.EntriesForWholeCentralDirectory; entity.Zip64EntriesInThisDisk = metadata.ZipDirectory.Zip64?.EntriesInThisDisk; entity.Zip64NumberOfThisDisk = metadata.ZipDirectory.Zip64?.NumberOfThisDisk; entity.Zip64OffsetAfterEndOfCentralDirectoryLocator = metadata.ZipDirectory.Zip64?.OffsetAfterEndOfCentralDirectoryLocator; entity.Zip64OffsetOfCentralDirectory = metadata.ZipDirectory.Zip64?.OffsetOfCentralDirectory; entity.Zip64SizeOfCentralDirectoryRecord = metadata.ZipDirectory.Zip64?.SizeOfCentralDirectoryRecord; entity.Zip64TotalNumberOfDisks = metadata.ZipDirectory.Zip64?.TotalNumberOfDisks; entity.Zip64VersionMadeBy = metadata.ZipDirectory.Zip64?.VersionMadeBy; entity.Zip64VersionToExtract = metadata.ZipDirectory.Zip64?.VersionToExtract; // Make sure the entries are sorted by index. if (entity.PackageEntries == null) { entity.PackageEntries = new List <PackageEntryEntity>(); } entity.PackageEntries.Sort((a, b) => a.Index.CompareTo(b.Index)); for (var index = 0; index < metadata.ZipDirectory.Entries.Count; index++) { var entryMetadata = metadata.ZipDirectory.Entries[index]; PackageEntryEntity entryEntity; if (index < entity.PackageEntries.Count) { entryEntity = entity.PackageEntries[index]; if (entryEntity.Index != (ulong)index) { throw new InvalidOperationException("One of the package archive entries seems to have an incorrect index."); } } else if (index == entity.PackageEntries.Count) { entryEntity = new PackageEntryEntity { PackageArchive = entity, Index = (ulong)index, }; entity.PackageEntries.Add(entryEntity); } else { throw new InvalidOperationException("The list of existing package entries should have grown."); } Initialize(entryEntity, entryMetadata); } entity .PackageEntries .RemoveAll(x => x.Index >= (ulong)metadata.ZipDirectory.Entries.Count); return(entity); }