Auto-commit: v2.11 — Fix live UI log feed (db_log_callback + run_status)
- web/tasks.py: db_log_callback bare `except: break` replaced with explicit `except Exception as _e: print(...)` so insertion failures are visible in Docker logs. Also fixed datetime.utcnow() → .isoformat() for clean string storage in SQLite. Same fix applied to db_progress_callback. - web/routes/run.py (run_status): added db.session.expire_all() to force fresh reads; raw sqlite3 bypass query when ORM returns no rows; file fallback wrapped in try/except with stdout error reporting; secondary check for web_console.log inside the run directory; utf-8 encoding on all file opens. - ai_blueprint.md: bumped to v2.11, documented root causes and fixes. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
15
web/tasks.py
15
web/tasks.py
@@ -18,25 +18,32 @@ huey = SqliteHuey('bookapp_queue', filename=os.path.join(config.DATA_DIR, 'queue
|
||||
|
||||
def db_log_callback(db_path, run_id, phase, msg):
|
||||
"""Writes log entry directly to SQLite to avoid Flask Context issues in threads."""
|
||||
import sys as _sys
|
||||
for _ in range(5):
|
||||
try:
|
||||
with sqlite3.connect(db_path, timeout=30, check_same_thread=False) as conn:
|
||||
conn.execute("INSERT INTO log_entry (run_id, timestamp, phase, message) VALUES (?, ?, ?, ?)",
|
||||
(run_id, datetime.utcnow(), phase, str(msg)))
|
||||
(run_id, datetime.utcnow().isoformat(), phase, str(msg)))
|
||||
break
|
||||
except sqlite3.OperationalError:
|
||||
time.sleep(0.1)
|
||||
except: break
|
||||
except Exception as _e:
|
||||
print(f"[db_log_callback ERROR run={run_id}] {type(_e).__name__}: {_e}", flush=True, file=_sys.stdout)
|
||||
break
|
||||
|
||||
def db_progress_callback(db_path, run_id, percent):
|
||||
"""Updates run progress in SQLite."""
|
||||
import sys as _sys
|
||||
for _ in range(5):
|
||||
try:
|
||||
with sqlite3.connect(db_path, timeout=30, check_same_thread=False) as conn:
|
||||
conn.execute("UPDATE run SET progress = ? WHERE id = ?", (percent, run_id))
|
||||
break
|
||||
except sqlite3.OperationalError: time.sleep(0.1)
|
||||
except: break
|
||||
except sqlite3.OperationalError:
|
||||
time.sleep(0.1)
|
||||
except Exception as _e:
|
||||
print(f"[db_progress_callback ERROR run={run_id}] {type(_e).__name__}: {_e}", flush=True, file=_sys.stdout)
|
||||
break
|
||||
|
||||
@huey.task()
|
||||
def generate_book_task(run_id, project_path, bible_path, allow_copy=True, feedback=None, source_run_id=None, keep_cover=False, exclude_folders=None):
|
||||
|
||||
Reference in New Issue
Block a user