mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-05-11 01:59:42 +08:00
* feat(http-tunnel): 支持独立 HTTP 隧道连接并覆盖多数据源 refs #168 * fix(kingbase-data-grid): 修复金仓打开表卡顿并降低对象渲染开销 refs #178 * fix(kingbase-transaction): 修复金仓事务提交重复引号导致语法错误 refs #176 * fix(driver-agent): 修复老版本 Win10 升级后金仓驱动代理启动失败 refs #177 * chore(ci): 新增手动触发的 macOS 测试构建工作流 * chore(ci): 允许测试工作流在当前分支自动触发 * fix(query-editor): 修复 SQL 编辑中光标随机跳到末尾 refs #185 * feat(data-sync): 增加差异 SQL 预览能力便于审核 refs #174 * fix(clickhouse-connect): 自动识别并回退 HTTP/Native 协议连接 refs #181 * fix(oracle-metadata): 修复视图与函数加载按 schema 过滤异常 refs #155 * fix(dameng-databases): 修复显示全部库时数据库列表不完整 refs #154 * fix(connection,db-list): 统一处理空列表返回并修复达梦连接测试报错 refs #157
75 lines
2.0 KiB
Go
75 lines
2.0 KiB
Go
package db
|
||
|
||
import (
|
||
"debug/pe"
|
||
"fmt"
|
||
"runtime"
|
||
"strings"
|
||
)
|
||
|
||
const (
|
||
peMachineI386 uint16 = 0x014c
|
||
peMachineAmd64 uint16 = 0x8664
|
||
peMachineArm64 uint16 = 0xaa64
|
||
)
|
||
|
||
func windowsMachineLabel(machine uint16) string {
|
||
switch machine {
|
||
case peMachineI386:
|
||
return "windows-386"
|
||
case peMachineAmd64:
|
||
return "windows-amd64"
|
||
case peMachineArm64:
|
||
return "windows-arm64"
|
||
default:
|
||
return fmt.Sprintf("windows-unknown(0x%04x)", machine)
|
||
}
|
||
}
|
||
|
||
func expectedWindowsMachineForGoArch(goarch string) (uint16, string, bool) {
|
||
switch strings.ToLower(strings.TrimSpace(goarch)) {
|
||
case "386":
|
||
return peMachineI386, "windows-386", true
|
||
case "amd64":
|
||
return peMachineAmd64, "windows-amd64", true
|
||
case "arm64":
|
||
return peMachineArm64, "windows-arm64", true
|
||
default:
|
||
return 0, "", false
|
||
}
|
||
}
|
||
|
||
func validateWindowsExecutableMachine(pathText string) error {
|
||
file, err := pe.Open(pathText)
|
||
if err != nil {
|
||
return fmt.Errorf("无法识别为有效的 Windows 可执行文件:%w", err)
|
||
}
|
||
defer file.Close()
|
||
|
||
expectedMachine, expectedLabel, ok := expectedWindowsMachineForGoArch(runtime.GOARCH)
|
||
if !ok {
|
||
return nil
|
||
}
|
||
actualMachine := file.FileHeader.Machine
|
||
if actualMachine != expectedMachine {
|
||
return fmt.Errorf("可执行文件架构不兼容(文件=%s,当前进程=%s)", windowsMachineLabel(actualMachine), expectedLabel)
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// ValidateOptionalDriverAgentExecutable 校验可选驱动代理二进制是否可在当前进程中执行。
|
||
// 当前主要用于 Windows 下的 PE 架构兼容性校验,避免升级后复用到错误架构的旧代理。
|
||
func ValidateOptionalDriverAgentExecutable(driverType string, executablePath string) error {
|
||
pathText := strings.TrimSpace(executablePath)
|
||
if pathText == "" {
|
||
return fmt.Errorf("%s 驱动代理路径为空", driverDisplayName(driverType))
|
||
}
|
||
if runtime.GOOS != "windows" {
|
||
return nil
|
||
}
|
||
if err := validateWindowsExecutableMachine(pathText); err != nil {
|
||
return fmt.Errorf("%s 驱动代理不可用:%w", driverDisplayName(driverType), err)
|
||
}
|
||
return nil
|
||
}
|