dm-database-parser-sqllog

Crates.iodm-database-parser-sqllog
lib.rsdm-database-parser-sqllog
version0.6.0
created_at2025-11-07 16:01:24.659974+00
updated_at2025-12-02 10:01:52.817513+00
description一个高性能的达梦数据库 sqllog 日志解析库,提供零分配或低分配的记录切分与解析功能
homepagehttps://github.com/guangl/dm-parser-sqllog
repositoryhttps://github.com/guangl/dm-database-parser-sqllog
max_upload_size
id1921774
size80,077
guangluo (guangl)

documentation

https://docs.rs/dm-database-parser-sqllog

README

dm-database-parser-sqllog

Crates.io Documentation License: MIT Coverage

一个高性能的达梦数据库 sqllog 日志解析库,提供零分配或低分配的记录切分与解析功能。

主要特点

  • 零分配解析:基于时间戳的记录切分,使用流式 API 和 Cow 类型避免额外内存分配
  • 完全惰性解析:仅在需要时解析 SQL 正文和性能指标,大幅提升扫描速度
  • 极致性能:单线程处理速度超过 400 万条/秒(>1GB/s)
  • 轻量级结构:解析结果使用引用(&str),避免不必要的字符串复制
  • 详细的错误信息:所有解析错误都包含原始数据,便于调试和问题定位

安装

在你的 Cargo.toml 中添加依赖:

[dependencies]
dm-database-parser-sqllog = "0.6"

作为库使用

use dm_database_parser_sqllog::LogParser;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let parser = LogParser::from_path("large_log.sqllog")?;
    for result in parser.iter() {
        match result {
            Ok(sqllog) => {
                // 处理每条日志
                println!("SQL: {}", sqllog.body());
            }
            Err(e) => eprintln!("解析错误: {}", e),
        }
    }
    Ok(())
}

更多用法请参考 examples/ 目录,所有示例均为库用法,无可执行入口。

构建与测试

# 构建库
cargo build

# 运行测试
cargo test

# 生成文档
cargo doc --open

覆盖率 ≥ 90%(已在 CI 强制)

本仓库使用 cargo-llvm-cov 统计并卡住覆盖率下限为 90%。本地运行:

# 安装 cargo-llvm-cov(一次性)
cargo install cargo-llvm-cov

# 运行并在达不到 90% 时失败
cargo llvm-cov --workspace --all-features --fail-under-lines 90

基准作为性能基线(已在 CI 强制)

我们将 Criterion 基准的当前结果作为“性能基线”。任何改动不得慢于该基线(容忍度默认 0%)。

首次或更新基线(会运行基准并写入 benchmarks/baseline.json):

pwsh ./scripts/export_criterion_baseline.ps1

对比当前实现与基线(慢于基线将退出码 1):

pwsh ./scripts/check_criterion_against_baseline.ps1 -Baseline 'benchmarks/baseline.json' -TolerancePercent 0

CI 中已在 Windows 上执行上述校验以避免环境差异导致波动。

API 文档

完整的 API 文档请查看 docs.rs

文件解析 API(推荐)

  • [LogParser] - 从文件流式读取 SQL 日志,返回一个迭代器(内存映射 + 零拷贝)

核心类型

  • [Sqllog] - SQL 日志结构体(包含时间戳、元数据、SQL 正文等)
  • [ParseError] - 解析错误类型(包含详细错误信息)

设计与注意事项

  • 所有 API 都直接返回解析好的 Sqllog,无需手动调用解析方法
  • 采用内存映射 (mmap) 技术,适合处理大型日志文件(1GB 文件 < 1 秒)
  • 流式 API 内存占用低,适合超大文件或需要提前中断的场景
  • body()indicators_raw() 方法采用惰性求值,仅在调用时进行分割和 UTF-8 转换

测试

本项目包含了全面的测试套件:

  • 集成测试: tests/ 目录下的集成测试覆盖了常见场景
  • Benchmark 测试: 使用 Criterion.rs 进行性能基准测试,确保高性能
  • 100% 通过率: 所有测试当前状态均为通过

测试结构

集成测试 (tests/ 目录):

  • integration_test.rs - 核心功能集成测试

Benchmark 测试 (benches/ 目录):

  • parser_benchmark.rs - 解析器性能测试

许可证

MIT License - 详见 LICENSE 文件

相关链接

Commit count: 0

cargo fmt