124 lines
4.4 KiB
Python
124 lines
4.4 KiB
Python
"""Database module for tracking previously processed issues and pull requests.
|
|
|
|
This module provides functionality to track which issues have already been processed
|
|
by the system to avoid duplicate processing. It uses a simple SQLite database to
|
|
store information about seen issues and their associated pull requests for efficient lookup.
|
|
"""
|
|
|
|
import sqlite3
|
|
|
|
DEFAULT_DB_PATH = 'output/seen_issues.db'
|
|
|
|
|
|
class SeenIssuesDB:
|
|
"""Database handler for tracking processed issues and pull requests.
|
|
|
|
This class manages a SQLite database that stores information about issues that have
|
|
already been processed and their associated pull requests. It provides methods to mark
|
|
issues as seen, check if an issue has been seen before, and retrieve pull request
|
|
information for an issue.
|
|
|
|
Attributes:
|
|
conn: SQLite database connection
|
|
"""
|
|
|
|
def __init__(self, db_path=DEFAULT_DB_PATH):
|
|
"""Initialize the database connection.
|
|
|
|
Args:
|
|
db_path: Path to the SQLite database file. Defaults to 'output/seen_issues.db'.
|
|
"""
|
|
self.conn = sqlite3.connect(db_path)
|
|
self._create_table()
|
|
|
|
def _create_table(self):
|
|
"""Create the seen_issues table if it doesn't exist.
|
|
|
|
Creates a table with columns for storing issue hashes and associated pull request information.
|
|
"""
|
|
with self.conn:
|
|
self.conn.execute("""
|
|
CREATE TABLE IF NOT EXISTS seen_issues (
|
|
issue_url TEXT PRIMARY KEY,
|
|
issue_number TEXT,
|
|
pr_number TEXT,
|
|
pr_url TEXT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
)
|
|
""")
|
|
|
|
def mark_as_seen(
|
|
self,
|
|
issue_url: str,
|
|
issue_number: str | None = None,
|
|
pr_number: str | None = None,
|
|
pr_url: str | None = None,
|
|
):
|
|
"""Mark an issue as seen in the database.
|
|
|
|
Computes a hash of the issue text and stores it in the database along with pull request information.
|
|
If the issue has already been marked as seen, this operation has no effect.
|
|
|
|
Args:
|
|
issue_url: The text content of the issue to mark as seen.
|
|
issue_number: The issue number.
|
|
pr_number: The pull request number associated with this issue.
|
|
pr_url: The URL of the pull request associated with this issue.
|
|
"""
|
|
with self.conn:
|
|
self.conn.execute(
|
|
'INSERT OR IGNORE INTO seen_issues (issue_url, issue_number, pr_number, pr_url) VALUES (?, ?, ?, ?)',
|
|
(issue_url, issue_number, pr_number, pr_url),
|
|
)
|
|
|
|
def has_seen(self, issue_url: str) -> bool:
|
|
"""Check if an issue has been seen before.
|
|
|
|
Computes a hash of the issue text and checks if it exists in the database.
|
|
|
|
Args:
|
|
issue_url: The text content of the issue to check.
|
|
|
|
Returns:
|
|
True if the issue has been seen before, False otherwise.
|
|
"""
|
|
cursor = self.conn.execute(
|
|
'SELECT 1 FROM seen_issues WHERE issue_url = ?',
|
|
(issue_url,),
|
|
)
|
|
return cursor.fetchone() is not None
|
|
|
|
def get_pr_info(self, issue_url: str) -> tuple[str, str] | None:
|
|
"""Get pull request information for an issue.
|
|
|
|
Args:
|
|
issue_url: The text content of the issue to check.
|
|
|
|
Returns:
|
|
A tuple containing (pr_number, pr_url) if found, None otherwise.
|
|
"""
|
|
cursor = self.conn.execute(
|
|
'SELECT pr_number, pr_url FROM seen_issues WHERE issue_url = ?',
|
|
(issue_url,),
|
|
)
|
|
result = cursor.fetchone()
|
|
return result if result else None
|
|
|
|
def update_pr_info(self, issue_url: str, pr_number: str, pr_url: str) -> bool:
|
|
"""Update pull request information for an existing issue.
|
|
|
|
Args:
|
|
issue_url: The text content of the issue to update.
|
|
pr_number: The pull request number.
|
|
pr_url: The URL of the pull request.
|
|
|
|
Returns:
|
|
True if the update was successful, False if the issue wasn't found.
|
|
"""
|
|
with self.conn:
|
|
cursor = self.conn.execute(
|
|
'UPDATE seen_issues SET pr_number = ?, pr_url = ? WHERE issue_url = ?',
|
|
(pr_number, pr_url, issue_url),
|
|
)
|
|
return cursor.rowcount > 0
|