// 一次性探针:验证 ZLOCATION.ZPLACEID / ZVISIT.ZEVENTIDENTIFIER 是否跨备份稳定。 package main import ( "fmt" "os" "rond-with-you/internal/rond" ) type snap struct { placeID map[string]int eventID map[string]int nulls int total int evTotal int } func load(p string) *snap { dir, err := os.MkdirTemp("", "colprobe") if err != nil { panic(err) } defer os.RemoveAll(dir) db, err := rond.Open(p, dir) if err != nil { panic(err) } defer db.Close() s := &snap{placeID: map[string]int{}, eventID: map[string]int{}} rows, err := db.Query(`SELECT Z_PK, COALESCE(ZPLACEID,'') FROM ZLOCATION`) if err != nil { panic(err) } for rows.Next() { var pk int var id string rows.Scan(&pk, &id) s.total++ if id == "" { s.nulls++ } else { s.placeID[id] = pk } } rows.Close() rows, err = db.Query(`SELECT COALESCE(ZEVENTIDENTIFIER,'') FROM ZVISIT`) if err != nil { panic(err) } for rows.Next() { var id string rows.Scan(&id) if id != "" { s.eventID[id] = 1 s.evTotal++ } } rows.Close() fmt.Printf("%s: ZLOCATION %d 个(ZPLACEID 空 %d),ZEVENTIDENTIFIER 非空 %d\n", p, s.total, s.nulls, s.evTotal) return s } func main() { a := load(os.Args[1]) b := load(os.Args[2]) inter, samePK := 0, 0 for k, pa := range a.placeID { if pb, ok := b.placeID[k]; ok { inter++ if pa == pb { samePK++ } } } fmt.Printf("\nZPLACEID 交集 %d(A 独有 %d,B 独有 %d),其中 Z_PK 相同 %d\n", inter, len(a.placeID)-inter, len(b.placeID)-inter, samePK) ei := 0 for k := range a.eventID { if _, ok := b.eventID[k]; ok { ei++ } } fmt.Printf("ZEVENTIDENTIFIER 交集 %d(A %d / B %d)\n", ei, len(a.eventID), len(b.eventID)) }