Skip to content

[HIGH] Games database connection never closed - resource leak #29

Description

@galpt

Issue: SQLite Connection Never Closed in Games Cog

Location

cog/games.py lines 9-13 and cog/games.py lines 699-703

Problem

The GamesDatabase class opens a SQLite connection at initialization that is never explicitly closed:

class GamesDatabase():
    def __init__(self, db_name: str = DB_PATH):
        self.conn = sqlite3.connect(db_name)
        self.conn.execute("PRAGMA foreign_keys = 1")
        self._init_db()
    # No close() method!

class Games(commands.Cog):
    def __init__(self, bot):
        self.db = GamesDatabase()  # Connection opened at cog load
    # No cog_unload to close!

Impact

  • Resource leak: Connection held for entire bot lifetime
  • Connection pool exhaustion if cog is reloaded multiple times
  • Potential database corruption on restart if connections aren't properly released

Recommended Fix

Add proper cleanup:

class GamesDatabase():
    def __init__(self, db_name: str = DB_PATH):
        self.conn = sqlite3.connect(db_name, timeout=30)
        self.conn.execute("PRAGMA foreign_keys = 1")
        self._init_db()
    
    def close(self):
        if self.conn:
            self.conn.close()

class Games(commands.Cog):
    def __init__(self, bot):
        self.bot = bot
        self.bot_user = bot.user
        self.db = GamesDatabase()
    
    def cog_unload(self):
        self.db.close()

Note: Consider using aiosqlite for async-compatible database operations as well.

Severity

High - Resource leak on cog reload

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions