From 85d562e84e4bddb186d2358836b30659f0a35a22 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Fri, 7 Jul 2023 11:08:14 +1000 Subject: [PATCH] fix: delete database entries with import directory path and scan for orphaned files first --- gaseous-server/Classes/ImportGames.cs | 121 +++++++++++++++----------- 1 file changed, 71 insertions(+), 50 deletions(-) diff --git a/gaseous-server/Classes/ImportGames.cs b/gaseous-server/Classes/ImportGames.cs index 3caf6bf..eac0959 100644 --- a/gaseous-server/Classes/ImportGames.cs +++ b/gaseous-server/Classes/ImportGames.cs @@ -386,7 +386,7 @@ namespace gaseous_server.Classes return DestinationPathName; } - public static void MoveGameFile(long RomId) + public static bool MoveGameFile(long RomId) { Classes.Roms.GameRomItem rom = Classes.Roms.GetRom(RomId); string romPath = rom.Path; @@ -398,6 +398,7 @@ namespace gaseous_server.Classes if (romPath == DestinationPath) { Logging.Log(Logging.LogType.Debug, "Move Game ROM", "Destination path is the same as the current path - aborting"); + return true; } else { @@ -405,6 +406,7 @@ namespace gaseous_server.Classes if (File.Exists(DestinationPath)) { Logging.Log(Logging.LogType.Information, "Move Game ROM", "A file with the same name exists at the destination - aborting"); + return false; } else { @@ -417,13 +419,15 @@ namespace gaseous_server.Classes dbDict.Add("id", RomId); dbDict.Add("path", DestinationPath); db.ExecuteCMD(sql, dbDict); - + + return true; } } } else { Logging.Log(Logging.LogType.Warning, "Move Game ROM", "File " + romPath + " appears to be missing!"); + return false; } } @@ -471,11 +475,74 @@ namespace gaseous_server.Classes Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); - // check all roms to see if their local file still exists - string sql = "SELECT * FROM Games_Roms ORDER BY `name`"; + Logging.Log(Logging.LogType.Information, "Library Scan", "Looking for duplicate library files to clean up"); + string duplicateSql = "DELETE r1 FROM Games_Roms r1 INNER JOIN Games_Roms r2 WHERE r1.Id > r2.Id AND r1.MD5 = r2.MD5;"; + db.ExecuteCMD(duplicateSql); + string sql = "SELECT * FROM Games_Roms ORDER BY `name`"; DataTable dtRoms = db.ExecuteCMD(sql); + // search for files in the library that aren't in the database + Logging.Log(Logging.LogType.Information, "Library Scan", "Looking for orphaned library files to add"); + string[] LibraryFiles = Directory.GetFiles(Config.LibraryConfiguration.LibraryDataDirectory, "*.*", SearchOption.AllDirectories); + foreach (string LibraryFile in LibraryFiles) + { + // check if file is in database + bool romFound = false; + for (var i = 0; i < dtRoms.Rows.Count; i++) + { + long romId = (long)dtRoms.Rows[i]["Id"]; + string romPath = (string)dtRoms.Rows[i]["Path"]; + + if (LibraryFile == romPath) + { + romFound = true; + break; + } + } + + if (romFound == false) + { + // file is not in database - process it + Common.hashObject hash = new Common.hashObject(LibraryFile); + FileInfo fi = new FileInfo(LibraryFile); + + Models.Signatures_Games sig = GetFileSignature(hash, fi, LibraryFile); + + Logging.Log(Logging.LogType.Information, "Library Scan", " Orphaned file found in library: " + LibraryFile); + + // get discovered platform + IGDB.Models.Platform determinedPlatform = Metadata.Platforms.GetPlatform(sig.Flags.IGDBPlatformId); + if (determinedPlatform == null) + { + determinedPlatform = new IGDB.Models.Platform(); + } + + IGDB.Models.Game determinedGame = SearchForGame(sig.Game.Name, sig.Flags.IGDBPlatformId); + + StoreROM(hash, determinedGame, determinedPlatform, sig, LibraryFile); + } + } + + // clean out database entries in the import folder + if (dtRoms.Rows.Count > 0) + { + for (var i = 0; i < dtRoms.Rows.Count; i++) + { + long romId = (long)dtRoms.Rows[i]["Id"]; + string romPath = (string)dtRoms.Rows[i]["Path"]; + + if (romPath.StartsWith(Config.LibraryConfiguration.LibraryImportDirectory)) { + Logging.Log(Logging.LogType.Information, "Library Scan", " Deleting database entry for file in import directory " + romPath); + string deleteSql = "DELETE FROM Games_Roms WHERE Id=@id"; + Dictionary deleteDict = new Dictionary(); + deleteDict.Add("Id", romId); + db.ExecuteCMD(deleteSql, deleteDict); + } + } + } + + // check all roms to see if their local file still exists if (dtRoms.Rows.Count > 0) { for (var i = 0; i < dtRoms.Rows.Count; i++) @@ -529,52 +596,6 @@ namespace gaseous_server.Classes } } - // search for files in the library that aren't in the database - Logging.Log(Logging.LogType.Information, "Library Scan", "Looking for orphaned library files to add"); - string[] LibraryFiles = Directory.GetFiles(Config.LibraryConfiguration.LibraryDataDirectory, "*.*", SearchOption.AllDirectories); - foreach (string LibraryFile in LibraryFiles) - { - // check if file is in database - bool romFound = false; - for (var i = 0; i < dtRoms.Rows.Count; i++) - { - long romId = (long)dtRoms.Rows[i]["Id"]; - string romPath = (string)dtRoms.Rows[i]["Path"]; - - if (LibraryFile == romPath) - { - romFound = true; - break; - } - } - - if (romFound == false) - { - // file is not in database - process it - Common.hashObject hash = new Common.hashObject(LibraryFile); - FileInfo fi = new FileInfo(LibraryFile); - - Models.Signatures_Games sig = GetFileSignature(hash, fi, LibraryFile); - - Logging.Log(Logging.LogType.Information, "Library Scan", " Orphaned file found in library: " + LibraryFile); - - // get discovered platform - IGDB.Models.Platform determinedPlatform = Metadata.Platforms.GetPlatform(sig.Flags.IGDBPlatformId); - if (determinedPlatform == null) - { - determinedPlatform = new IGDB.Models.Platform(); - } - - IGDB.Models.Game determinedGame = SearchForGame(sig.Game.Name, sig.Flags.IGDBPlatformId); - - StoreROM(hash, determinedGame, determinedPlatform, sig, LibraryFile); - } - } - - Logging.Log(Logging.LogType.Information, "Library Scan", "Looking for duplicate library files to clean up"); - string duplicateSql = "DELETE r1 FROM Games_Roms r1 INNER JOIN Games_Roms r2 WHERE r1.Id > r2.Id AND r1.MD5 = r2.MD5;"; - db.ExecuteCMD(duplicateSql); - Logging.Log(Logging.LogType.Information, "Library Scan", "Library scan completed"); } }