v4.3.5
- edit Intercept trait, add
before
andafter
method - log plugin move to intercepts. move to
impl Intercept for LogInterceptor
impl Intercept for LogInterceptor {
fn before(
&self,
task_id: i64,
_rb: &dyn Executor,
sql: &mut String,
args: &mut Vec<Value>,
) -> Result<(), Error> {
if self.get_level_filter() == LevelFilter::Off {
return Ok(());
}
let level = self.to_level().unwrap();
//send sql/args
let op;
if sql.trim_start().starts_with("select") {
op = "query";
} else {
op = "exec ";
}
log!(level,"[rbatis] [{}] {} => `{}` {}",task_id,op,&sql,RbsValueDisplay { inner: args });
Ok(())
}
fn after(
&self,
task_id: i64,
_rb: &dyn Executor,
sql: &mut String,
_args: &mut Vec<Value>,
result: Result<ResultType<&mut ExecResult, &mut Vec<Value>>, &mut Error>,
) -> Result<(), Error> {
if self.get_level_filter() == LevelFilter::Off {
return Ok(());
}
let level = self.to_level().unwrap();
//recv sql/args
match result {
Ok(result) => {
let op;
if sql.trim_start().starts_with("select") {
op = "query";
} else {
op = "exec ";
}
match result {
ResultType::Exec(result) => {
log!(level,"[rbatis] [{}] {} <= rows_affected={}",task_id, op, result);
}
ResultType::Query(data) => {
if is_debug_mode() {
log!(level,"[rbatis] [{}] {} <= len={},rows={}",
task_id,
op,
data.len(),
RbsValueDisplay { inner: data }
);
} else {
log!(level,"[rbatis] [{}] {} <= len={}", task_id, op, data.len());
}
}
}
}
Err(e) => {
log!(level,"[rbatis] [{}] exec <= {}", task_id, e);
}
}
Ok(())
}
}
- now
RBatis
struct is very clean
pub struct RBatis {
// the connection pool
pub pool: Arc<OnceLock<Pool>>,
// intercept vec(default the intercepts[0] is a log interceptor)
pub intercepts: Arc<SyncVec<Arc<dyn Intercept>>>,
}
- Speed increases because interceptor logging optimizes the log printing process, speeding up every query and update operation by 200ns-300ns