next_web_dev/middleware/database/
impl_query_wrapper.rs1use async_trait::async_trait;
2use next_web_common::query::query_wrapper::{QueryWrapper, TableName, Wrapper};
3use rbatis::RBatis;
4use serde::de::DeserializeOwned;
5use std::result::Result as StdResult;
6
7type Result<V> = StdResult<V, rbatis::Error>;
8
9#[async_trait]
11pub trait SelectWrapper {
12 async fn select_list<T, V>(&self, wrapper: QueryWrapper<'static, T>) -> Result<Vec<T>>
13 where
14 T: DeserializeOwned + TableName + Send + Sync + 'static,
15 V: DeserializeOwned,
16 {
17 self.execute(wrapper).await
18 }
19
20 async fn select_one<T, V>(&self, wrapper: QueryWrapper<'static, T>) -> Result<T>
21 where
22 T: DeserializeOwned + TableName + Send + Sync + 'static,
23 V: DeserializeOwned,
24 {
25 self.execute(wrapper).await
26 }
27
28 async fn select_count<T, V>(&self, wrapper: QueryWrapper<'static, T>) -> Result<usize>
29 where
30 T: DeserializeOwned + TableName + Send + Sync + 'static,
31 V: DeserializeOwned,
32 {
33 self.execute(wrapper.select(vec!["COUNT(1) as count"]))
34 .await
35 }
36
37 async fn execute<T, V>(&self, wrapper: QueryWrapper<'static, T>) -> Result<V>
38 where
39 T: DeserializeOwned + TableName + Send + Sync + 'static,
40 V: DeserializeOwned;
41}
42
43#[async_trait]
44impl SelectWrapper for RBatis {
45 async fn execute<T, V>(&self, wrapper: QueryWrapper<'static, T>) -> Result<V>
46 where
47 T: DeserializeOwned + TableName + Send + Sync + 'static,
48 V: DeserializeOwned,
49 {
50 self.query_decode(&wrapper.generate_sql(), vec![]).await
51 }
52}