请求收录
- nanodbc v2.14.0(MIT):原生 C ODBC API 的薄 C++ 封装(RAII connection / statement / result)。上游已冻结(末版 2022-03,此后无提交),版本不会演进,适合一次性收录。ODBC 仍是接入大量既有数据源(SQL Server、Access、各类国产库)的通用门,索引里目前没有任何 ODBC 相关的包。
- unixODBC 2.3.14(LGPL-2.1):linux 的 ODBC driver manager,nanodbc 在该平台的必需依赖(见下)。
对应 PR 随本 issue 提交。
为什么 unixODBC 也要打包(而不是系统依赖 + -lodbc)
最初按"系统依赖"实现时编译、链接都通过,但 mcpp 的运行时闭包检查拒绝产物:libodbc.so.2 只能来自宿主,而 mcpp 二进制的 PT_INTERP 是私有 loader,不查宿主 /usr/lib(与 mcpp#352 libGL 同一堵墙)。windows 用 SDK 的 odbc32、macOS 用系统 iODBC 都没有这个问题;linux 没有系统级管理器,所以与 conan / vcpkg 的结论一致 —— 从源码静态构建,消费者不带 libodbc.so.2 NEEDED,闭包天然通过,也没有宿主 glibc 错配风险。
包形态
| 包 |
形态 |
要点 |
compat.nanodbc |
A(C++ 源码) |
一头一实现;两个冻结上游修复见下 |
compat.unixodbc |
E 叠 A(冻结 config + 纯 C 源码) |
DM + odbcinst + ini/log/lst + libltdl 静态编入单目标 odbc,与上游 libodbc.a 符号集一致 |
nanodbc 侧两处修复(四年前的源码在现代工具链下的问题):
- libc++ 没有
char_traits<unsigned char>(C++23 起主模板只剩声明,nanodbc.cpp 有 4 处使用):force-include 一份显式特化(标准预留的用户定制点,_LIBCPP_VERSION 为界,不影响 libstdc++/MSVC)。
- SQL state 被截末字符(nanodbc 2.14.0 自身的 off-by-one):不改源码,测试按真实行为断言前缀。
unixODBC 侧两处复刻(均已与同 tarball 的 libtool 构建对拍验证行为一致):
- 无 libtool 的 ltdl dlopen loader 注册:
-DLTDLOPEN=libltdlc + 从 libtool 目标文件重定位还原的 lt_libltdlc_LTX_preloaded_symbols 表。
- 两份 config.h 合并:ltdl 独有宏并入顶层 config(ltdl 源码不读冲突宏),绕开无法在管道中幸存的带引号
-DLT_CONFIG_H。
测试
tests/examples/nanodbc 为无数据库、无驱动的错误路径测试:连接不存在的 DSN 必抛 nanodbc::database_error,SQL state 前缀 + 管理器原文诊断证明链路真实。成员按 linux 门控。
本地验证:mcpp test -p nanodbc 冷构建 1/1 通过(无宿主路径注入);全部 lint 脚本通过;98 个描述符在钉住的 MCPP_VERSION 下 mcpp xpkg parse 通过。
待办(CN 镜像)
本贡献者无 mcpp-res 写权限,两个描述符暂用纯字符串 GLOBAL url(lint 允许,同 compat.libmysqlclient 先例)。请维护者在 gitcode 建仓后告知 slug,我可以跟进补 { GLOBAL, CN } 表。
请求收录
对应 PR 随本 issue 提交。
为什么 unixODBC 也要打包(而不是系统依赖 +
-lodbc)最初按"系统依赖"实现时编译、链接都通过,但 mcpp 的运行时闭包检查拒绝产物:
libodbc.so.2只能来自宿主,而 mcpp 二进制的 PT_INTERP 是私有 loader,不查宿主/usr/lib(与 mcpp#352 libGL 同一堵墙)。windows 用 SDK 的 odbc32、macOS 用系统 iODBC 都没有这个问题;linux 没有系统级管理器,所以与 conan / vcpkg 的结论一致 —— 从源码静态构建,消费者不带libodbc.so.2NEEDED,闭包天然通过,也没有宿主 glibc 错配风险。包形态
compat.nanodbccompat.unixodbcodbc,与上游libodbc.a符号集一致nanodbc 侧两处修复(四年前的源码在现代工具链下的问题):
char_traits<unsigned char>(C++23 起主模板只剩声明,nanodbc.cpp 有 4 处使用):force-include 一份显式特化(标准预留的用户定制点,_LIBCPP_VERSION为界,不影响 libstdc++/MSVC)。unixODBC 侧两处复刻(均已与同 tarball 的 libtool 构建对拍验证行为一致):
-DLTDLOPEN=libltdlc+ 从 libtool 目标文件重定位还原的lt_libltdlc_LTX_preloaded_symbols表。-DLT_CONFIG_H。测试
tests/examples/nanodbc为无数据库、无驱动的错误路径测试:连接不存在的 DSN 必抛nanodbc::database_error,SQL state 前缀 + 管理器原文诊断证明链路真实。成员按 linux 门控。本地验证:
mcpp test -p nanodbc冷构建 1/1 通过(无宿主路径注入);全部 lint 脚本通过;98 个描述符在钉住的 MCPP_VERSION 下mcpp xpkg parse通过。待办(CN 镜像)
本贡献者无
mcpp-res写权限,两个描述符暂用纯字符串 GLOBAL url(lint 允许,同compat.libmysqlclient先例)。请维护者在 gitcode 建仓后告知 slug,我可以跟进补{ GLOBAL, CN }表。