cassandra_protocol/frame/
message_query.rs1use 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#[derive(Debug, PartialEq, Eq, Clone, Default)]
11pub struct BodyReqQuery {
12 pub query: String,
14 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}