mirror of
https://github.com/feigeCode/navop.git
synced 2026-09-22 08:01:27 +00:00
现象:连接某些 MySQL 兼容实现/代理时,结果列元数据的 character_set 字段为 0 (日志里 collation_id=0、charset=unknown、cause=charset-decode),而 decode_character 在拿不到 decoder 时一律降级为 DbValue::Binary,文本列因此在网格里 显示成「二进制 · N B」;元数据查询与自定义 SQL 不走 schema 纠偏,同样受影响。 样本显示这些字节是合法 UTF-8 且不含控制字符,即内容本身是文本。 修复:字符集未知(collation 0 / 未映射)时用严格 UTF-8 兜底解码,与 decode_untyped_bytes 对无类型字节的判定保持一致(合法 UTF-8 且无控制字符)。 非法 UTF-8 或含控制字符的字节仍保留二进制 sidecar;wire 已声明 collation 63 的 字节列仍走 wire-binary 分支;已声明字符集的列行为不变。 代价:字符集未知的服务端上,内容是「可打印 ASCII」的真二进制列会显示为文本; 这类字节此前显示为二进制,属显示层面的取舍,若需严格区分可按 BINARY_FLAG 收窄。 验证:cargo test -p db --lib 1314 passed;新增 3 个 codec 回归测试(collation 0 与 未映射 collation 的文本解为 Text,控制字符与非法 UTF-8 仍为 Binary); clippy -p db --all-targets 对本文件无告警。
Database Abstraction Layer
这个 crate 提供了一个统一的数据库抽象层,支持多种数据库类型。
架构
-
src/- 顶层接口和公共类型plugin.rs-DatabasePlugintrait 与数据库能力入口plugin_manifest.rs- 数据库 UI manifest 合同,承载表单、能力位、动作元数据manager.rs- 数据库管理器connection.rs- 连接接口和连接池executor.rs- SQL 执行器runtime.rs- Tokio 运行时types.rs- 公共类型定义
-
src/mysql/- MySQL 实现 -
src/postgresql/- PostgreSQL 实现 -
src/sqlite/- SQLite 实现
crates/db 现在同时负责两层职责:
- 数据库运行时能力:连接、元数据、SQL 构建、导入导出
- 数据库 UI 合同:
ui_manifest()返回纯数据 manifest,供db_view做统一渲染
新增数据库插件时,除了实现 DatabasePlugin 的运行时方法,也应在插件侧返回
对应的 DatabaseUiManifest,并通过 resolve_reference_data() 提供动态下拉数据
(如 charset / collation / engines)。
使用示例
use db::{DbManager, DatabaseType, DbConnectionConfig};
let manager = DbManager::new();
let plugin = manager.get_plugin(&DatabaseType::MySQL)?;
let connection = plugin.create_connection(config).await?;