Spaces:
Sleeping
Sleeping
feat: add sync worker to process database queue items and trigger automated FAISS index updates
Browse files
src/similarity_model/sync_worker.py
CHANGED
|
@@ -174,13 +174,42 @@ def process_single_item(engine, item) -> bool:
|
|
| 174 |
def run_worker():
|
| 175 |
logger.info("Initializing Sync Worker service...")
|
| 176 |
|
| 177 |
-
# Verify DB connection
|
| 178 |
try:
|
| 179 |
-
with engine.
|
| 180 |
-
|
| 181 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 182 |
except Exception as exc:
|
| 183 |
-
logger.critical(f"Database connection failed: {exc}")
|
| 184 |
sys.exit(1)
|
| 185 |
|
| 186 |
rebuild_manager = RebuildManager()
|
|
|
|
| 174 |
def run_worker():
|
| 175 |
logger.info("Initializing Sync Worker service...")
|
| 176 |
|
| 177 |
+
# Verify DB connection and auto-initialize schema/triggers if missing
|
| 178 |
try:
|
| 179 |
+
with engine.begin() as conn:
|
| 180 |
+
# 1. Check and create SyncQueue table
|
| 181 |
+
row = conn.execute(text("SELECT OBJECT_ID('SyncQueue', 'U')")).fetchone()
|
| 182 |
+
if row[0] is None:
|
| 183 |
+
logger.info("SyncQueue table does not exist. Initializing from DDL script...")
|
| 184 |
+
ddl_path = Path(__file__).resolve().parents[2] / "Data" / "database" / "create_sync_queue.sql"
|
| 185 |
+
if ddl_path.exists():
|
| 186 |
+
sql = ddl_path.read_text(encoding="utf-8")
|
| 187 |
+
conn.execute(text(sql))
|
| 188 |
+
logger.info("SyncQueue table and indexes created successfully.")
|
| 189 |
+
else:
|
| 190 |
+
logger.error("DDL script 'create_sync_queue.sql' not found!")
|
| 191 |
+
|
| 192 |
+
# 2. Check and deploy SQL triggers
|
| 193 |
+
row_trg = conn.execute(text("SELECT OBJECT_ID('trg_Projects_Insert', 'TR')")).fetchone()
|
| 194 |
+
if row_trg[0] is None:
|
| 195 |
+
logger.info("SQL Triggers do not exist on 'Projects'. Deploying triggers...")
|
| 196 |
+
triggers_path = Path(__file__).resolve().parents[2] / "Data" / "database" / "create_triggers.sql"
|
| 197 |
+
if triggers_path.exists():
|
| 198 |
+
sql_content = triggers_path.read_text(encoding="utf-8")
|
| 199 |
+
import re
|
| 200 |
+
# Split by SQL Server GO batch separator and execute statements individually
|
| 201 |
+
statements = re.split(r'(?i)\bGO\b', sql_content)
|
| 202 |
+
for stmt in statements:
|
| 203 |
+
stmt_clean = stmt.strip()
|
| 204 |
+
if stmt_clean:
|
| 205 |
+
conn.execute(text(stmt_clean))
|
| 206 |
+
logger.info("SQL Triggers deployed successfully.")
|
| 207 |
+
else:
|
| 208 |
+
logger.error("Trigger script 'create_triggers.sql' not found!")
|
| 209 |
+
|
| 210 |
+
logger.info("Database connection verified and schema initialized successfully.")
|
| 211 |
except Exception as exc:
|
| 212 |
+
logger.critical(f"Database connection or schema initialization failed: {exc}")
|
| 213 |
sys.exit(1)
|
| 214 |
|
| 215 |
rebuild_manager = RebuildManager()
|