Skip to main content

datasources/
command.rs

1use crate::command_middleware::CommandMiddleware;
2use crate::connection::Connection;
3use crate::native::Native;
4use crate::parameter::Parameter;
5use crate::reader::Reader;
6use crate::response::Response;
7use crate::result::Result;
8use crate::statement::Statement;
9use crate::statement_parser::StatementParser;
10use async_trait::async_trait;
11use std::sync::Arc;
12
13#[async_trait]
14pub trait Command: Send + Sync {
15    fn connection(&self) -> Arc<dyn Connection>;
16    fn add_middleware(&self, middleware: Arc<dyn CommandMiddleware>);
17    async fn execute_reader_native(
18        &self,
19        text: &Native,
20        parameters: Option<&[Parameter]>,
21    ) -> Result<Box<dyn Reader>>;
22    async fn execute_native(
23        &self,
24        text: &Native,
25        parameters: Option<&[Parameter]>,
26    ) -> Result<Response>;
27    async fn execute_reader(
28        &self,
29        text: &str,
30        parameters: Option<&[Parameter]>,
31    ) -> Result<Box<dyn Reader>> {
32        if text.trim().is_empty() {
33            return Err(crate::DatasourceError::message("empty command"));
34        }
35        let statement = StatementParser::parse(text)?;
36        self.execute_reader_statement(statement.as_ref(), parameters)
37            .await
38    }
39    async fn execute(&self, text: &str, parameters: Option<&[Parameter]>) -> Result<Response> {
40        if text.trim().is_empty() {
41            return Err(crate::DatasourceError::message("empty command"));
42        }
43        let statement = StatementParser::parse(text)?;
44        self.execute_statement(statement.as_ref(), parameters).await
45    }
46    async fn execute_statement(
47        &self,
48        statement: &dyn Statement,
49        parameters: Option<&[Parameter]>,
50    ) -> Result<Response> {
51        self.execute_native(
52            &Native::new(crate::DefaultStatementTextRenderer::instance().render(statement)),
53            parameters,
54        )
55        .await
56    }
57    async fn execute_reader_statement(
58        &self,
59        statement: &dyn Statement,
60        parameters: Option<&[Parameter]>,
61    ) -> Result<Box<dyn Reader>> {
62        self.execute_reader_native(
63            &Native::new(crate::DefaultStatementTextRenderer::instance().render(statement)),
64            parameters,
65        )
66        .await
67    }
68}