]> git.giorgioravera.it Git - network-manager.git/commitdiff
fixed init db in case of db reset
authorGiorgio Ravera <giorgio.ravera@gmail.com>
Mon, 1 Jun 2026 08:15:58 +0000 (10:15 +0200)
committerGiorgio Ravera <giorgio.ravera@gmail.com>
Mon, 1 Jun 2026 08:15:58 +0000 (10:15 +0200)
backend/db/aliases.py
backend/db/db.py
backend/db/hosts.py
backend/db/settings.py
backend/db/users.py
frontend/js/services.js

index 1c803ff1e391c9beb09d255c39d74bb8a33434c4..73465ef9adeb1b5194d18b453ea6051178ef3db9 100644 (file)
@@ -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
index 8d79c375a57aafbcbc651110292ca15522af9e00..e06c7a41f0a7dccee3fcd3a06d28f735a3d725bb 100644 (file)
@@ -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()
index 937dd70e60664f00077cc6b935b0ed19911fa486..3498df5f72654ed627b772b611e7036bda9882b3 100644 (file)
@@ -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
index e8500119e48ed7f719927b61c5fbe5160567e37d..636c93997abb1f06f2e685cce7435324676cd49d 100644 (file)
@@ -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
index ee86b3b36841baa3ace047efefa49cac388e438d..d5981bcef934fea922bcf90e87047e393b62766a 100644 (file)
@@ -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:
index 9a508a4a0d7da2c0ef0f025d64353d14a835a461..efa949dc44f551d766ef21c71c37ab285d3ac863 100644 (file)
@@ -77,7 +77,7 @@ export async function serviceGetDHCPLease(id) {
 }
 
 // -----------------------------
-// Delete Hosts
+// Delete DHCP Lease
 // -----------------------------
 export async function serviceDeleteDHCPLease(id) {
     const data = await apiRequest(