feat(core): add database, models, queue and settings system

- Add SQLAlchemy database setup with session management
- Add Job model with status, priority and progress tracking
- Add QueueManager with priority queue and deduplication
- Add SystemSettings model for database-backed configuration
- Add SettingsService with caching and defaults
- Add SystemMonitor for CPU/RAM/GPU resource monitoring
- Add LanguageCode utilities (moved from root)
This commit is contained in:
2026-01-16 15:11:30 +01:00
parent 9594c0b8ab
commit 58c565cd96
7 changed files with 1370 additions and 22 deletions

View File

@@ -57,7 +57,7 @@ class Database:
settings.database_url,
connect_args=connect_args,
poolclass=poolclass,
echo=settings.debug,
echo=False,
)
@event.listens_for(engine, "connect")
@@ -85,7 +85,7 @@ class Database:
pool_size=10,
max_overflow=20,
pool_pre_ping=True, # Verify connections before using
echo=settings.debug,
echo=False,
)
elif settings.database_type in (DatabaseType.MARIADB, DatabaseType.MYSQL):
@@ -107,18 +107,26 @@ class Database:
pool_size=10,
max_overflow=20,
pool_pre_ping=True,
echo=settings.debug,
echo=False,
)
else:
raise ValueError(f"Unsupported database type: {settings.database_type}")
# Disable SQLAlchemy INFO logs for cleaner output
logging.getLogger('sqlalchemy.engine').setLevel(logging.WARNING)
logging.getLogger('sqlalchemy.pool').setLevel(logging.WARNING)
logging.getLogger('sqlalchemy.dialects').setLevel(logging.WARNING)
logging.getLogger('sqlalchemy.orm').setLevel(logging.WARNING)
return engine
def _ensure_tables_exist(self):
"""Check if tables exist and create them if they don't."""
# Import models to register them with Base.metadata
from backend.core import models # noqa: F401
from backend.core import settings_model # noqa: F401
from backend.scanning import models as scanning_models # noqa: F401
from sqlalchemy import inspect
inspector = inspect(self.engine)
@@ -135,6 +143,8 @@ class Database:
"""Create all database tables."""
# Import models to register them with Base.metadata
from backend.core import models # noqa: F401
from backend.core import settings_model # noqa: F401
from backend.scanning import models as scanning_models # noqa: F401
logger.info("Creating database tables...")
Base.metadata.create_all(bind=self.engine, checkfirst=True)
@@ -150,6 +160,28 @@ class Database:
logger.error(f"Failed to create tables. Existing tables: {created_tables}")
raise RuntimeError("Failed to create database tables")
def init_db(self):
"""
Initialize database.
Ensures tables exist and are up to date.
Safe to call multiple times.
"""
logger.info("Initializing database...")
self._ensure_tables_exist()
logger.info("Database initialization complete")
def reset_db(self):
"""
Reset database (drop and recreate all tables).
WARNING: This deletes ALL data!
"""
logger.warning("Resetting database - ALL DATA WILL BE LOST")
self.drop_tables()
self.create_tables()
logger.info("Database reset complete")
def drop_tables(self):
"""Drop all database tables (use with caution!)."""
logger.warning("Dropping all database tables...")