备份(.rondbackup)与迷雾(.fwss)各加一层「先看差异再动手」: - 迷雾:上传先出差异页,说清叠加能补多少、整体替换会丢多少,并在真实底图上 用绿/灰/红标出会新增 / 不变 / 会丢的区域 - 备份:与当前数据集按 UUID 逐条比对(rond 每次导出都会重排 Z_PK,编号认不出人), 新增合入、冲突逐条选、仅站内有逐条勾选删除,全在一个事务里执行; 合入的行写回 entity_raw,保证再传同一份备份时差异归零 - 地点按坐标对齐:站点的「补全地址」会把地点改名,拿名称当键会让一整个地点的 到访全变成假冲突 - 附属数据(备注/结论/访客票/图片)从 dataset_id+src_pk 换成坐标键,换数据集不再失联; 访客票没有 dataset_id,回填按活跃数据集认领 - 修正 contentHash 拿 Z_PK 当指纹的隐患,以及两处「src_pk 跨快照稳定」的错误注释 导出格式(.rondbackup / .fwss)保持原样,往返测试通过。
41 lines
899 B
Go
41 lines
899 B
Go
// 一次性探针:调用站点的导出逻辑产出一份 .rondbackup,用于核对
|
|
// 「站点导出 → 导入 rond → rond 再导出」这条链路上 UUID 与 Z_PK 是否还连贯。
|
|
package main
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"fmt"
|
|
"os"
|
|
"strconv"
|
|
|
|
_ "github.com/jackc/pgx/v5/stdlib"
|
|
|
|
"rond-with-you/internal/rond"
|
|
)
|
|
|
|
func main() {
|
|
if len(os.Args) < 5 {
|
|
fmt.Println("用法: exportprobe <dsn> <datasetID> <baseline.sqlite> <out.rondbackup>")
|
|
os.Exit(2)
|
|
}
|
|
dsID, err := strconv.ParseInt(os.Args[2], 10, 64)
|
|
must(err)
|
|
db, err := sql.Open("pgx", os.Args[1])
|
|
must(err)
|
|
defer db.Close()
|
|
|
|
f, err := os.Create(os.Args[4])
|
|
must(err)
|
|
defer f.Close()
|
|
must(rond.ExportRondbackup(context.Background(), db, dsID, os.Args[3], f))
|
|
fmt.Printf("已导出到 %s\n", os.Args[4])
|
|
}
|
|
|
|
func must(err error) {
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, "错误:", err)
|
|
os.Exit(1)
|
|
}
|
|
}
|