Skip to main content

cdrs/query/
exec_executor.rs

1use r2d2;
2use std::cell::RefCell;
3
4use crate::cluster::{GetCompressor, GetConnection};
5use crate::error;
6use crate::frame::{Frame, IntoBytes};
7use crate::query::{QueryParams, QueryParamsBuilder, QueryValues};
8use crate::transport::CDRSTransport;
9use crate::types::CBytesShort;
10
11use super::utils::{prepare_flags, send_frame};
12
13pub type PreparedQuery = CBytesShort;
14
15pub trait ExecExecutor<
16    T: CDRSTransport + 'static,
17    M: r2d2::ManageConnection<Connection = RefCell<T>, Error = error::Error> + Sized,
18>: GetConnection<T, M> + GetCompressor<'static>
19{
20    fn exec_with_params_tw(
21        &self,
22        prepared: &PreparedQuery,
23        query_parameters: QueryParams,
24        with_tracing: bool,
25        with_warnings: bool,
26    ) -> error::Result<Frame>
27    where
28        Self: Sized,
29    {
30        let flags = prepare_flags(with_tracing, with_warnings);
31        let options_frame = Frame::new_req_execute(prepared, query_parameters, flags).into_cbytes();
32
33        send_frame(self, options_frame)
34    }
35
36    fn exec_with_params(
37        &self,
38        prepared: &PreparedQuery,
39        query_parameters: QueryParams,
40    ) -> error::Result<Frame>
41    where
42        Self: Sized,
43    {
44        self.exec_with_params_tw(prepared, query_parameters, false, false)
45    }
46
47    fn exec_with_values_tw<V: Into<QueryValues>>(
48        &self,
49        prepared: &PreparedQuery,
50        values: V,
51        with_tracing: bool,
52        with_warnings: bool,
53    ) -> error::Result<Frame>
54    where
55        Self: Sized,
56    {
57        let query_params_builder = QueryParamsBuilder::new();
58        let query_params = query_params_builder.values(values.into()).finalize();
59        self.exec_with_params_tw(prepared, query_params, with_tracing, with_warnings)
60    }
61
62    fn exec_with_values<V: Into<QueryValues>>(
63        &self,
64        prepared: &PreparedQuery,
65        values: V,
66    ) -> error::Result<Frame>
67    where
68        Self: Sized,
69    {
70        self.exec_with_values_tw(prepared, values, false, false)
71    }
72
73    fn exec_tw(
74        &self,
75        prepared: &PreparedQuery,
76        with_tracing: bool,
77        with_warnings: bool,
78    ) -> error::Result<Frame>
79    where
80        Self: Sized,
81    {
82        let query_params = QueryParamsBuilder::new().finalize();
83        self.exec_with_params_tw(prepared, query_params, with_tracing, with_warnings)
84    }
85
86    fn exec(&mut self, prepared: &PreparedQuery) -> error::Result<Frame>
87    where
88        Self: Sized,
89    {
90        self.exec_tw(prepared, false, false)
91    }
92}