| 24 | |
| 25 | |
| 26 | class DatabaseCleanup: |
| 27 | def __init__(self): |
| 28 | pass |
| 29 | |
| 30 | @staticmethod |
| 31 | def ExecuteSQLQuery(saveddata_engine, query): |
| 32 | try: |
| 33 | results = saveddata_engine.execute(query) |
| 34 | return results |
| 35 | except DatabaseError: |
| 36 | pyfalog.error("Failed to connect to database or error executing query:\n{0}", query) |
| 37 | return None |
| 38 | |
| 39 | @staticmethod |
| 40 | def OrphanedCharacterSkills(saveddata_engine): |
| 41 | # Find orphaned character skills. |
| 42 | # This solves an issue where the character doesn't exist, but skills for that character do. |
| 43 | # See issue #917 |
| 44 | pyfalog.debug("Running database cleanup for character skills.") |
| 45 | query = "SELECT COUNT(*) AS num FROM characterSkills WHERE characterID NOT IN (SELECT ID from characters)" |
| 46 | results = DatabaseCleanup.ExecuteSQLQuery(saveddata_engine, query) |
| 47 | |
| 48 | if results is None: |
| 49 | return |
| 50 | |
| 51 | row = results.first() |
| 52 | |
| 53 | if row and row['num']: |
| 54 | query = "DELETE FROM characterSkills WHERE characterID NOT IN (SELECT ID from characters)" |
| 55 | delete = DatabaseCleanup.ExecuteSQLQuery(saveddata_engine, query) |
| 56 | pyfalog.error("Database corruption found. Cleaning up {0} records.", delete.rowcount) |
| 57 | |
| 58 | @staticmethod |
| 59 | def OrphanedFitDamagePatterns(saveddata_engine): |
| 60 | # Find orphaned damage patterns. |
| 61 | # This solves an issue where the damage pattern doesn't exist, but fits reference the pattern. |
| 62 | # See issue #777 |
| 63 | pyfalog.debug("Running database cleanup for orphaned damage patterns attached to fits.") |
| 64 | query = "SELECT COUNT(*) AS num FROM fits WHERE damagePatternID NOT IN (SELECT ID FROM damagePatterns) OR damagePatternID IS NULL" |
| 65 | results = DatabaseCleanup.ExecuteSQLQuery(saveddata_engine, query) |
| 66 | |
| 67 | if results is None: |
| 68 | return |
| 69 | |
| 70 | row = results.first() |
| 71 | |
| 72 | if row and row['num']: |
| 73 | # Get Uniform damage pattern ID |
| 74 | uniform_query = "SELECT ID FROM damagePatterns WHERE name = 'Uniform'" |
| 75 | uniform_results = DatabaseCleanup.ExecuteSQLQuery(saveddata_engine, uniform_query) |
| 76 | |
| 77 | if uniform_results is None: |
| 78 | return |
| 79 | |
| 80 | rows = uniform_results.fetchall() |
| 81 | |
| 82 | if len(rows) == 0: |
| 83 | pyfalog.error("Missing uniform damage pattern.") |