From 85a89339a73ee9a040e98011b27db2c87835bdd6 Mon Sep 17 00:00:00 2001 From: blitzman Date: Mon, 2 Jan 2017 00:58:54 -0500 Subject: [PATCH] Cleaned up database corruption stuff --- eos/db/saveddata/databaseRepair.py | 37 ++++++++++-------------------- 1 file changed, 12 insertions(+), 25 deletions(-) diff --git a/eos/db/saveddata/databaseRepair.py b/eos/db/saveddata/databaseRepair.py index be26c8231..5561b41a1 100644 --- a/eos/db/saveddata/databaseRepair.py +++ b/eos/db/saveddata/databaseRepair.py @@ -37,17 +37,13 @@ class DatabaseCleanup: # See issue #917 try: logger.debug("Running database cleanup for character skills.") - results = saveddata_engine.execute("SELECT * FROM characterSkills " + results = saveddata_engine.execute("SELECT COUNT(*) AS num FROM characterSkills " "WHERE characterID NOT IN (SELECT ID from characters)") - # Count how many records exist. This is ugly, but SQLAlchemy doesn't return a count from a select query. - result_count = 0 - for _ in results: - result_count += 1 + if results.fetchone()['num'] > 0: + delete = saveddata_engine.execute("DELETE FROM characterSkills WHERE characterID NOT IN (SELECT ID from characters)") + logger.error("Database corruption found. Cleaning up %d records.", delete.rowcount) - if result_count > 0: - logger.error("Database corruption found. Cleaning up %d records.", result_count) - saveddata_engine.execute("DELETE FROM characterSkills WHERE characterID NOT IN (SELECT ID from characters)") except sqlalchemy.exc.DatabaseError: logger.error("Failed to connect to database.") @@ -58,14 +54,9 @@ class DatabaseCleanup: # See issue #777 try: logger.debug("Running database cleanup for orphaned damage patterns attached to fits.") - results = saveddata_engine.execute("SELECT * FROM fits WHERE damagePatternID not in (select ID from damagePatterns)") + results = saveddata_engine.execute("SELECT COUNT(*) AS num FROM fits WHERE damagePatternID not in (select ID from damagePatterns)") - # Count how many records exist. This is ugly, but SQLAlchemy doesn't return a count from a select query. - result_count = 0 - for _ in results: - result_count += 1 - - if result_count > 0: + if results.fetchone()['num'] > 0: # Get Uniform damage pattern ID uniform_results = saveddata_engine.execute("select ID from damagePatterns WHERE name = 'Uniform'") @@ -80,10 +71,10 @@ class DatabaseCleanup: elif uniform_result_count > 1: logger.error("More than one uniform damage pattern found.") else: - logger.error("Database corruption found. Cleaning up %d records.", result_count) - saveddata_engine.execute("UPDATE 'fits' SET 'damagePatternID' = ? " + update = saveddata_engine.execute("UPDATE 'fits' SET 'damagePatternID' = ? " "WHERE damagePatternID NOT IN (SELECT ID FROM damagePatterns)", uniform_damage_pattern_id) + logger.error("Database corruption found. Cleaning up %d records.", update.rowcount) except sqlalchemy.exc.DatabaseError: logger.error("Failed to connect to database.") @@ -92,14 +83,10 @@ class DatabaseCleanup: # Find orphaned character IDs. This solves an issue where the chaaracter doesn't exist, but fits reference the pattern. try: logger.debug("Running database cleanup for orphaned characters attached to fits.") - results = saveddata_engine.execute("SELECT * FROM fits WHERE characterID NOT IN (SELECT ID FROM characters)") + results = saveddata_engine.execute("SELECT COUNT(*) AS num FROM fits WHERE characterID NOT IN (SELECT ID FROM characters)") # Count how many records exist. This is ugly, but SQLAlchemy doesn't return a count from a select query. - result_count = 0 - for _ in results: - result_count += 1 - - if result_count > 0: + if results.fetchone()['num'] > 0: # Get All 5 character ID all5_results = saveddata_engine.execute("SELECT ID FROM characters WHERE name = 'All 5'") @@ -114,9 +101,9 @@ class DatabaseCleanup: elif all5_result_count > 1: logger.error("More than one 'All 5' character found.") else: - logger.error("Database corruption found. Cleaning up %d records.", result_count) - saveddata_engine.execute("UPDATE 'fits' SET 'damagePatternID' = ? " + update = saveddata_engine.execute("UPDATE 'fits' SET 'damagePatternID' = ? " "WHERE damagePatternID not in (select ID from damagePatterns)", all5_id) + logger.error("Database corruption found. Cleaning up %d records.", update.rowcount) except sqlalchemy.exc.DatabaseError: logger.error("Failed to connect to database.")