From 8f789484ca10e5f7b83c430a8427d366db459c9d Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Fri, 25 Jul 2025 22:55:30 +0100 Subject: [PATCH] Add support for uncompressed repository. --- RomRepoMgr.Core/Filesystem/Vfs.cs | 21 +++++++++++++++- RomRepoMgr.Core/Workers/Compression.cs | 25 ++++++++++++++----- RomRepoMgr.Core/Workers/FileExporter.cs | 16 ++++++++++++- RomRepoMgr.Core/Workers/FileImporter.cs | 32 ++++++++++++++++++------- RomRepoMgr.Settings/Settings.cs | 3 ++- 5 files changed, 79 insertions(+), 18 deletions(-) diff --git a/RomRepoMgr.Core/Filesystem/Vfs.cs b/RomRepoMgr.Core/Filesystem/Vfs.cs index bb39d0e..0040923 100644 --- a/RomRepoMgr.Core/Filesystem/Vfs.cs +++ b/RomRepoMgr.Core/Filesystem/Vfs.cs @@ -412,7 +412,26 @@ public class Vfs(ILoggerFactory loggerFactory) : IDisposable sha384B32[4].ToString(), sha384B32 + ".zst"); - if(!File.Exists(repoPath)) return -1; + if(!File.Exists(repoPath)) + { + repoPath = Path.Combine(Settings.Settings.Current.RepositoryPath, + "files", + sha384B32[0].ToString(), + sha384B32[1].ToString(), + sha384B32[2].ToString(), + sha384B32[3].ToString(), + sha384B32[4].ToString(), + sha384B32); + + if(!File.Exists(repoPath)) return -1; + + _lastHandle++; + handle = _lastHandle; + + _streamsCache[handle] = Stream.Synchronized(new FileStream(repoPath, FileMode.Open, FileAccess.Read)); + + return handle; + } _lastHandle++; handle = _lastHandle; diff --git a/RomRepoMgr.Core/Workers/Compression.cs b/RomRepoMgr.Core/Workers/Compression.cs index 6233082..8251331 100644 --- a/RomRepoMgr.Core/Workers/Compression.cs +++ b/RomRepoMgr.Core/Workers/Compression.cs @@ -53,14 +53,25 @@ public sealed class Compression Stream zStream; - if(Settings.Settings.Current.Compression == CompressionType.Zstd) + switch(Settings.Settings.Current.Compression) { - var zstdStream = new CompressionStream(outFs, 15); - zstdStream.SetParameter(ZSTD_cParameter.ZSTD_c_nbWorkers, Environment.ProcessorCount); - zStream = zstdStream; + case CompressionType.Zstd: + { + var zstdStream = new CompressionStream(outFs, 15); + zstdStream.SetParameter(ZSTD_cParameter.ZSTD_c_nbWorkers, Environment.ProcessorCount); + zStream = zstdStream; + + break; + } + case CompressionType.None: + zStream = outFs; + + break; + default: + zStream = new LZipStream(outFs, CompressionMode.Compress); + + break; } - else - zStream = new LZipStream(outFs, CompressionMode.Compress); byte[] buffer = new byte[BUFFER_SIZE]; @@ -110,6 +121,8 @@ public sealed class Compression zStream = new DecompressionStream(inFs); else if(Path.GetExtension(source) == ".lz") zStream = new LZipStream(inFs, CompressionMode.Decompress); + else if(string.IsNullOrWhiteSpace(Path.GetExtension(source))) + zStream = inFs; else throw new ArgumentException($"Invalid compression extension {Path.GetExtension(source)}"); diff --git a/RomRepoMgr.Core/Workers/FileExporter.cs b/RomRepoMgr.Core/Workers/FileExporter.cs index f26ce2e..1e14936 100644 --- a/RomRepoMgr.Core/Workers/FileExporter.cs +++ b/RomRepoMgr.Core/Workers/FileExporter.cs @@ -605,7 +605,21 @@ public class FileExporter(long romSetId, string outPath, ILoggerFactory loggerFa sha384B32 + ".zst"); if(!File.Exists(repoPath)) - throw new ArgumentException(string.Format(Localization.CannotFindHashInRepository, file.Sha256)); + { + repoPath = Path.Combine(Settings.Settings.Current.RepositoryPath, + "files", + sha384B32[0].ToString(), + sha384B32[1].ToString(), + sha384B32[2].ToString(), + sha384B32[3].ToString(), + sha384B32[4].ToString(), + sha384B32); + + return !File.Exists(repoPath) + ? throw new ArgumentException(string.Format(Localization.CannotFindHashInRepository, + file.Sha256)) + : new FileStream(repoPath, FileMode.Open, FileAccess.Read); + } inFs = new FileStream(repoPath, FileMode.Open, FileAccess.Read); diff --git a/RomRepoMgr.Core/Workers/FileImporter.cs b/RomRepoMgr.Core/Workers/FileImporter.cs index f9052c0..9d31e2f 100644 --- a/RomRepoMgr.Core/Workers/FileImporter.cs +++ b/RomRepoMgr.Core/Workers/FileImporter.cs @@ -554,9 +554,12 @@ public sealed class FileImporter if(!Directory.Exists(repoPath)) Directory.CreateDirectory(repoPath); - repoPath = Settings.Settings.Current.Compression == CompressionType.Zstd - ? Path.Combine(repoPath, sha384B32 + ".zst") - : Path.Combine(repoPath, sha384B32 + ".lz"); + repoPath = Settings.Settings.Current.Compression switch + { + CompressionType.Zstd => Path.Combine(repoPath, sha384B32 + ".zst"), + CompressionType.None => Path.Combine(repoPath, sha384B32), + _ => Path.Combine(repoPath, sha384B32 + ".lz") + }; if(dbFile.Crc32 == null) { @@ -614,14 +617,25 @@ public sealed class FileImporter Stream zStream; - if(Settings.Settings.Current.Compression == CompressionType.Zstd) + switch(Settings.Settings.Current.Compression) { - var zstdStream = new CompressionStream(outFs, 15); - zstdStream.SetParameter(ZSTD_cParameter.ZSTD_c_nbWorkers, Environment.ProcessorCount); - zStream = zstdStream; + case CompressionType.Zstd: + { + var zstdStream = new CompressionStream(outFs, 15); + zstdStream.SetParameter(ZSTD_cParameter.ZSTD_c_nbWorkers, Environment.ProcessorCount); + zStream = zstdStream; + + break; + } + case CompressionType.None: + zStream = outFs; + + break; + default: + zStream = new LZipStream(outFs, CompressionMode.Compress); + + break; } - else - zStream = new LZipStream(outFs, CompressionMode.Compress); SetProgressBounds2?.Invoke(this, new ProgressBoundsEventArgs diff --git a/RomRepoMgr.Settings/Settings.cs b/RomRepoMgr.Settings/Settings.cs index 876ebc6..0d6bd8b 100644 --- a/RomRepoMgr.Settings/Settings.cs +++ b/RomRepoMgr.Settings/Settings.cs @@ -36,7 +36,8 @@ namespace RomRepoMgr.Settings; public enum CompressionType { Lzip = 0, - Zstd + Zstd, + None } public sealed class SetSettings