From e6b4ecdaf701fb85920399b644eb88292057c08c Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Fri, 27 Jan 2017 13:37:51 -0800 Subject: [PATCH] Additional cleanup for orphaned records --- eos/db/saveddata/databaseRepair.py | 39 ++++++++++++++++++++++++++++++ service/prefetch.py | 2 ++ 2 files changed, 41 insertions(+) diff --git a/eos/db/saveddata/databaseRepair.py b/eos/db/saveddata/databaseRepair.py index e9685381a..53f6ae29f 100644 --- a/eos/db/saveddata/databaseRepair.py +++ b/eos/db/saveddata/databaseRepair.py @@ -160,3 +160,42 @@ class DatabaseCleanup: query = "UPDATE 'targetResists' SET 'name' = 'Unknown' WHERE name IS NULL OR name = ''" delete = DatabaseCleanup.ExecuteSQLQuery(saveddata_engine, query) logger.error("Database corruption found. Cleaning up %d records.", delete.rowcount) + + @staticmethod + def OrphanedFitIDItemID(saveddata_engine): + # Orphaned items that are missing the fit ID or item ID. + # See issue #954 + for table in ['drones', 'cargo', 'fighters', 'modules']: + logger.debug("Running database cleanup for orphaned %s items.", table) + query = "SELECT COUNT(*) AS num FROM " + table + " WHERE itemID IS NULL OR itemID = '' or itemID = '0' or fitID IS NULL OR fitID = '' or fitID = '0'" + results = DatabaseCleanup.ExecuteSQLQuery(saveddata_engine, query) + + if results is None: + return + + row = results.first() + + if row and row['num']: + query = "DELETE FROM " + table + " WHERE itemID IS NULL OR itemID = '' or itemID = '0' or fitID IS NULL OR fitID = '' or fitID = '0'" + delete = DatabaseCleanup.ExecuteSQLQuery(saveddata_engine, query) + logger.error("Database corruption found. Cleaning up %d records.", delete.rowcount) + + @staticmethod + def NullDamageTargetPatternValues(saveddata_engine): + # Find patterns that have null values + # See issue #954 + for profileType in ['damagePatterns', 'targetResists']: + for damageType in ['em', 'thermal', 'kinetic', 'explosive']: + logger.debug("Running database cleanup for null %s values. (%s)", profileType, damageType) + query = "SELECT COUNT(*) AS num FROM " + profileType + " WHERE " + damageType + "Amount IS NULL OR " + damageType + "Amount = ''" + results = DatabaseCleanup.ExecuteSQLQuery(saveddata_engine, query) + + if results is None: + return + + row = results.first() + + if row and row['num']: + query = "UPDATE '" + profileType + "' SET '" + damageType + "Amount' = '0' WHERE " + damageType + "Amount IS NULL OR emAmount = ''" + delete = DatabaseCleanup.ExecuteSQLQuery(saveddata_engine, query) + logger.error("Database corruption found. Cleaning up %d records.", delete.rowcount) diff --git a/service/prefetch.py b/service/prefetch.py index 46f9cf5f5..9990fea10 100644 --- a/service/prefetch.py +++ b/service/prefetch.py @@ -67,6 +67,8 @@ if os.path.isfile(config.saveDB): database_cleanup_instance.OrphanedCharacterSkills(eos.db.saveddata_engine) database_cleanup_instance.OrphanedFitCharacterIDs(eos.db.saveddata_engine) database_cleanup_instance.OrphanedFitDamagePatterns(eos.db.saveddata_engine) + database_cleanup_instance.OrphanedFitIDItemID(eos.db.saveddata_engine) + database_cleanup_instance.NullDamageTargetPatternValues(eos.db.saveddata_engine) logging.debug("Completed database validation.") else: