Advertisement
flalli

Rusqlite syntactic sugar

May 2nd, 2023
1,576
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 3.27 KB | Source Code | 0 0
  1. #[macro_export]
  2. macro_rules! easy_update {
  3.     ( $update_query:expr, $params:expr ) => {
  4.         {
  5.             let run = || -> Result<u32, DatabaseError> {
  6.                 let conn = get_db_connection()?;
  7.                 let mut cached_statement = conn.prepare_cached($update_query)
  8.                         .map_err(|err| {
  9.                             DatabaseError::ConnectionError(format!("error preparing statement for update: {} - {}", $update_query, err))
  10.                         })?;
  11.  
  12.                 let update_result = cached_statement.execute($params);
  13.  
  14.                 match update_result {
  15.                     Err(err) => {
  16.                         let msg : String = format!("error executing update: {} - {}", $update_query, err);
  17.                         error!("{}", msg);
  18.                         Err(DatabaseError::ConnectionError(msg))
  19.                     },
  20.                     Ok(0) => { debug!("update affected 0 rows"); Ok(0u32) },
  21.                     Ok(1) => { trace!("insert/update successful"); Ok(1u32) },
  22.                     Ok(n) => { trace!("insert/update affected {} rows", n); Ok(n as u32)}
  23.                 }
  24.             };
  25.  
  26.             run()
  27.         }
  28.     };
  29. }
  30.  
  31. #[macro_export]
  32. macro_rules! easy_query {
  33.     ( $query:expr, $result_type:ty ) => {
  34.         {
  35.             easy_query!( $query, $result_type, $result_type )
  36.         }
  37.     };
  38.     ( $query:expr, result_types => $result_type_fn_map:ty, $result_type:ty ) => {
  39.         {
  40.             easy_query!( $query, (), result_types => $result_type_fn_map, $result_type )
  41.         }
  42.     };
  43.     ( $query:expr, $params:expr, $result_type:ty ) => {
  44.         {
  45.             easy_query!( $query, $params, result_types => $result_type, $result_type )
  46.         }
  47.     };
  48.     ( $query:expr, $params:expr, result_types => $result_type_fn_map:ty, $result_type:ty ) => {
  49.         {
  50.             easy_query!( $query, $params, |row| {
  51.                 row.get(0)
  52.             }, $result_type_fn_map, $result_type)
  53.         }
  54.     };
  55.     ( $query:expr, $params:expr, $fn_map_row:expr, $result_type:ty ) => {
  56.         {
  57.             easy_query!( $query, $params, $fn_map_row, $result_type, $result_type)
  58.         }
  59.     };
  60.     ( $query:expr, $params:expr, $fn_map_row:expr, $result_type_fn_map:ty, $result_type:ty ) => {
  61.         {
  62.             let run = || -> Result<$result_type, DatabaseError> {
  63.                 let conn = get_db_connection()?;
  64.                 let mut cached_statement = conn.prepare_cached($query)
  65.                         .map_err(|err| {
  66.                             DatabaseError::ConnectionError(format!("error preparing statement for query: {} - {}", $query, err))
  67.                         })?;
  68.  
  69.                 let result_rows : Result<$result_type_fn_map, _>
  70.                     = cached_statement.query_map($params, $fn_map_row)
  71.                         .map_err(|err| {
  72.                             DatabaseError::ConnectionError(format!("error mapping query: {} - {}", $query, err))
  73.                         })?.collect();
  74.  
  75.                 Ok(result_rows.map_err(|err| {
  76.                     DatabaseError::ConnectionError(format!("error converting result for query: {} - {}", $query, err))
  77.                 })?.into_iter().collect::<$result_type>())
  78.             };
  79.  
  80.             run()
  81.         }
  82.     };
  83. }
  84.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement