//go:build llm_script && !scripts_pkg package main import ( "database/sql" "flag" "fmt" "os" "strings" _ "github.com/lib/pq" ) const catalogSeedVerificationImporterKey = "import_catalog_seed_verification.go" type catalogSeedVerificationConfig struct { DryRun bool } func main() { loadCatalogSeedVerificationEnv() var cfg catalogSeedVerificationConfig flag.BoolVar(&cfg.DryRun, "dry-run", false, "仅打印摘要,不写入数据库") flag.Parse() db, err := catalogSeedVerificationDB() if err != nil { fmt.Fprintf(os.Stderr, "open db: %v\n", err) os.Exit(1) } defer db.Close() if err := runCatalogSeedVerificationImport(db, cfg); err != nil { fmt.Fprintf(os.Stderr, "import_catalog_seed_verification: %v\n", err) os.Exit(1) } } func loadCatalogSeedVerificationEnv() { for _, path := range []string{".env.local", ".env"} { data, err := os.ReadFile(path) if err != nil { continue } for _, line := range strings.Split(string(data), "\n") { line = strings.TrimSpace(line) if line == "" || strings.HasPrefix(line, "#") { continue } key, value, ok := strings.Cut(line, "=") if !ok { continue } key = strings.TrimSpace(key) value = strings.Trim(strings.TrimSpace(value), `"'`) if key == "" { continue } if _, exists := os.LookupEnv(key); exists { continue } _ = os.Setenv(key, value) } } } func catalogSeedVerificationDB() (*sql.DB, error) { dsn := os.Getenv("DATABASE_URL") if dsn == "" { dsn = "postgres://long@/llm_intelligence?host=/var/run/postgresql" } return sql.Open("postgres", dsn) } func runCatalogSeedVerificationImport(db *sql.DB, cfg catalogSeedVerificationConfig) error { var count int if err := db.QueryRow(` SELECT COUNT(*) FROM plan_catalog_inventory WHERE importer_key = $1 `, catalogSeedVerificationImporterKey).Scan(&count); err != nil { return err } if cfg.DryRun { fmt.Printf("source=catalog-seed-verification entries=%d dry_run=true\n", count) return nil } _, err := db.Exec(` UPDATE plan_catalog_inventory SET plan_status = 'confirmed', notes = CASE WHEN position($2 in COALESCE(notes, '')) > 0 THEN notes WHEN COALESCE(notes, '') = '' THEN $2 ELSE notes || ';' || $2 END, last_checked_at = CURRENT_TIMESTAMP, updated_at = CURRENT_TIMESTAMP WHERE importer_key = $1 `, catalogSeedVerificationImporterKey, strings.TrimSpace("当前链路为目录级官方入口核验,结构化公开价格待后续独立 importer 补齐。")) if err != nil { return err } fmt.Printf("source=catalog-seed-verification entries=%d dry_run=false\n", count) return nil }