mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-05-12 05:29:40 +08:00
- 新增差异分析/预览接口与前端预览抽屉(插入/更新/删除) - 支持按表勾选插入/更新/删除(删除默认不勾选) - 支持按主键选择行级同步;无主键/复合主键表跳过并提示 - 同步过程实时输出中文日志与进度条,便于定位失败步骤
59 lines
1.0 KiB
Go
59 lines
1.0 KiB
Go
package db
|
||
|
||
import (
|
||
"encoding/hex"
|
||
"unicode"
|
||
"unicode/utf8"
|
||
)
|
||
|
||
// normalizeQueryValue normalizes driver-returned values for UI/JSON transport.
|
||
// 当前主要处理 []byte:如果是可读文本则转为 string,否则转为十六进制字符串,避免前端出现“空白值”。
|
||
func normalizeQueryValue(v interface{}) interface{} {
|
||
if b, ok := v.([]byte); ok {
|
||
return bytesToReadableString(b)
|
||
}
|
||
return v
|
||
}
|
||
|
||
func bytesToReadableString(b []byte) interface{} {
|
||
if b == nil {
|
||
return nil
|
||
}
|
||
if len(b) == 0 {
|
||
return ""
|
||
}
|
||
|
||
if utf8.Valid(b) {
|
||
s := string(b)
|
||
if isMostlyPrintable(s) {
|
||
return s
|
||
}
|
||
}
|
||
|
||
return "0x" + hex.EncodeToString(b)
|
||
}
|
||
|
||
func isMostlyPrintable(s string) bool {
|
||
if s == "" {
|
||
return true
|
||
}
|
||
|
||
total := 0
|
||
printable := 0
|
||
for _, r := range s {
|
||
total++
|
||
switch r {
|
||
case '\n', '\r', '\t':
|
||
printable++
|
||
continue
|
||
default:
|
||
}
|
||
if unicode.IsPrint(r) {
|
||
printable++
|
||
}
|
||
}
|
||
|
||
// 允许少量不可见字符,避免把正常文本误判为二进制。
|
||
return printable*100 >= total*90
|
||
}
|