Skip to content

收录 nanodbc(ODBC 的 C++ 封装)及其 linux 驱动管理器 unixODBC #209

Description

@FarnaHerry

请求收录

  • 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 侧两处修复(四年前的源码在现代工具链下的问题):

  1. libc++ 没有 char_traits<unsigned char>(C++23 起主模板只剩声明,nanodbc.cpp 有 4 处使用):force-include 一份显式特化(标准预留的用户定制点,_LIBCPP_VERSION 为界,不影响 libstdc++/MSVC)。
  2. SQL state 被截末字符(nanodbc 2.14.0 自身的 off-by-one):不改源码,测试按真实行为断言前缀。

unixODBC 侧两处复刻(均已与同 tarball 的 libtool 构建对拍验证行为一致):

  1. 无 libtool 的 ltdl dlopen loader 注册:-DLTDLOPEN=libltdlc + 从 libtool 目标文件重定位还原的 lt_libltdlc_LTX_preloaded_symbols 表。
  2. 两份 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 } 表。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions