|
|
""" |
|
|
Database initialization and management |
|
|
""" |
|
|
|
|
|
import sqlite3 |
|
|
import logging |
|
|
import os |
|
|
from pathlib import Path |
|
|
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
class DatabaseManager: |
|
|
def __init__(self, db_path: str = "sessions.db"): |
|
|
self.db_path = db_path |
|
|
self.connection = None |
|
|
self._init_db() |
|
|
|
|
|
def _init_db(self): |
|
|
"""Initialize database with required tables""" |
|
|
try: |
|
|
|
|
|
os.makedirs(os.path.dirname(self.db_path), exist_ok=True) |
|
|
|
|
|
self.connection = sqlite3.connect(self.db_path, check_same_thread=False) |
|
|
self.connection.row_factory = sqlite3.Row |
|
|
|
|
|
|
|
|
self._create_tables() |
|
|
logger.info(f"Database initialized at {self.db_path}") |
|
|
|
|
|
except Exception as e: |
|
|
logger.error(f"Database initialization failed: {e}") |
|
|
|
|
|
self.connection = sqlite3.connect(":memory:", check_same_thread=False) |
|
|
self._create_tables() |
|
|
logger.info("Using in-memory database as fallback") |
|
|
|
|
|
def _create_tables(self): |
|
|
"""Create required database tables""" |
|
|
cursor = self.connection.cursor() |
|
|
|
|
|
|
|
|
cursor.execute(""" |
|
|
CREATE TABLE IF NOT EXISTS sessions ( |
|
|
session_id TEXT PRIMARY KEY, |
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, |
|
|
last_activity TIMESTAMP DEFAULT CURRENT_TIMESTAMP, |
|
|
context_data TEXT, |
|
|
user_metadata TEXT |
|
|
) |
|
|
""") |
|
|
|
|
|
|
|
|
cursor.execute(""" |
|
|
CREATE TABLE IF NOT EXISTS interactions ( |
|
|
interaction_id TEXT PRIMARY KEY, |
|
|
session_id TEXT REFERENCES sessions(session_id), |
|
|
user_input TEXT NOT NULL, |
|
|
agent_trace TEXT, |
|
|
final_response TEXT, |
|
|
processing_time INTEGER, |
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP |
|
|
) |
|
|
""") |
|
|
|
|
|
self.connection.commit() |
|
|
logger.info("Database tables created successfully") |
|
|
|
|
|
def get_connection(self): |
|
|
"""Get database connection""" |
|
|
return self.connection |
|
|
|
|
|
def close(self): |
|
|
"""Close database connection""" |
|
|
if self.connection: |
|
|
self.connection.close() |
|
|
logger.info("Database connection closed") |
|
|
|
|
|
|
|
|
db_manager = None |
|
|
|
|
|
def init_database(db_path: str = "sessions.db"): |
|
|
"""Initialize global database instance""" |
|
|
global db_manager |
|
|
if db_manager is None: |
|
|
db_manager = DatabaseManager(db_path) |
|
|
return db_manager |
|
|
|
|
|
def get_db(): |
|
|
"""Get database connection""" |
|
|
global db_manager |
|
|
if db_manager is None: |
|
|
init_database() |
|
|
return db_manager.get_connection() |
|
|
|
|
|
|
|
|
init_database() |
|
|
|