sqlx_core/mysql/protocol/statement/
execute.rs

1use crate::io::Encode;
2use crate::mysql::protocol::text::ColumnFlags;
3use crate::mysql::protocol::Capabilities;
4use crate::mysql::MySqlArguments;
5
6// https://dev.mysql.com/doc/dev/mysql-server/8.0.12/page_protocol_com_stmt_execute.html
7
8#[derive(Debug)]
9pub struct Execute<'q> {
10    pub statement: u32,
11    pub arguments: &'q MySqlArguments,
12}
13
14impl<'q> Encode<'_, Capabilities> for Execute<'q> {
15    fn encode_with(&self, buf: &mut Vec<u8>, _: Capabilities) {
16        buf.push(0x17); // COM_STMT_EXECUTE
17        buf.extend(&self.statement.to_le_bytes());
18        buf.push(0); // NO_CURSOR
19        buf.extend(&1_u32.to_le_bytes()); // iterations (always 1): int<4>
20
21        if !self.arguments.types.is_empty() {
22            buf.extend(&*self.arguments.null_bitmap);
23            buf.push(1); // send type to server
24
25            for ty in &self.arguments.types {
26                buf.push(ty.r#type as u8);
27
28                buf.push(if ty.flags.contains(ColumnFlags::UNSIGNED) {
29                    0x80
30                } else {
31                    0
32                });
33            }
34
35            buf.extend(&*self.arguments.values);
36        }
37    }
38}