spanner_rs/
statement.rs

1use crate::ToSpanner;
2#[cfg(doc)]
3use crate::TransactionContext;
4use google_api_proto::google::spanner::v1 as proto;
5
6/// A single DML statement that can be used in a batch of DML statements using [`TransactionContext::execute_updates`]
7pub struct Statement<'a> {
8    pub sql: &'a str,
9    pub params: &'a [(&'a str, &'a (dyn ToSpanner + Sync))],
10}
11
12impl<'a> TryFrom<&Statement<'a>> for proto::execute_batch_dml_request::Statement {
13    type Error = crate::Error;
14
15    fn try_from(
16        value: &Statement,
17    ) -> Result<proto::execute_batch_dml_request::Statement, Self::Error> {
18        let mut params = std::collections::BTreeMap::new();
19        let mut param_types = std::collections::BTreeMap::new();
20        for (name, value) in value.params {
21            let value = value.to_spanner()?;
22            param_types.insert(name.to_string(), value.spanner_type().into());
23            params.insert(name.to_string(), value.try_into()?);
24        }
25
26        Ok(proto::execute_batch_dml_request::Statement {
27            sql: value.sql.to_string(),
28            params: Some(prost_types::Struct { fields: params }),
29            param_types,
30        })
31    }
32}