1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
//! # DM Database Parser - SQL Log
//!
//! 一个高性能的达梦数据库 SQL 日志解析器,支持批量解析和流式处理。
//!
//! ## 功能特性
//!
//! - **高性能解析**: 使用零拷贝和预编译正则表达式优化性能
//! - **灵活的 API**: 支持批量解析和流式处理两种模式
//! - **完整的类型安全**: 使用强类型结构表示日志数据
//! - **详细的错误信息**: 提供清晰的错误类型和消息
//!
//! ## 快速开始
//!
//! ### 从文件迭代处理 Sqllogs(推荐)
//!
//! ```rust,no_run
//! use dm_database_parser_sqllog::LogParser;
//!
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
//! let parser = LogParser::from_path("sqllog.txt")?;
//! for result in parser.iter() {
//! match result {
//! Ok(sqllog) => {
//! println!("时间戳: {}", sqllog.ts);
//! println!("用户: {}", sqllog.parse_meta().username);
//! println!("SQL: {}", sqllog.body());
//! }
//! Err(e) => eprintln!("解析错误: {}", e),
//! }
//! }
//! # Ok(())
//! # }
//! ```
//!
//! ### 从文件批量加载并解析为 Sqllog(自动并行处理)
//!
//! ```rust,no_run
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
//! // 若需要一次性加载所有记录到内存,可从迭代器收集:
//! let parser = dm_database_parser_sqllog::LogParser::from_path("sqllog.txt")?;
//! let results: Vec<_> = parser.iter().collect();
//! let sqllogs: Vec<_> = results.iter().filter_map(|r| r.as_ref().ok().cloned()).collect();
//! let errors: Vec<_> = results.iter().filter_map(|r| r.as_ref().err().cloned()).collect();
//! println!("成功解析 {} 条 SQL 日志", sqllogs.len());
//! println!("遇到 {} 个错误", errors.len());
//!
//! // 直接使用解析好的 Sqllog
//! for sqllog in sqllogs {
//! println!("用户: {}, SQL: {}", sqllog.parse_meta().username, sqllog.body());
//! }
//! # Ok(())
//! # }
//! ```
//!
//! ## 日志格式
//!
//! 支持的日志格式示例:
//!
//! ```text
//! 2025-08-12 10:57:09.548 (EP[0] sess:123 thrd:456 user:alice trxid:789 stmt:999 appname:myapp) SELECT * FROM table
//! ```
//!
//! 可选的性能指标:
//!
//! ```text
//! SELECT * FROM table EXECTIME: 10.5(ms) ROWCOUNT: 100(rows) EXEC_ID: 12345.
//! ```
pub
pub
pub
pub use ParseError;
pub use ;
pub use ;