#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""fix_jxdy_constraint.py —— 最小改动修 FTS 双写"""
import ast, os, shutil, subprocess, sqlite3
D = "/root/gov_crawler/"; f = "crawl_jxdy_hjypj.py"; p = D + f
src = open(p, encoding="utf-8").read()
before = src
src = src.replace("INSERT INTO gov_search (rowid", "INSERT OR REPLACE INTO gov_search (rowid")
src = src.replace("INSERT INTO gov_raw (", "INSERT OR IGNORE INTO gov_raw (")
ch = []
if "INSERT OR REPLACE INTO gov_search (rowid" in src and "INSERT OR REPLACE INTO gov_search (rowid" not in before: ch.append("gov_search -> OR REPLACE")
if "INSERT OR IGNORE INTO gov_raw (" in src and "INSERT OR IGNORE INTO gov_raw (" not in before: ch.append("gov_raw -> OR IGNORE")
print("改动:", ch or "无（可能已改过）")
try: ast.parse(src)
except SyntaxError as e: raise SystemExit("语法错 %s" % e)
if ch:
    b = D + "Archive/" + f + ".bak_20260925_ftsdual"
    if not os.path.exists(b): shutil.copy2(p, b)
    open(p, "w", encoding="utf-8").write(src)
db = sqlite3.connect("file:/root/search.db?mode=ro", uri=True, timeout=30)
n0 = db.execute("SELECT COUNT(*) FROM gov_raw WHERE page_url LIKE '%jxdy.gov.cn%'").fetchone()[0]
print("跑前行数: %d" % n0)
r = subprocess.run(["python3", p], capture_output=True, text=True, timeout=170, cwd=D)
outs = [x for x in (r.stdout or "").strip().split("\n") if x.strip()][-3:]
print("实跑 EXIT=%d" % r.returncode)
for x in outs: print("   out:", x[:110])
db2 = sqlite3.connect("file:/root/search.db?mode=ro", uri=True, timeout=30)
n1 = db2.execute("SELECT COUNT(*) FROM gov_raw WHERE page_url LIKE '%jxdy.gov.cn%'").fetchone()[0]
print("跑后行数: %d (%s)" % (n1, "✅增加 %d" % (n1 - n0) if n1 > n0 else "未变"))
