From a8eb6cf32aaa717933f0a4c4d483967e5b9d7ad3 Mon Sep 17 00:00:00 2001 From: Giorgio Ravera Date: Mon, 1 Jun 2026 10:15:58 +0200 Subject: [PATCH] fixed init db in case of db reset --- backend/db/aliases.py | 2 +- backend/db/db.py | 52 +++++++++++++++++++++++++++++++++++++---- backend/db/hosts.py | 2 +- backend/db/settings.py | 4 ++-- backend/db/users.py | 4 ++-- frontend/js/services.js | 2 +- 6 files changed, 54 insertions(+), 12 deletions(-) diff --git a/backend/db/aliases.py b/backend/db/aliases.py index 1c803ff..73465ef 100644 --- a/backend/db/aliases.py +++ b/backend/db/aliases.py @@ -171,7 +171,7 @@ def delete_alias(alias_id: int) -> bool: # ----------------------------- # Initialize Aliases DB Table # ----------------------------- -@register_init +@register_init("create_aliases_table") def init_db_aliases_table(cur: sqlite3.Cursor) -> None: # ALIASES TABLE diff --git a/backend/db/db.py b/backend/db/db.py index 8d79c37..e06c7a4 100644 --- a/backend/db/db.py +++ b/backend/db/db.py @@ -6,14 +6,53 @@ import sqlite3 _connection = None _db_path: Path | None = None -_init_functions = [] +INIT_REGISTRY = {} + +# --------------------------------------------------------- +# Internal: resolve init order based on dependencies +# --------------------------------------------------------- +def _resolve_init_order(): + visited = set() + visiting = set() + order = [] + + def visit(name): + if name in visited: + return + if name in visiting: + raise RuntimeError(f"Circular dependency detected: {name}") + + visiting.add(name) + + for dep in INIT_REGISTRY[name]["depends_on"]: + if dep not in INIT_REGISTRY: + raise RuntimeError(f"Missing dependency: {dep}") + visit(dep) + + visiting.remove(name) + visited.add(name) + order.append(name) + + for name in INIT_REGISTRY: + visit(name) + + return order # ----------------------------- # Register DB Init Function # ----------------------------- -def register_init(func): - _init_functions.append(func) - return func +def register_init(name, depends_on=None): + if depends_on is None: + depends_on = [] + + def decorator(func): + INIT_REGISTRY[name] = { + "func": func, + "depends_on": depends_on + } + return func + + return decorator # ----------------------------- # Configure database (path) @@ -34,7 +73,10 @@ def init_db(): conn = get_db() cur = conn.cursor() - for func in sorted(_init_functions, key=lambda f: f.__name__): + ordered_names = _resolve_init_order() + + for name in ordered_names: + func = INIT_REGISTRY[name]["func"] func(cur) conn.commit() diff --git a/backend/db/hosts.py b/backend/db/hosts.py index 937dd70..3498df5 100644 --- a/backend/db/hosts.py +++ b/backend/db/hosts.py @@ -221,7 +221,7 @@ def delete_host(host_id: int) -> bool: # ----------------------------- # Initialize Hosts DB Table # ----------------------------- -@register_init +@register_init("create_hosts_table") def init_db_hosts_table(cur: sqlite3.Cursor) -> None: # HOSTS TABLE diff --git a/backend/db/settings.py b/backend/db/settings.py index e850011..636c939 100644 --- a/backend/db/settings.py +++ b/backend/db/settings.py @@ -124,7 +124,7 @@ def get_config_or(key, default): # --------------------------------------------------------- # Create Config DB Tables # --------------------------------------------------------- -@register_init +@register_init("create_settings_table") def init_db_config_table(cur): # CONFIG TABLE @@ -138,7 +138,7 @@ def init_db_config_table(cur): # --------------------------------------------------------- # Initialize Config DB Tables # --------------------------------------------------------- -@register_init +@register_init("init_settings_table", depends_on=["create_settings_table"]) def init_db_config_defaults(cur): # Add configuration parameters diff --git a/backend/db/users.py b/backend/db/users.py index ee86b3b..d5981bc 100644 --- a/backend/db/users.py +++ b/backend/db/users.py @@ -63,7 +63,7 @@ def create_user(username, password_hash, email=None, is_admin=0, modules=None): # ----------------------------- # Create Users Table # ----------------------------- -@register_init +@register_init("create_users_table") def init_db_users_table(cur): # USERS TABLE @@ -90,7 +90,7 @@ def init_db_users_table(cur): # ----------------------------- # Populate Users Tables # ----------------------------- -@register_init +@register_init("init_users_table", depends_on=["create_users_table"]) def init_db_users_defaults(cur): # Insert default admin user if settings.ADMIN_PASSWORD_HASH: diff --git a/frontend/js/services.js b/frontend/js/services.js index 9a508a4..efa949d 100644 --- a/frontend/js/services.js +++ b/frontend/js/services.js @@ -77,7 +77,7 @@ export async function serviceGetDHCPLease(id) { } // ----------------------------- -// Delete Hosts +// Delete DHCP Lease // ----------------------------- export async function serviceDeleteDHCPLease(id) { const data = await apiRequest( -- 2.47.3