1use crate::ToSpanner;
2#[cfg(doc)]
3use crate::TransactionContext;
4use google_api_proto::google::spanner::v1 as proto;
5
6pub 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}