cassandra_protocol/frame/
message_query.rs

1use crate::consistency::Consistency;
2use crate::error;
3use crate::frame::traits::FromCursor;
4use crate::frame::{Direction, Envelope, Flags, Opcode, Serialize, Version};
5use crate::query::{QueryParams, QueryValues};
6use crate::types::{from_cursor_str_long, serialize_str_long, CBytes, CInt, CLong, INT_LEN};
7use std::io::Cursor;
8
9/// Structure which represents body of Query request
10#[derive(Debug, PartialEq, Eq, Clone, Default)]
11pub struct BodyReqQuery {
12    /// Query string.
13    pub query: String,
14    /// Query parameters.
15    pub query_params: QueryParams,
16}
17
18impl BodyReqQuery {
19    #[allow(clippy::too_many_arguments)]
20    fn new(
21        query: String,
22        consistency: Consistency,
23        values: Option<QueryValues>,
24        with_names: bool,
25        page_size: Option<CInt>,
26        paging_state: Option<CBytes>,
27        serial_consistency: Option<Consistency>,
28        timestamp: Option<CLong>,
29        keyspace: Option<String>,
30        now_in_seconds: Option<CInt>,
31    ) -> BodyReqQuery {
32        BodyReqQuery {
33            query,
34            query_params: QueryParams {
35                consistency,
36                with_names,
37                values,
38                page_size,
39                paging_state,
40                serial_consistency,
41                timestamp,
42                keyspace,
43                now_in_seconds,
44            },
45        }
46    }
47}
48
49impl FromCursor for BodyReqQuery {
50    fn from_cursor(cursor: &mut Cursor<&[u8]>, version: Version) -> error::Result<BodyReqQuery> {
51        let query = from_cursor_str_long(cursor)?.to_string();
52        let query_params = QueryParams::from_cursor(cursor, version)?;
53
54        Ok(BodyReqQuery {
55            query,
56            query_params,
57        })
58    }
59}
60
61impl Serialize for BodyReqQuery {
62    #[inline]
63    fn serialize(&self, cursor: &mut Cursor<&mut Vec<u8>>, version: Version) {
64        serialize_str_long(cursor, &self.query, version);
65        self.query_params.serialize(cursor, version);
66    }
67
68    #[inline]
69    fn serialize_to_vec(&self, version: Version) -> Vec<u8> {
70        let mut buf = Vec::with_capacity(INT_LEN + self.query.len());
71
72        self.serialize(&mut Cursor::new(&mut buf), version);
73        buf
74    }
75}
76
77impl Envelope {
78    #[allow(clippy::too_many_arguments)]
79    pub fn new_req_query(
80        query: String,
81        consistency: Consistency,
82        values: Option<QueryValues>,
83        with_names: bool,
84        page_size: Option<CInt>,
85        paging_state: Option<CBytes>,
86        serial_consistency: Option<Consistency>,
87        timestamp: Option<CLong>,
88        keyspace: Option<String>,
89        now_in_seconds: Option<CInt>,
90        flags: Flags,
91        version: Version,
92    ) -> Envelope {
93        let direction = Direction::Request;
94        let opcode = Opcode::Query;
95        let body = BodyReqQuery::new(
96            query,
97            consistency,
98            values,
99            with_names,
100            page_size,
101            paging_state,
102            serial_consistency,
103            timestamp,
104            keyspace,
105            now_in_seconds,
106        );
107
108        Envelope::new(
109            version,
110            direction,
111            flags,
112            opcode,
113            0,
114            body.serialize_to_vec(version),
115            None,
116            vec![],
117        )
118    }
119
120    #[inline]
121    pub fn new_query(query: BodyReqQuery, flags: Flags, version: Version) -> Envelope {
122        Envelope::new_req_query(
123            query.query,
124            query.query_params.consistency,
125            query.query_params.values,
126            query.query_params.with_names,
127            query.query_params.page_size,
128            query.query_params.paging_state,
129            query.query_params.serial_consistency,
130            query.query_params.timestamp,
131            query.query_params.keyspace,
132            query.query_params.now_in_seconds,
133            flags,
134            version,
135        )
136    }
137}