Change how user gamedb files are included, add extra warnings
This commit is contained in:
parent
55300d7827
commit
69d51aba50
|
@ -23,7 +23,6 @@
|
||||||
#include gamedb_sega_sms.txt
|
#include gamedb_sega_sms.txt
|
||||||
#include gamedb_sega_md.txt
|
#include gamedb_sega_md.txt
|
||||||
#include gamedb_snes.txt
|
#include gamedb_snes.txt
|
||||||
#include gamedb_user.txt
|
|
||||||
#include gamedb_vectrex.txt
|
#include gamedb_vectrex.txt
|
||||||
#include gamedb_ws.txt
|
#include gamedb_ws.txt
|
||||||
#include gamedb_wsc.txt
|
#include gamedb_wsc.txt
|
||||||
|
@ -31,6 +30,7 @@
|
||||||
#include gamedb_amstradcpc.txt
|
#include gamedb_amstradcpc.txt
|
||||||
#include gamedb_ngp.txt
|
#include gamedb_ngp.txt
|
||||||
#include gamedb_channelf.txt
|
#include gamedb_channelf.txt
|
||||||
|
#includeuser gamedb_user.txt
|
||||||
|
|
||||||
; ************ TI-83 ************
|
; ************ TI-83 ************
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,12 @@ namespace BizHawk.Emulation.Common
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static readonly EventWaitHandle acquire = new EventWaitHandle(false, EventResetMode.ManualReset);
|
private static readonly EventWaitHandle acquire = new EventWaitHandle(false, EventResetMode.ManualReset);
|
||||||
|
|
||||||
|
private static string _bundledRoot = null;
|
||||||
|
|
||||||
|
private static IList<string> _expected = null;
|
||||||
|
|
||||||
|
private static string _userRoot = null;
|
||||||
|
|
||||||
private static string RemoveHashType(string hash)
|
private static string RemoveHashType(string hash)
|
||||||
{
|
{
|
||||||
hash = hash.ToUpper();
|
hash = hash.ToUpper();
|
||||||
|
@ -37,23 +43,26 @@ namespace BizHawk.Emulation.Common
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void LoadDatabase_Escape(string line, string path, bool silent)
|
private static void LoadDatabase_Escape(string line, bool inUser, bool silent)
|
||||||
{
|
{
|
||||||
if (!line.ToUpperInvariant().StartsWith("#INCLUDE"))
|
if (!line.StartsWith("#include", StringComparison.InvariantCultureIgnoreCase)) return;
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
line = line.Substring(8).TrimStart();
|
var isUserInclude = line.StartsWith("#includeuser", StringComparison.InvariantCultureIgnoreCase);
|
||||||
var filename = Path.Combine(path, line);
|
var searchUser = inUser || isUserInclude;
|
||||||
|
line = line.Substring(isUserInclude ? 12 : 8).TrimStart();
|
||||||
|
var filename = Path.Combine(searchUser ? _userRoot : _bundledRoot, line);
|
||||||
if (File.Exists(filename))
|
if (File.Exists(filename))
|
||||||
{
|
{
|
||||||
if (!silent) Util.DebugWriteLine($"loading external game database {line}");
|
if (!silent) Util.DebugWriteLine($"loading external game database {line} ({(searchUser ? "user" : "bundled")})");
|
||||||
initializeWork(filename, silent);
|
initializeWork(filename, inUser: searchUser, silent: silent);
|
||||||
}
|
}
|
||||||
else
|
else if (inUser)
|
||||||
{
|
{
|
||||||
Util.DebugWriteLine($"BENIGN: missing external game database {line}");
|
Util.DebugWriteLine($"BENIGN: missing external game database {line} (user)");
|
||||||
|
}
|
||||||
|
else if (!isUserInclude)
|
||||||
|
{
|
||||||
|
throw new FileNotFoundException($"missing external game database {line} (bundled)");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,8 +101,9 @@ namespace BizHawk.Emulation.Common
|
||||||
|
|
||||||
private static bool initialized = false;
|
private static bool initialized = false;
|
||||||
|
|
||||||
private static void initializeWork(string path, bool silent)
|
private static void initializeWork(string path, bool inUser, bool silent)
|
||||||
{
|
{
|
||||||
|
if (!inUser) _expected.Remove(Path.GetFileName(path));
|
||||||
//reminder: this COULD be done on several threads, if it takes even longer
|
//reminder: this COULD be done on several threads, if it takes even longer
|
||||||
using var reader = new StreamReader(new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read));
|
using var reader = new StreamReader(new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read));
|
||||||
while (reader.EndOfStream == false)
|
while (reader.EndOfStream == false)
|
||||||
|
@ -108,7 +118,7 @@ namespace BizHawk.Emulation.Common
|
||||||
|
|
||||||
if (line.StartsWith("#"))
|
if (line.StartsWith("#"))
|
||||||
{
|
{
|
||||||
LoadDatabase_Escape(line, Path.GetDirectoryName(path), silent);
|
LoadDatabase_Escape(line, inUser: inUser, silent: silent);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,6 +160,14 @@ namespace BizHawk.Emulation.Common
|
||||||
|
|
||||||
DB[game.Hash] = game;
|
DB[game.Hash] = game;
|
||||||
}
|
}
|
||||||
|
catch (FileNotFoundException e) when (e.Message.Contains("missing external game database"))
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
throw;
|
||||||
|
#else
|
||||||
|
Console.WriteLine(e.Message);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
Util.DebugWriteLine($"Error parsing database entry: {line}");
|
Util.DebugWriteLine($"Error parsing database entry: {line}");
|
||||||
|
@ -164,9 +182,18 @@ namespace BizHawk.Emulation.Common
|
||||||
if (initialized) throw new InvalidOperationException("Did not expect re-initialize of game Database");
|
if (initialized) throw new InvalidOperationException("Did not expect re-initialize of game Database");
|
||||||
initialized = true;
|
initialized = true;
|
||||||
|
|
||||||
|
_bundledRoot = Path.GetDirectoryName(path);
|
||||||
|
_userRoot = Environment.GetEnvironmentVariable("BIZHAWK_DATA_HOME");
|
||||||
|
if (!string.IsNullOrEmpty(_userRoot) && Directory.Exists(_userRoot)) _userRoot = Path.Combine(_userRoot, "gamedb");
|
||||||
|
else _userRoot = _bundledRoot;
|
||||||
|
Console.WriteLine($"user root: {_userRoot}");
|
||||||
|
|
||||||
|
_expected = new DirectoryInfo(_bundledRoot!).EnumerateFiles("*.txt").Select(static fi => fi.Name).ToList();
|
||||||
|
|
||||||
var stopwatch = Stopwatch.StartNew();
|
var stopwatch = Stopwatch.StartNew();
|
||||||
ThreadPool.QueueUserWorkItem(_=> {
|
ThreadPool.QueueUserWorkItem(_=> {
|
||||||
initializeWork(path, silent);
|
initializeWork(path, inUser: false, silent: silent);
|
||||||
|
if (_expected.Count is not 0) Util.DebugWriteLine($"extra bundled gamedb files were not #included: {string.Join(", ", _expected)}");
|
||||||
Util.DebugWriteLine("GameDB load: " + stopwatch.Elapsed + " sec");
|
Util.DebugWriteLine("GameDB load: " + stopwatch.Elapsed + " sec");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue