🐛 fix(driver): 扩展 TDengine 历史版本选择范围

Fixes #325
This commit is contained in:
Syngnat
2026-04-11 21:53:53 +08:00
parent fcade0f860
commit af5e84213f
3 changed files with 163 additions and 8 deletions

View File

@@ -23,9 +23,10 @@
| #318 | mysql,bit 列,修改成 1 失败 | Fixed | `bee78be` |
| #319 | 关于运行外部 sql 文件的一些建议 | Deferred | - |
| #320 | 无法连接达梦数据库 | Fixed | `dc17133` |
| #325 | 有没有考虑对数据库的驱动版本进行选择或者自定义? | Fixed | Pending |
| #327 | SHOW DATABASES 报错 | Fixed | `5ac0221` |
| #328 | [Bug] 安装更新失败 | Fixed | `436f130` |
| #329 | 如果调整了左侧导航栏的宽度后,建议左侧导航栏内增加横向滚动查看 | Fixed | Pending |
| #329 | 如果调整了左侧导航栏的宽度后,建议左侧导航栏内增加横向滚动查看 | Fixed | `942ee2f` |
## Notes
@@ -65,6 +66,12 @@
- 处理:更新脚本统一输出为 CRLF块内错误码改为延迟展开旧文件回退路径统一为 `TARGET_OLD`,并将脚本启动方式收敛为 `cmd.exe /D /C call <script>`
- 验证:补充 `internal/app/methods_update_windows_script_test.go`覆盖批处理语法、Win10 回退路径、CRLF 行尾、延迟展开和启动命令构造。
### #325
- 根因TDengine 的版本列表虽然支持下拉选择,但后端在抓取与缓存 Go 模块版本时只保留最近 5 个版本,导致 `3.5.x / 3.3.x / 3.0.x` 这类旧版根本不会进入选择列表。
- 处理:放宽 TDengine 的历史版本窗口,并补充离线 fallback 版本矩阵;同时扩大模块版本缓存上限,确保旧版不会在抓取阶段就被截断。
- 验证:补充 `internal/app/methods_driver_version_test.go` 回归测试,覆盖缓存命中与 fallback 两条路径,并回归 Mongo 版本约束逻辑。
### #329
- 根因:侧边栏连接树被全局 Tree 样式固定为 `width: 100%`,标题同时启用了省略截断,导致缩窄侧栏后长节点无法形成横向溢出。

View File

@@ -282,6 +282,7 @@ const (
driverModuleVersionInspectLimit = 30
driverModuleVersionListMaxSize = 4 << 20
driverRecentVersionLimit = 5
driverModuleVersionFetchLimit = 64
driverVersionWarmupMinInterval = 30 * time.Second
driverBundleIndexMaxSize = 1 << 20
driverManifestMaxSize = 2 << 20
@@ -393,7 +394,8 @@ var driverGoModuleAliasPathMap = map[string][]string{
}
var driverExtraHistoryLimitMap = map[string]int{
"mongodb": 10,
"mongodb": 10,
"tdengine": 30,
}
var fallbackRecentDriverVersionsMap = map[string][]goModuleVersionMeta{
@@ -414,6 +416,35 @@ var fallbackRecentDriverVersionsMap = map[string][]goModuleVersionMeta{
{Version: "1.17.0"},
{Version: "1.16.1"},
},
"tdengine": {
{Version: "3.8.0"},
{Version: "3.7.8"},
{Version: "3.7.7"},
{Version: "3.7.6"},
{Version: "3.7.5"},
{Version: "3.7.4"},
{Version: "3.7.3"},
{Version: "3.7.2"},
{Version: "3.7.1"},
{Version: "3.7.0"},
{Version: "3.6.0"},
{Version: "3.5.8"},
{Version: "3.5.7"},
{Version: "3.5.6"},
{Version: "3.5.5"},
{Version: "3.5.4"},
{Version: "3.5.3"},
{Version: "3.5.2"},
{Version: "3.5.1"},
{Version: "3.5.0"},
{Version: "3.3.1"},
{Version: "3.1.0"},
{Version: "3.0.4"},
{Version: "3.0.3"},
{Version: "3.0.2"},
{Version: "3.0.1"},
{Version: "3.0.0"},
},
}
func (a *App) SelectDriverDownloadDirectory(currentDir string) connection.QueryResult {
@@ -1851,8 +1882,13 @@ func resolveRecentDriverVersionMetas(driverType string, limit int) []goModuleVer
}
modulePaths := resolveDriverGoModulePaths(normalized)
if len(modulePaths) > 0 {
result := make([]goModuleVersionMeta, 0, limit)
seen := make(map[string]struct{}, limit)
extraHistoryLimit := resolveDriverExtraHistoryLimit(normalized)
primaryLimit := limit + extraHistoryLimit
if primaryLimit <= 0 {
primaryLimit = limit
}
result := make([]goModuleVersionMeta, 0, primaryLimit)
seen := make(map[string]struct{}, primaryLimit)
appendUnique := func(values []goModuleVersionMeta, maxAppend int) {
if maxAppend <= 0 {
return
@@ -1877,9 +1913,9 @@ func resolveRecentDriverVersionMetas(driverType string, limit int) []goModuleVer
}
}
appendUnique(fetchGoModuleVersionMetasCached(modulePaths[0]), limit)
appendUnique(fetchGoModuleVersionMetasCached(modulePaths[0]), primaryLimit)
extraLimit := resolveDriverExtraHistoryLimit(normalized)
extraLimit := extraHistoryLimit
for _, modulePath := range modulePaths[1:] {
if extraLimit <= 0 {
break
@@ -2105,8 +2141,8 @@ func fetchGoModuleVersionMetas(modulePath string) ([]goModuleVersionMeta, error)
right := "v" + versions[j]
return semver.Compare(left, right) > 0
})
if len(versions) > driverRecentVersionLimit {
versions = versions[:driverRecentVersionLimit]
if len(versions) > driverModuleVersionFetchLimit {
versions = versions[:driverModuleVersionFetchLimit]
}
metas := make([]goModuleVersionMeta, 0, len(versions))

View File

@@ -162,6 +162,76 @@ func TestDownloadDriverPackageRejectsUnsupportedMongoVersion(t *testing.T) {
}
}
func TestResolveRecentDriverVersionMetasIncludesHistoricalTDengineVersionsFromCache(t *testing.T) {
seedGoModuleVersionCache(t, "github.com/taosdata/driver-go/v3", []string{
"3.8.0",
"3.7.8",
"3.7.7",
"3.7.6",
"3.7.5",
"3.7.4",
"3.7.3",
"3.7.2",
"3.7.1",
"3.7.0",
"3.6.0",
"3.5.8",
"3.5.7",
"3.5.6",
"3.5.5",
"3.5.4",
"3.5.3",
"3.5.2",
"3.5.1",
"3.5.0",
"3.3.1",
"3.1.0",
"3.0.4",
"3.0.3",
"3.0.2",
"3.0.1",
"3.0.0",
})
metas := resolveRecentDriverVersionMetas("tdengine", driverRecentVersionLimit)
versions := make([]string, 0, len(metas))
for _, meta := range metas {
versions = append(versions, meta.Version)
}
if !containsVersion(versions, "3.5.8") {
t.Fatalf("expected tdengine historical version 3.5.8 to remain selectable, got %v", versions)
}
if !containsVersion(versions, "3.3.1") {
t.Fatalf("expected tdengine historical version 3.3.1 to remain selectable, got %v", versions)
}
}
func TestResolveRecentDriverVersionMetasFallsBackToHistoricalTDengineMatrix(t *testing.T) {
driverModuleVersionMu.Lock()
original := driverModuleVersionMap
driverModuleVersionMap = map[string]goModuleVersionListCacheEntry{}
driverModuleVersionMu.Unlock()
t.Cleanup(func() {
driverModuleVersionMu.Lock()
driverModuleVersionMap = original
driverModuleVersionMu.Unlock()
})
metas := resolveRecentDriverVersionMetas("tdengine", driverRecentVersionLimit)
versions := make([]string, 0, len(metas))
for _, meta := range metas {
versions = append(versions, meta.Version)
}
if !containsVersion(versions, "3.5.8") {
t.Fatalf("expected tdengine fallback list to include 3.5.8, got %v", versions)
}
if !containsVersion(versions, "3.3.1") {
t.Fatalf("expected tdengine fallback list to include 3.3.1, got %v", versions)
}
}
func TestShouldForceSourceBuildForResolvedDownload(t *testing.T) {
if !shouldForceSourceBuildForResolvedDownload("mongodb", "1.17.4", "builtin://activate/mongodb?channel=history&version=1.17.4") {
t.Fatal("expected mongodb v1 builtin install to keep source build mode")
@@ -308,6 +378,48 @@ func cloneInt64Map(src map[string]int64) map[string]int64 {
return cloned
}
func seedGoModuleVersionCache(t *testing.T, modulePath string, versions []string) {
t.Helper()
driverModuleVersionMu.Lock()
original := make(map[string]goModuleVersionListCacheEntry, len(driverModuleVersionMap))
for key, value := range driverModuleVersionMap {
original[key] = goModuleVersionListCacheEntry{
LoadedAt: value.LoadedAt,
Versions: append([]goModuleVersionMeta(nil), value.Versions...),
Err: value.Err,
}
}
driverModuleVersionMap[modulePath] = goModuleVersionListCacheEntry{
LoadedAt: time.Now(),
Versions: mapVersionsToMetas(versions),
}
driverModuleVersionMu.Unlock()
t.Cleanup(func() {
driverModuleVersionMu.Lock()
driverModuleVersionMap = original
driverModuleVersionMu.Unlock()
})
}
func mapVersionsToMetas(versions []string) []goModuleVersionMeta {
result := make([]goModuleVersionMeta, 0, len(versions))
for _, version := range versions {
result = append(result, goModuleVersionMeta{Version: version})
}
return result
}
func containsVersion(versions []string, target string) bool {
for _, version := range versions {
if version == target {
return true
}
}
return false
}
func chdirTemp(t *testing.T) {
t.Helper()