Allow a single beatmap to reference the same file multiple times

This fixes incorrect reference counts causing database desync.
This commit is contained in:
Dean Herbert
2017-07-31 21:48:03 +09:00
parent bc21798e41
commit 404497fa10
6 changed files with 46 additions and 28 deletions

View File

@ -11,8 +11,6 @@ namespace osu.Game.IO
[PrimaryKey, AutoIncrement]
public int ID { get; set; }
public string Filename { get; set; }
[Indexed(Unique = true)]
public string Hash { get; set; }

View File

@ -42,15 +42,11 @@ namespace osu.Game.IO
deletePending();
}
public FileInfo Add(Stream data, string filename = null)
public FileInfo Add(Stream data)
{
string hash = data.ComputeSHA2Hash();
var info = new FileInfo
{
Filename = filename,
Hash = hash,
};
var info = new FileInfo { Hash = hash };
var existing = Connection.Table<FileInfo>().FirstOrDefault(f => f.Hash == info.Hash);
@ -79,20 +75,32 @@ namespace osu.Game.IO
public void Reference(IEnumerable<FileInfo> files)
{
foreach (var f in files)
Connection.RunInTransaction(() =>
{
f.ReferenceCount++;
Connection.Update(f);
}
var incrementedFiles = files.GroupBy(f => f.ID).Select(f =>
{
var accurateRefCount = Connection.Get<FileInfo>(f.First().ID);
accurateRefCount.ReferenceCount += f.Count();
return accurateRefCount;
});
Connection.UpdateAll(incrementedFiles);
});
}
public void Dereference(IEnumerable<FileInfo> files)
{
foreach (var f in files)
Connection.RunInTransaction(() =>
{
f.ReferenceCount--;
Connection.Update(f);
}
var incrementedFiles = files.GroupBy(f => f.ID).Select(f =>
{
var accurateRefCount = Connection.Get<FileInfo>(f.First().ID);
accurateRefCount.ReferenceCount -= f.Count();
return accurateRefCount;
});
Connection.UpdateAll(incrementedFiles);
});
}
private void deletePending()