cassandra_proto/frame/
frame_query.rs1#![warn(missing_docs)]
2use rand;
4
5use crate::frame::*;
6use crate::consistency::Consistency;
7use crate::types::*;
8use crate::query::{Query, QueryFlags, QueryParams, QueryValues};
9
10#[derive(Debug)]
12pub struct BodyReqQuery {
13 pub query: CStringLong,
15 pub query_params: QueryParams,
17}
18
19impl BodyReqQuery {
20 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 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
72impl Frame {
75 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 tracing_id: None,
105 warnings: vec![], }
106 }
107
108 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}