pub struct SqlParser { /* private fields */ }Expand description
SQL Parser with dialect awareness and caching support
§缓存优化
此实现包含 LRU 缓存,用于缓存已解析的 SQL 操作。 缓存可以显著提高重复 SQL 语句的解析性能。
§示例
ⓘ
use dbnexus::sql_parser::SqlParser;
let parser = SqlParser::new();
let result = parser.parse_operation("SELECT * FROM users");
// 第二次解析相同 SQL 会使用缓存
let cached = parser.parse_operation("SELECT * FROM users");Implementations§
Source§impl SqlParser
impl SqlParser
Sourcepub async fn new() -> Self
pub async fn new() -> Self
Create a new SQL parser with generic dialect support and default cache
获取全局共享的 SqlParser 实例(推荐)
首次调用时初始化 parser + 缓存,后续调用直接返回 Arc 引用。 缓存跨所有 Session/DbPool 共享,避免重复创建开销。
性能对比:
SqlParser::new().await:每次创建新 Cache(async + 内存分配)SqlParser::shared().await:首次创建,后续 O(1) 返回 Arc clone
Sourcepub async fn with_cache_size(cache_size: usize) -> Self
pub async fn with_cache_size(cache_size: usize) -> Self
Create a parser with specific cache size
Sourcepub async fn with_dialect(_db_type: &str) -> Self
pub async fn with_dialect(_db_type: &str) -> Self
Create a parser with specific database dialect
Sourcepub async fn clear_cache(&self)
pub async fn clear_cache(&self)
清空解析缓存
Sourcepub fn cache_stats(&self) -> (u64, u64)
pub fn cache_stats(&self) -> (u64, u64)
获取缓存命中率统计
返回 (命中次数, 未命中次数) 的元组
Sourcepub async fn parse_single(
&self,
sql: &str,
) -> Result<ParsedSqlOperation, SqlParseError>
pub async fn parse_single( &self, sql: &str, ) -> Result<ParsedSqlOperation, SqlParseError>
Sourcepub fn parse_operation(&self, sql: &str) -> Option<(String, PermissionAction)>
pub fn parse_operation(&self, sql: &str) -> Option<(String, PermissionAction)>
Parse SQL and extract operation type (simplified version for backward compatibility)
§返回值
Some((table_name, action))- 成功解析的 DML 操作None- 不支持的语句类型(DDL/DCL/Transaction)或解析失败
§注意
此方法仅支持 DML 操作(SELECT, INSERT, UPDATE, DELETE)。
对于 DDL、DCL 和 Transaction 操作,返回 None。
建议使用 parse_single() 获取完整的解析结果,包括操作类型信息。
§缓存行为
此方法使用内部缓存来加速重复查询。
§警告
此同步方法使用 block_on 来执行异步解析。
在异步上下文中(如 #[tokio::test])会导致运行时冲突。
请使用 parse_operation_async() 替代。
Sourcepub async fn parse_operation_async(
&self,
sql: &str,
) -> Result<Option<(String, PermissionAction)>, SqlParseError>
pub async fn parse_operation_async( &self, sql: &str, ) -> Result<Option<(String, PermissionAction)>, SqlParseError>
Trait Implementations§
Auto Trait Implementations§
impl !Freeze for SqlParser
impl !RefUnwindSafe for SqlParser
impl !UnwindSafe for SqlParser
impl Send for SqlParser
impl Sync for SqlParser
impl Unpin for SqlParser
impl UnsafeUnpin for SqlParser
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
Source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
Wrap the input message
T in a tonic::Request