cassandra_proto/frame/
frame_query.rs

1#![warn(missing_docs)]
2//! Contains Query Frame related functionality.
3use rand;
4
5use crate::frame::*;
6use crate::consistency::Consistency;
7use crate::types::*;
8use crate::query::{Query, QueryFlags, QueryParams, QueryValues};
9
10/// Structure which represents body of Query request
11#[derive(Debug)]
12pub struct BodyReqQuery {
13    /// Query string.
14    pub query: CStringLong,
15    /// Query parameters.
16    pub query_params: QueryParams,
17}
18
19impl BodyReqQuery {
20    // Fabric function that produces Query request body.
21    fn new(query: String,
22           consistency: Consistency,
23           values: Option<QueryValues>,
24           with_names: Option<bool>,
25           page_size: Option<i32>,
26           paging_state: Option<CBytes>,
27           serial_consistency: Option<Consistency>,
28           timestamp: Option<i64>)
29           -> BodyReqQuery {
30        // query flags
31        let mut flags: Vec<QueryFlags> = vec![];
32        if values.is_some() {
33            flags.push(QueryFlags::Value);
34        }
35        if with_names.unwrap_or(false) {
36            flags.push(QueryFlags::WithNamesForValues);
37        }
38        if page_size.is_some() {
39            flags.push(QueryFlags::PageSize);
40        }
41        if paging_state.is_some() {
42            flags.push(QueryFlags::WithPagingState);
43        }
44        if serial_consistency.is_some() {
45            flags.push(QueryFlags::WithSerialConsistency);
46        }
47        if timestamp.is_some() {
48            flags.push(QueryFlags::WithDefaultTimestamp);
49        }
50
51        BodyReqQuery { query: CStringLong::new(query),
52                       query_params: QueryParams { consistency,
53                                                   flags,
54                                                   with_names,
55                                                   values,
56                                                   page_size,
57                                                   paging_state,
58                                                   serial_consistency,
59                                                   timestamp, }, }
60    }
61}
62
63impl IntoBytes for BodyReqQuery {
64    fn into_cbytes(&self) -> Vec<u8> {
65        let mut v: Vec<u8> = vec![];
66        v.extend_from_slice(self.query.clone().into_cbytes().as_slice());
67        v.extend_from_slice(self.query_params.into_cbytes().as_slice());
68        v
69    }
70}
71
72// Frame implementation related to BodyReqStartup
73
74impl Frame {
75    /// **Note:** This function should be used internally for building query request frames.
76    pub fn new_req_query(query: String,
77                         consistency: Consistency,
78                         values: Option<QueryValues>,
79                         with_names: Option<bool>,
80                         page_size: Option<i32>,
81                         paging_state: Option<CBytes>,
82                         serial_consistency: Option<Consistency>,
83                         timestamp: Option<i64>,
84                         flags: Vec<Flag>)
85                         -> Frame {
86        let version = Version::Request;
87        let stream = rand::random::<u16>();
88        let opcode = Opcode::Query;
89        let body = BodyReqQuery::new(query,
90                                     consistency,
91                                     values,
92                                     with_names,
93                                     page_size,
94                                     paging_state,
95                                     serial_consistency,
96                                     timestamp);
97
98        Frame { version: version,
99                flags: flags,
100                stream: stream,
101                opcode: opcode,
102                body: body.into_cbytes(),
103                // for request frames it's always None
104                tracing_id: None,
105                warnings: vec![], }
106    }
107
108    /// **Note:** This function should be used internally for building query request frames.
109    pub fn new_query(query: Query, flags: Vec<Flag>) -> Frame {
110        Frame::new_req_query(query.query,
111                             query.params.consistency,
112                             query.params.values,
113                             query.params.with_names,
114                             query.params.page_size,
115                             query.params.paging_state,
116                             query.params.serial_consistency,
117                             query.params.timestamp,
118                             flags)
119    }
120}