db_state.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. """Final DB state snapshot — full A→B→C chain evidence."""
  2. import sys
  3. from pathlib import Path
  4. _HERE = Path(__file__).resolve().parent
  5. sys.path.insert(0, str(_HERE.parent / "src"))
  6. from cq2_sdk.env_loader import load_env
  7. load_env(_HERE.parent / ".env")
  8. from cq2_sdk.store import connection
  9. with connection() as conn:
  10. with conn.cursor() as cur:
  11. cur.execute(
  12. "SELECT id, username, phone, LEFT(token, 24) AS tok, "
  13. "password_hash IS NOT NULL AS has_pwd FROM users "
  14. "WHERE username = 'longwu988'"
  15. )
  16. u = cur.fetchone()
  17. print("[users]")
  18. print(f" id={u['id']} username={u['username']!r} phone={u['phone']!r}")
  19. print(f" token={u['tok']}... password_preserved={bool(u['has_pwd'])}")
  20. cur.execute("SELECT COUNT(*) AS n FROM zones")
  21. zc = cur.fetchone()["n"]
  22. cur.execute(
  23. "SELECT zone_id, zone_name, host, port, status, open_time "
  24. "FROM zones WHERE host IS NOT NULL"
  25. )
  26. print(f"\n[zones] total={zc}, with gateway:")
  27. for z in cur.fetchall():
  28. print(f" zone_id={z['zone_id']} {z['zone_name']!r} "
  29. f"{z['host']}:{z['port']} status={z['status']} "
  30. f"open={str(z['open_time'])[:16]}")
  31. cur.execute(
  32. "SELECT id, user_id, server_id, zone_id, status, snapshot_path "
  33. "FROM runs ORDER BY id DESC LIMIT 2"
  34. )
  35. print(f"\n[runs] latest:")
  36. for r in cur.fetchall():
  37. env = str(r["snapshot_path"] or "").split("\\")[-1]
  38. print(f" run id={r['id']} user={r['user_id']} zone={r['zone_id']} "
  39. f"status={r['status']!r} env_file={env}")