From 641855c79082f9848360a1d6fa2e362cd3bc3dee Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Wed, 19 Oct 2016 11:00:11 -0400 Subject: [PATCH] Fix issues with beatmap import file contention --- osu.Game/Beatmaps/IO/OszArchiveReader.cs | 11 +++++--- osu.Game/Database/BeatmapDatabase.cs | 36 ++++++++++++------------ 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/osu.Game/Beatmaps/IO/OszArchiveReader.cs b/osu.Game/Beatmaps/IO/OszArchiveReader.cs index 8b677d0145..edfaca7708 100644 --- a/osu.Game/Beatmaps/IO/OszArchiveReader.cs +++ b/osu.Game/Beatmaps/IO/OszArchiveReader.cs @@ -19,13 +19,15 @@ namespace osu.Game.Beatmaps.IO }); OsuLegacyDecoder.Register(); } - - private ZipFile archive { get; set; } - private string[] beatmaps { get; set; } - private Beatmap firstMap { get; set; } + + private Stream archiveStream; + private ZipFile archive; + private string[] beatmaps; + private Beatmap firstMap; public OszArchiveReader(Stream archiveStream) { + this.archiveStream = archiveStream; archive = ZipFile.Read(archiveStream); beatmaps = archive.Entries.Where(e => e.FileName.EndsWith(@".osu")) .Select(e => e.FileName).ToArray(); @@ -59,6 +61,7 @@ namespace osu.Game.Beatmaps.IO public override void Dispose() { archive.Dispose(); + archiveStream.Dispose(); } } } \ No newline at end of file diff --git a/osu.Game/Database/BeatmapDatabase.cs b/osu.Game/Database/BeatmapDatabase.cs index 082047f56b..e09e84def1 100644 --- a/osu.Game/Database/BeatmapDatabase.cs +++ b/osu.Game/Database/BeatmapDatabase.cs @@ -34,8 +34,9 @@ namespace osu.Game.Database public void ImportBeatmap(string path) { string hash = null; - var reader = ArchiveReader.GetReader(storage, path); - var metadata = reader.ReadMetadata(); + BeatmapMetadata metadata; + using (var reader = ArchiveReader.GetReader(storage, path)) + metadata = reader.ReadMetadata(); if (connection.Table().Count(b => b.BeatmapSetID == metadata.BeatmapSetID) != 0) return; // TODO: Update this beatmap instead if (File.Exists(path)) // Not always the case, i.e. for LegacyFilesystemReader @@ -50,32 +51,31 @@ namespace osu.Game.Database input.CopyTo(output); } } - string[] mapNames = reader.ReadBeatmaps(); var beatmapSet = new BeatmapSetInfo { BeatmapSetID = metadata.BeatmapSetID, Path = path, Hash = hash, }; + beatmapSet.Metadata = metadata; var maps = new List(); - foreach (var name in mapNames) + using (var reader = ArchiveReader.GetReader(storage, path)) { - using (var stream = new StreamReader(reader.ReadFile(name))) + string[] mapNames = reader.ReadBeatmaps(); + foreach (var name in mapNames) { - var decoder = BeatmapDecoder.GetDecoder(stream); - Beatmap beatmap = decoder.Decode(stream); - beatmap.BeatmapInfo.Path = name; - // TODO: Diff beatmap metadata with set metadata and insert if necessary - beatmap.BeatmapInfo.Metadata = null; - maps.Add(beatmap.BeatmapInfo); - connection.Insert(beatmap.BeatmapInfo.BaseDifficulty); - connection.Insert(beatmap.BeatmapInfo); - connection.UpdateWithChildren(beatmap.BeatmapInfo); + using (var stream = new StreamReader(reader.ReadFile(name))) + { + var decoder = BeatmapDecoder.GetDecoder(stream); + Beatmap beatmap = decoder.Decode(stream); + beatmap.BeatmapInfo.Path = name; + // TODO: Diff beatmap metadata with set metadata and leave it here if necessary + beatmap.BeatmapInfo.Metadata = null; + maps.Add(beatmap.BeatmapInfo); + } } } - connection.Insert(beatmapSet); - beatmapSet.BeatmapMetadataID = connection.Insert(metadata); - connection.UpdateWithChildren(beatmapSet); + connection.InsertWithChildren(beatmapSet); BeatmapSetAdded?.Invoke(beatmapSet); } @@ -127,4 +127,4 @@ namespace osu.Game.Database connection.Update(record); } } -} +}