#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""qc_verify_d12.py —— 反验 D12「手写 INSERT 缺 script_name」是否真会产空名行"""
import json
import os
import re
import sqlite3

D = "/root/gov_crawler/"
J = json.load(open(D + "qc_out/qc_tier1_20260925.json", encoding="utf-8"))
d12 = [x["script"] for x in J["issues"].get("D12 手写 INSERT 缺 script_name（会持续产生空名行）", [])]
d3 = [x["script"] for x in J["issues"].get("D3 无 --pages 且有全站翻页风险（日跑撞 600s 超时）", [])]
print("D12 = %d 个 | D3 = %d 个" % (len(d12), len(d3)))

db = sqlite3.connect("file:/root/search.db?mode=ro", uri=True, timeout=30)
db.execute("PRAGMA busy_timeout=30000")

print("\n=== ① 抽 5 个 D12 脚本：看 INSERT 语句真实上下文 ===")
for sc in d12[:5]:
    t = open(D + sc, encoding="utf-8", errors="ignore").read()
    m = re.search(r"INSERT\s+(?:OR\s+\w+\s+)?INTO\s+gov_raw\s*\(([^)]*)\)", t, re.I)
    line = t[:m.start()].count("\n") + 1 if m else 0
    print("  [%s] 第 %d 行" % (sc, line))
    print("     列: %s" % (re.sub(r"\s+", " ", m.group(1))[:150] if m else "?"))
    print("     上下文: %s" % re.sub(r"\s+", " ", t[max(0, m.start() - 90):m.start() + 130])[:200] if m else "")

print("\n=== ② 关键反验：这些脚本负责的站点，库里有没有空 script_name 行？===")
tot_empty = 0
for sc in d12[:12]:
    # 用脚本内的 SITE_NAME 常量找站点
    t = open(D + sc, encoding="utf-8", errors="ignore").read()
    sn = re.findall(r'SITE_NAME\s*=\s*["\']([^"\']{2,60})["\']', t)
    if not sn:
        continue
    q = " OR ".join(["site_name=?"] * len(sn))
    e = db.execute("SELECT COUNT(*) FROM gov_raw WHERE (%s) AND (script_name IS NULL OR TRIM(script_name)='')" % q, sn).fetchone()[0]
    n = db.execute("SELECT COUNT(*) FROM gov_raw WHERE (%s)" % q, sn).fetchone()[0]
    filled = db.execute("SELECT COUNT(*) FROM gov_raw WHERE (%s) AND script_name=?" % q, list(sn) + [sc]).fetchone()[0]
    tot_empty += e
    print("  %-34s 站点=%-26s 总 %5d 行 | 空名 %4d | 已按本脚本名填入 %5d" % (
        sc[:34], (sn[0] if sn else "?")[:26], n, e, filled))
print("  → 这 12 个脚本对应站点里，空名行合计: %d" % tot_empty)

print("\n=== ③ 空名行到底是谁产的（反查最后入库时间/来源）===")
for r in db.execute("SELECT site_name, COUNT(*) c FROM gov_raw "
                    "WHERE script_name IS NULL OR TRIM(script_name)='' "
                    "GROUP BY site_name ORDER BY c DESC LIMIT 12"):
    print("  %-46s %5d 行" % ((r[0] or "(空)")[:46], r[1]))

print("\n=== ④ D3 抽样（确认「无页数上限」判定对不对）===")
for sc in d3[:5]:
    t = open(D + sc, encoding="utf-8", errors="ignore").read()
    hits = [k for k in ("total_pages", "totalpage", "_nPageCount", "pageCount", "totalPages") if k in t]
    loop = re.search(r"range\(\s*2\s*,[^\n)]{0,40}", t)
    print("  %-34s 页码变量=%-28s 循环=%s" % (sc[:34], ",".join(hits[:3]), (loop.group(0) if loop else "无")))
db.close()
