/Users/deen/code/yugabyte-db/src/yb/integration-tests/cql_test_util.h
Line | Count | Source (jump to first uncovered line) |
1 | | // Copyright (c) YugaByte, Inc. |
2 | | // |
3 | | // Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except |
4 | | // in compliance with the License. You may obtain a copy of the License at |
5 | | // |
6 | | // http://www.apache.org/licenses/LICENSE-2.0 |
7 | | // |
8 | | // Unless required by applicable law or agreed to in writing, software distributed under the License |
9 | | // is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
10 | | // or implied. See the License for the specific language governing permissions and limitations |
11 | | // under the License. |
12 | | // |
13 | | |
14 | | #ifndef YB_INTEGRATION_TESTS_CQL_TEST_UTIL_H |
15 | | #define YB_INTEGRATION_TESTS_CQL_TEST_UTIL_H |
16 | | |
17 | | #include <cassandra.h> |
18 | | |
19 | | #include <string> |
20 | | |
21 | | #include "yb/util/monotime.h" |
22 | | #include "yb/util/result.h" |
23 | | #include "yb/util/status_log.h" |
24 | | |
25 | | namespace yb { |
26 | | |
27 | | class CassandraJson; |
28 | | class CassandraStatement; |
29 | | |
30 | | // Cassandra CPP driver has his own functions to release objects, so we should use them for it. |
31 | | template <class T, void (*Func)(T*)> |
32 | | class FuncDeleter { |
33 | | public: |
34 | 441k | void operator()(T* t) const { |
35 | 441k | if (t) { |
36 | 441k | Func(t); |
37 | 441k | } |
38 | 441k | } _ZNK2yb11FuncDeleterI13CassIterator_XadL_Z18cass_iterator_freeEEEclEPS1_ Line | Count | Source | 34 | 2.92k | void operator()(T* t) const { | 35 | 2.92k | if (t) { | 36 | 2.92k | Func(t); | 37 | 2.92k | } | 38 | 2.92k | } |
_ZNK2yb11FuncDeleterI14CassStatement_XadL_Z19cass_statement_freeEEEclEPS1_ Line | Count | Source | 34 | 407k | void operator()(T* t) const { | 35 | 407k | if (t) { | 36 | 407k | Func(t); | 37 | 407k | } | 38 | 407k | } |
_ZNK2yb11FuncDeleterI11CassFuture_XadL_Z16cass_future_freeEEEclEPS1_ Line | Count | Source | 34 | 28.8k | void operator()(T* t) const { | 35 | 28.8k | if (t) { | 36 | 28.8k | Func(t); | 37 | 28.8k | } | 38 | 28.8k | } |
_ZNK2yb11FuncDeleterI10CassBatch_XadL_Z15cass_batch_freeEEEclEPS1_ Line | Count | Source | 34 | 1.33k | void operator()(T* t) const { | 35 | 1.33k | if (t) { | 36 | 1.33k | Func(t); | 37 | 1.33k | } | 38 | 1.33k | } |
_ZNK2yb11FuncDeleterIK13CassPrepared_XadL_Z18cass_prepared_freeEEEclEPS2_ Line | Count | Source | 34 | 621 | void operator()(T* t) const { | 35 | 621 | if (t) { | 36 | 621 | Func(t); | 37 | 621 | } | 38 | 621 | } |
_ZNK2yb11FuncDeleterIK11CassResult_XadL_Z16cass_result_freeEEEclEPS2_ Line | Count | Source | 34 | 158 | void operator()(T* t) const { | 35 | 158 | if (t) { | 36 | 158 | Func(t); | 37 | 158 | } | 38 | 158 | } |
|
39 | | }; |
40 | | |
41 | | template <class Out> |
42 | | struct GetCassandraValue { |
43 | | static CassError Apply(const CassValue* value, Out* out); |
44 | | }; |
45 | | |
46 | | class CassandraValue { |
47 | | public: |
48 | 12.1k | explicit CassandraValue(const CassValue* value) : value_(value) {} |
49 | | |
50 | | template <class Out> |
51 | 10.7k | void Get(Out* out) const { |
52 | 10.7k | CHECK_EQ(CASS_OK, GetCassandraValue<Out>::Apply(value_, out)); |
53 | 10.7k | } _ZNK2yb14CassandraValue3GetINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEEvPT_ Line | Count | Source | 51 | 4.19k | void Get(Out* out) const { | 52 | 4.19k | CHECK_EQ(CASS_OK, GetCassandraValue<Out>::Apply(value_, out)); | 53 | 4.19k | } |
_ZNK2yb14CassandraValue3GetI11cass_bool_tEEvPT_ Line | Count | Source | 51 | 7 | void Get(Out* out) const { | 52 | 7 | CHECK_EQ(CASS_OK, GetCassandraValue<Out>::Apply(value_, out)); | 53 | 7 | } |
_ZNK2yb14CassandraValue3GetIfEEvPT_ Line | Count | Source | 51 | 3 | void Get(Out* out) const { | 52 | 3 | CHECK_EQ(CASS_OK, GetCassandraValue<Out>::Apply(value_, out)); | 53 | 3 | } |
_ZNK2yb14CassandraValue3GetIdEEvPT_ Line | Count | Source | 51 | 13 | void Get(Out* out) const { | 52 | 13 | CHECK_EQ(CASS_OK, GetCassandraValue<Out>::Apply(value_, out)); | 53 | 13 | } |
_ZNK2yb14CassandraValue3GetIiEEvPT_ Line | Count | Source | 51 | 972 | void Get(Out* out) const { | 52 | 972 | CHECK_EQ(CASS_OK, GetCassandraValue<Out>::Apply(value_, out)); | 53 | 972 | } |
_ZNK2yb14CassandraValue3GetIxEEvPT_ Line | Count | Source | 51 | 33 | void Get(Out* out) const { | 52 | 33 | CHECK_EQ(CASS_OK, GetCassandraValue<Out>::Apply(value_, out)); | 53 | 33 | } |
_ZNK2yb14CassandraValue3GetINS_13CassandraJsonEEEvPT_ Line | Count | Source | 51 | 4 | void Get(Out* out) const { | 52 | 4 | CHECK_EQ(CASS_OK, GetCassandraValue<Out>::Apply(value_, out)); | 53 | 4 | } |
_ZNK2yb14CassandraValue3GetINS_5SliceEEEvPT_ Line | Count | Source | 51 | 2.77k | void Get(Out* out) const { | 52 | 2.77k | CHECK_EQ(CASS_OK, GetCassandraValue<Out>::Apply(value_, out)); | 53 | 2.77k | } |
_ZNK2yb14CassandraValue3GetI9CassUuid_EEvPT_ Line | Count | Source | 51 | 1.38k | void Get(Out* out) const { | 52 | 1.38k | CHECK_EQ(CASS_OK, GetCassandraValue<Out>::Apply(value_, out)); | 53 | 1.38k | } |
_ZNK2yb14CassandraValue3GetI9CassInet_EEvPT_ Line | Count | Source | 51 | 1.40k | void Get(Out* out) const { | 52 | 1.40k | CHECK_EQ(CASS_OK, GetCassandraValue<Out>::Apply(value_, out)); | 53 | 1.40k | } |
|
54 | | |
55 | | template <class Out> |
56 | 10.7k | Out As() const { |
57 | 10.7k | Out result; |
58 | 10.7k | Get(&result); |
59 | 10.7k | return result; |
60 | 10.7k | } _ZNK2yb14CassandraValue2AsIxEET_v Line | Count | Source | 56 | 31 | Out As() const { | 57 | 31 | Out result; | 58 | 31 | Get(&result); | 59 | 31 | return result; | 60 | 31 | } |
_ZNK2yb14CassandraValue2AsIiEET_v Line | Count | Source | 56 | 960 | Out As() const { | 57 | 960 | Out result; | 58 | 960 | Get(&result); | 59 | 960 | return result; | 60 | 960 | } |
_ZNK2yb14CassandraValue2AsINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEET_v Line | Count | Source | 56 | 4.17k | Out As() const { | 57 | 4.17k | Out result; | 58 | 4.17k | Get(&result); | 59 | 4.17k | return result; | 60 | 4.17k | } |
_ZNK2yb14CassandraValue2AsINS_5SliceEEET_v Line | Count | Source | 56 | 2.77k | Out As() const { | 57 | 2.77k | Out result; | 58 | 2.77k | Get(&result); | 59 | 2.77k | return result; | 60 | 2.77k | } |
_ZNK2yb14CassandraValue2AsI9CassUuid_EET_v Line | Count | Source | 56 | 1.38k | Out As() const { | 57 | 1.38k | Out result; | 58 | 1.38k | Get(&result); | 59 | 1.38k | return result; | 60 | 1.38k | } |
_ZNK2yb14CassandraValue2AsI9CassInet_EET_v Line | Count | Source | 56 | 1.40k | Out As() const { | 57 | 1.40k | Out result; | 58 | 1.40k | Get(&result); | 59 | 1.40k | return result; | 60 | 1.40k | } |
|
61 | | |
62 | | bool IsNull() const; |
63 | | |
64 | | std::string ToString() const; |
65 | | |
66 | | private: |
67 | | const CassValue* value_; |
68 | | }; |
69 | | |
70 | | typedef std::unique_ptr< |
71 | | CassIterator, FuncDeleter<CassIterator, &cass_iterator_free>> CassIteratorPtr; |
72 | | |
73 | | class CassandraRowIterator { |
74 | | public: |
75 | 1.38k | explicit CassandraRowIterator(CassIterator* iterator) : cass_iterator_(iterator) {} |
76 | | |
77 | | bool Next(); |
78 | | |
79 | | template <class Out> |
80 | | void Get(Out* out) const { |
81 | | Value().Get(out); |
82 | | } |
83 | | |
84 | | CassandraValue Value() const; |
85 | | |
86 | | private: |
87 | | CassIteratorPtr cass_iterator_; |
88 | | }; |
89 | | |
90 | | class CassandraRow { |
91 | | public: |
92 | 1.91k | explicit CassandraRow(const CassRow* row) : cass_row_(row) {} |
93 | | |
94 | | template <class Out> |
95 | 58 | void Get(size_t index, Out* out) const { |
96 | 58 | return Value(index).Get(out); |
97 | 58 | } _ZNK2yb12CassandraRow3GetINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEEvmPT_ Line | Count | Source | 95 | 17 | void Get(size_t index, Out* out) const { | 96 | 17 | return Value(index).Get(out); | 97 | 17 | } |
_ZNK2yb12CassandraRow3GetI11cass_bool_tEEvmPT_ Line | Count | Source | 95 | 7 | void Get(size_t index, Out* out) const { | 96 | 7 | return Value(index).Get(out); | 97 | 7 | } |
_ZNK2yb12CassandraRow3GetIfEEvmPT_ Line | Count | Source | 95 | 3 | void Get(size_t index, Out* out) const { | 96 | 3 | return Value(index).Get(out); | 97 | 3 | } |
_ZNK2yb12CassandraRow3GetIdEEvmPT_ Line | Count | Source | 95 | 13 | void Get(size_t index, Out* out) const { | 96 | 13 | return Value(index).Get(out); | 97 | 13 | } |
_ZNK2yb12CassandraRow3GetIiEEvmPT_ Line | Count | Source | 95 | 12 | void Get(size_t index, Out* out) const { | 96 | 12 | return Value(index).Get(out); | 97 | 12 | } |
_ZNK2yb12CassandraRow3GetIxEEvmPT_ Line | Count | Source | 95 | 2 | void Get(size_t index, Out* out) const { | 96 | 2 | return Value(index).Get(out); | 97 | 2 | } |
_ZNK2yb12CassandraRow3GetINS_13CassandraJsonEEEvmPT_ Line | Count | Source | 95 | 4 | void Get(size_t index, Out* out) const { | 96 | 4 | return Value(index).Get(out); | 97 | 4 | } |
|
98 | | |
99 | | CassandraValue Value(size_t index) const; |
100 | | |
101 | | CassandraRowIterator CreateIterator() const; |
102 | | |
103 | | std::string RenderToString(const std::string& separator = ","); |
104 | | |
105 | | void TakeIterator(CassIteratorPtr iterator); |
106 | | |
107 | | private: |
108 | | const CassRow* cass_row_; // owned by iterator |
109 | | CassIteratorPtr cass_iterator_; |
110 | | }; |
111 | | |
112 | | class CassandraIterator { |
113 | | public: |
114 | 157 | explicit CassandraIterator(CassIterator* iterator) : cass_iterator_(iterator) {} |
115 | | |
116 | | bool Next(); |
117 | | |
118 | | CassandraRow Row(); |
119 | | |
120 | | void MoveToRow(CassandraRow* row); |
121 | | |
122 | | private: |
123 | | CassIteratorPtr cass_iterator_; |
124 | | }; |
125 | | |
126 | | typedef std::unique_ptr< |
127 | | const CassResult, FuncDeleter<const CassResult, &cass_result_free>> CassResultPtr; |
128 | | |
129 | | class CassandraResult { |
130 | | public: |
131 | 158 | explicit CassandraResult(const CassResult* result) : cass_result_(result) {} |
132 | | |
133 | | CassandraIterator CreateIterator() const; |
134 | | |
135 | | std::string RenderToString(const std::string& line_separator = ";", |
136 | | const std::string& value_separator = ",") const; |
137 | | |
138 | | private: |
139 | | CassResultPtr cass_result_; |
140 | | }; |
141 | | |
142 | | typedef std::unique_ptr< |
143 | | const CassPrepared, FuncDeleter<const CassPrepared, &cass_prepared_free>> CassPreparedPtr; |
144 | | |
145 | | class CassandraPrepared { |
146 | | public: |
147 | 1 | CassandraPrepared() = default; |
148 | 621 | explicit CassandraPrepared(const CassPrepared* prepared) : prepared_(prepared) {} |
149 | | |
150 | | CassandraStatement Bind(); |
151 | | |
152 | | private: |
153 | | CassPreparedPtr prepared_; |
154 | | }; |
155 | | |
156 | | typedef std::unique_ptr< |
157 | | CassFuture, FuncDeleter<CassFuture, &cass_future_free>> CassFuturePtr; |
158 | | |
159 | | class CassandraFuture { |
160 | | public: |
161 | 28.8k | explicit CassandraFuture(CassFuture* future) : future_(future) {} |
162 | | |
163 | | bool Ready() const; |
164 | | |
165 | | CHECKED_STATUS Wait(); |
166 | | |
167 | | CHECKED_STATUS WaitFor(MonoDelta duration); |
168 | | |
169 | | CassandraResult Result(); |
170 | | |
171 | | CassandraPrepared Prepared(); |
172 | | |
173 | | private: |
174 | | CHECKED_STATUS CheckErrorCode(); |
175 | | |
176 | | CassFuturePtr future_; |
177 | | }; |
178 | | |
179 | | typedef std::unique_ptr< |
180 | | CassStatement, FuncDeleter<CassStatement, &cass_statement_free>> CassStatementPtr; |
181 | | |
182 | | class CassandraStatement { |
183 | | public: |
184 | | explicit CassandraStatement(CassStatement* statement) |
185 | 405k | : cass_statement_(statement) {} |
186 | | |
187 | | explicit CassandraStatement(const std::string& query, size_t parameter_count = 0) |
188 | 1.77k | : cass_statement_(cass_statement_new(query.c_str(), parameter_count)) {} |
189 | | |
190 | | void SetKeyspace(const std::string& keyspace); |
191 | | |
192 | | void Bind(size_t index, const std::string& v); |
193 | | void Bind(size_t index, const cass_bool_t& v); |
194 | | void Bind(size_t index, const cass_float_t& v); |
195 | | void Bind(size_t index, const cass_double_t& v); |
196 | | void Bind(size_t index, const cass_int32_t& v); |
197 | | void Bind(size_t index, const cass_int64_t& v); |
198 | | void Bind(size_t index, const CassandraJson& v); |
199 | | |
200 | | CassStatement* get() const; |
201 | | |
202 | | private: |
203 | | friend class CassandraBatch; |
204 | | friend class CassandraSession; |
205 | | |
206 | | CassStatementPtr cass_statement_; |
207 | | }; |
208 | | |
209 | | typedef std::unique_ptr<CassBatch, FuncDeleter<CassBatch, &cass_batch_free>> CassBatchPtr; |
210 | | |
211 | | class CassandraBatch { |
212 | | public: |
213 | 1.33k | explicit CassandraBatch(CassBatchType type) : cass_batch_(cass_batch_new(type)) {} |
214 | | |
215 | | void Add(CassandraStatement* statement); |
216 | | |
217 | | private: |
218 | | friend class CassandraSession; |
219 | | |
220 | | CassBatchPtr cass_batch_; |
221 | | }; |
222 | | |
223 | | struct DeleteSession { |
224 | | void operator()(CassSession* session) const; |
225 | | }; |
226 | | |
227 | | typedef std::unique_ptr<CassSession, DeleteSession> CassSessionPtr; |
228 | | |
229 | | class CassandraSession { |
230 | | public: |
231 | 180 | CassandraSession() = default; |
232 | | |
233 | | CHECKED_STATUS Connect(CassCluster* cluster); |
234 | | |
235 | | static Result<CassandraSession> Create(CassCluster* cluster); |
236 | | |
237 | | CHECKED_STATUS Execute(const CassandraStatement& statement); |
238 | | |
239 | | Result<CassandraResult> ExecuteWithResult(const CassandraStatement& statement); |
240 | | |
241 | | CassandraFuture ExecuteGetFuture(const CassandraStatement& statement); |
242 | | |
243 | | CassandraFuture ExecuteGetFuture(const std::string& query); |
244 | | |
245 | | CHECKED_STATUS ExecuteQuery(const std::string& query); |
246 | | |
247 | | template <class... Args> |
248 | 0 | CHECKED_STATUS ExecuteQueryFormat(const std::string& query, Args&&... args) { |
249 | 0 | return ExecuteQuery(Format(query, std::forward<Args>(args)...)); |
250 | 0 | } Unexecuted instantiation: _ZN2yb16CassandraSession18ExecuteQueryFormatIJiEEENS_6StatusERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEDpOT_ Unexecuted instantiation: _ZN2yb16CassandraSession18ExecuteQueryFormatIJRKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEEENS_6StatusESA_DpOT_ Unexecuted instantiation: _ZN2yb16CassandraSession18ExecuteQueryFormatIJRA7_KcEEENS_6StatusERKNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEEDpOT_ Unexecuted instantiation: _ZN2yb16CassandraSession18ExecuteQueryFormatIJRA6_KcEEENS_6StatusERKNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEEDpOT_ |
251 | | |
252 | | Result<CassandraResult> ExecuteWithResult(const std::string& query); |
253 | | |
254 | | Result<std::string> ExecuteAndRenderToString(const std::string& statement); |
255 | | |
256 | | template <class Action> |
257 | | CHECKED_STATUS ExecuteAndProcessOneRow( |
258 | 56 | const CassandraStatement& statement, const Action& action) { |
259 | 55 | auto result = VERIFY_RESULT(ExecuteWithResult(statement)); |
260 | 55 | auto iterator = result.CreateIterator(); |
261 | 55 | if (!iterator.Next()) { |
262 | 3 | return STATUS(IllegalState, "Row does not exists"); |
263 | 3 | } |
264 | 52 | auto row = iterator.Row(); |
265 | 52 | action(row); |
266 | 52 | if (iterator.Next()) { |
267 | 0 | return STATUS(IllegalState, "Multiple rows returned"); |
268 | 0 | } |
269 | 52 | return Status::OK(); |
270 | 52 | } _ZN2yb16CassandraSession23ExecuteAndProcessOneRowIZNS_9TestTableIJNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE11cass_bool_tfdixS9_EE20ExecuteAndReadOneRowEPS0_RKNS_18CassandraStatementEEUlRKNS_12CassandraRowEE_EENS_6StatusESF_RKT_ Line | Count | Source | 258 | 1 | const CassandraStatement& statement, const Action& action) { | 259 | 1 | auto result = VERIFY_RESULT(ExecuteWithResult(statement)); | 260 | 1 | auto iterator = result.CreateIterator(); | 261 | 1 | if (!iterator.Next()) { | 262 | 0 | return STATUS(IllegalState, "Row does not exists"); | 263 | 0 | } | 264 | 1 | auto row = iterator.Row(); | 265 | 1 | action(row); | 266 | 1 | if (iterator.Next()) { | 267 | 0 | return STATUS(IllegalState, "Multiple rows returned"); | 268 | 0 | } | 269 | 1 | return Status::OK(); | 270 | 1 | } |
_ZN2yb16CassandraSession23ExecuteAndProcessOneRowIZNS_9TestTableIJNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS_13CassandraJsonEEE20ExecuteAndReadOneRowEPS0_RKNS_18CassandraStatementEEUlRKNS_12CassandraRowEE_EENS_6StatusESF_RKT_ Line | Count | Source | 258 | 4 | const CassandraStatement& statement, const Action& action) { | 259 | 4 | auto result = VERIFY_RESULT(ExecuteWithResult(statement)); | 260 | 4 | auto iterator = result.CreateIterator(); | 261 | 4 | if (!iterator.Next()) { | 262 | 0 | return STATUS(IllegalState, "Row does not exists"); | 263 | 0 | } | 264 | 4 | auto row = iterator.Row(); | 265 | 4 | action(row); | 266 | 4 | if (iterator.Next()) { | 267 | 0 | return STATUS(IllegalState, "Multiple rows returned"); | 268 | 0 | } | 269 | 4 | return Status::OK(); | 270 | 4 | } |
cassandra_cpp_driver-test.cc:_ZN2yb16CassandraSession23ExecuteAndProcessOneRowIZNS_12GetTableSizeEPS0_RKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEE3$_2EENS_6StatusERKNS_18CassandraStatementERKT_ Line | Count | Source | 258 | 32 | const CassandraStatement& statement, const Action& action) { | 259 | 31 | auto result = VERIFY_RESULT(ExecuteWithResult(statement)); | 260 | 31 | auto iterator = result.CreateIterator(); | 261 | 31 | if (!iterator.Next()) { | 262 | 0 | return STATUS(IllegalState, "Row does not exists"); | 263 | 0 | } | 264 | 31 | auto row = iterator.Row(); | 265 | 31 | action(row); | 266 | 31 | if (iterator.Next()) { | 267 | 0 | return STATUS(IllegalState, "Multiple rows returned"); | 268 | 0 | } | 269 | 31 | return Status::OK(); | 270 | 31 | } |
_ZN2yb16CassandraSession23ExecuteAndProcessOneRowIZNS_9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEEiSA_EE20ExecuteAndReadOneRowEPS0_RKNS_18CassandraStatementEEUlRKNS_12CassandraRowEE_EENS_6StatusESF_RKT_ Line | Count | Source | 258 | 4 | const CassandraStatement& statement, const Action& action) { | 259 | 4 | auto result = VERIFY_RESULT(ExecuteWithResult(statement)); | 260 | 4 | auto iterator = result.CreateIterator(); | 261 | 4 | if (!iterator.Next()) { | 262 | 0 | return STATUS(IllegalState, "Row does not exists"); | 263 | 0 | } | 264 | 4 | auto row = iterator.Row(); | 265 | 4 | action(row); | 266 | 4 | if (iterator.Next()) { | 267 | 0 | return STATUS(IllegalState, "Multiple rows returned"); | 268 | 0 | } | 269 | 4 | return Status::OK(); | 270 | 4 | } |
_ZN2yb16CassandraSession23ExecuteAndProcessOneRowIZNS_9TestTableIJNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEdEE20ExecuteAndReadOneRowEPS0_RKNS_18CassandraStatementEEUlRKNS_12CassandraRowEE_EENS_6StatusESE_RKT_ Line | Count | Source | 258 | 2 | const CassandraStatement& statement, const Action& action) { | 259 | 2 | auto result = VERIFY_RESULT(ExecuteWithResult(statement)); | 260 | 2 | auto iterator = result.CreateIterator(); | 261 | 2 | if (!iterator.Next()) { | 262 | 0 | return STATUS(IllegalState, "Row does not exists"); | 263 | 0 | } | 264 | 2 | auto row = iterator.Row(); | 265 | 2 | action(row); | 266 | 2 | if (iterator.Next()) { | 267 | 0 | return STATUS(IllegalState, "Multiple rows returned"); | 268 | 0 | } | 269 | 2 | return Status::OK(); | 270 | 2 | } |
_ZN2yb16CassandraSession23ExecuteAndProcessOneRowIZNS_9TestTableIJidEE20ExecuteAndReadOneRowEPS0_RKNS_18CassandraStatementEEUlRKNS_12CassandraRowEE_EENS_6StatusES7_RKT_ Line | Count | Source | 258 | 2 | const CassandraStatement& statement, const Action& action) { | 259 | 2 | auto result = VERIFY_RESULT(ExecuteWithResult(statement)); | 260 | 2 | auto iterator = result.CreateIterator(); | 261 | 2 | if (!iterator.Next()) { | 262 | 0 | return STATUS(IllegalState, "Row does not exists"); | 263 | 0 | } | 264 | 2 | auto row = iterator.Row(); | 265 | 2 | action(row); | 266 | 2 | if (iterator.Next()) { | 267 | 0 | return STATUS(IllegalState, "Multiple rows returned"); | 268 | 0 | } | 269 | 2 | return Status::OK(); | 270 | 2 | } |
_ZN2yb16CassandraSession23ExecuteAndProcessOneRowIZNS_9TestTableIJxdEE20ExecuteAndReadOneRowEPS0_RKNS_18CassandraStatementEEUlRKNS_12CassandraRowEE_EENS_6StatusES7_RKT_ Line | Count | Source | 258 | 2 | const CassandraStatement& statement, const Action& action) { | 259 | 2 | auto result = VERIFY_RESULT(ExecuteWithResult(statement)); | 260 | 2 | auto iterator = result.CreateIterator(); | 261 | 2 | if (!iterator.Next()) { | 262 | 1 | return STATUS(IllegalState, "Row does not exists"); | 263 | 1 | } | 264 | 1 | auto row = iterator.Row(); | 265 | 1 | action(row); | 266 | 1 | if (iterator.Next()) { | 267 | 0 | return STATUS(IllegalState, "Multiple rows returned"); | 268 | 0 | } | 269 | 1 | return Status::OK(); | 270 | 1 | } |
_ZN2yb16CassandraSession23ExecuteAndProcessOneRowIZNS_9TestTableIJ11cass_bool_tdEE20ExecuteAndReadOneRowEPS0_RKNS_18CassandraStatementEEUlRKNS_12CassandraRowEE_EENS_6StatusES8_RKT_ Line | Count | Source | 258 | 2 | const CassandraStatement& statement, const Action& action) { | 259 | 2 | auto result = VERIFY_RESULT(ExecuteWithResult(statement)); | 260 | 2 | auto iterator = result.CreateIterator(); | 261 | 2 | if (!iterator.Next()) { | 262 | 0 | return STATUS(IllegalState, "Row does not exists"); | 263 | 0 | } | 264 | 2 | auto row = iterator.Row(); | 265 | 2 | action(row); | 266 | 2 | if (iterator.Next()) { | 267 | 0 | return STATUS(IllegalState, "Multiple rows returned"); | 268 | 0 | } | 269 | 2 | return Status::OK(); | 270 | 2 | } |
_ZN2yb16CassandraSession23ExecuteAndProcessOneRowIZNS_9TestTableIJfdEE20ExecuteAndReadOneRowEPS0_RKNS_18CassandraStatementEEUlRKNS_12CassandraRowEE_EENS_6StatusES7_RKT_ Line | Count | Source | 258 | 2 | const CassandraStatement& statement, const Action& action) { | 259 | 2 | auto result = VERIFY_RESULT(ExecuteWithResult(statement)); | 260 | 2 | auto iterator = result.CreateIterator(); | 261 | 2 | if (!iterator.Next()) { | 262 | 0 | return STATUS(IllegalState, "Row does not exists"); | 263 | 0 | } | 264 | 2 | auto row = iterator.Row(); | 265 | 2 | action(row); | 266 | 2 | if (iterator.Next()) { | 267 | 0 | return STATUS(IllegalState, "Multiple rows returned"); | 268 | 0 | } | 269 | 2 | return Status::OK(); | 270 | 2 | } |
_ZN2yb16CassandraSession23ExecuteAndProcessOneRowIZNS_9TestTableIJddEE20ExecuteAndReadOneRowEPS0_RKNS_18CassandraStatementEEUlRKNS_12CassandraRowEE_EENS_6StatusES7_RKT_ Line | Count | Source | 258 | 2 | const CassandraStatement& statement, const Action& action) { | 259 | 2 | auto result = VERIFY_RESULT(ExecuteWithResult(statement)); | 260 | 2 | auto iterator = result.CreateIterator(); | 261 | 2 | if (!iterator.Next()) { | 262 | 1 | return STATUS(IllegalState, "Row does not exists"); | 263 | 1 | } | 264 | 1 | auto row = iterator.Row(); | 265 | 1 | action(row); | 266 | 1 | if (iterator.Next()) { | 267 | 0 | return STATUS(IllegalState, "Multiple rows returned"); | 268 | 0 | } | 269 | 1 | return Status::OK(); | 270 | 1 | } |
_ZN2yb16CassandraSession23ExecuteAndProcessOneRowIZNS_9TestTableIJNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEidEE20ExecuteAndReadOneRowEPS0_RKNS_18CassandraStatementEEUlRKNS_12CassandraRowEE_EENS_6StatusESE_RKT_ Line | Count | Source | 258 | 2 | const CassandraStatement& statement, const Action& action) { | 259 | 2 | auto result = VERIFY_RESULT(ExecuteWithResult(statement)); | 260 | 2 | auto iterator = result.CreateIterator(); | 261 | 2 | if (!iterator.Next()) { | 262 | 1 | return STATUS(IllegalState, "Row does not exists"); | 263 | 1 | } | 264 | 1 | auto row = iterator.Row(); | 265 | 1 | action(row); | 266 | 1 | if (iterator.Next()) { | 267 | 0 | return STATUS(IllegalState, "Multiple rows returned"); | 268 | 0 | } | 269 | 1 | return Status::OK(); | 270 | 1 | } |
_ZN2yb16CassandraSession23ExecuteAndProcessOneRowIZNS0_10FetchValueINSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEEENS_6ResultIT_EERKS9_EUlRKNS_12CassandraRowEE_EENS_6StatusERKNS_18CassandraStatementERKSB_ Line | Count | Source | 258 | 1 | const CassandraStatement& statement, const Action& action) { | 259 | 1 | auto result = VERIFY_RESULT(ExecuteWithResult(statement)); | 260 | 1 | auto iterator = result.CreateIterator(); | 261 | 1 | if (!iterator.Next()) { | 262 | 0 | return STATUS(IllegalState, "Row does not exists"); | 263 | 0 | } | 264 | 1 | auto row = iterator.Row(); | 265 | 1 | action(row); | 266 | 1 | if (iterator.Next()) { | 267 | 0 | return STATUS(IllegalState, "Multiple rows returned"); | 268 | 0 | } | 269 | 1 | return Status::OK(); | 270 | 1 | } |
Unexecuted instantiation: _ZN2yb16CassandraSession23ExecuteAndProcessOneRowIZNS0_10FetchValueIiEENS_6ResultIT_EERKNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEEEUlRKNS_12CassandraRowEE_EENS_6StatusERKNS_18CassandraStatementERKS4_ |
271 | | |
272 | | template <class Action> |
273 | 33 | CHECKED_STATUS ExecuteAndProcessOneRow(const std::string& query, const Action& action) { |
274 | 33 | return ExecuteAndProcessOneRow(CassandraStatement(query), action); |
275 | 33 | } cassandra_cpp_driver-test.cc:_ZN2yb16CassandraSession23ExecuteAndProcessOneRowIZNS_12GetTableSizeEPS0_RKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEE3$_2EENS_6StatusESB_RKT_ Line | Count | Source | 273 | 32 | CHECKED_STATUS ExecuteAndProcessOneRow(const std::string& query, const Action& action) { | 274 | 32 | return ExecuteAndProcessOneRow(CassandraStatement(query), action); | 275 | 32 | } |
_ZN2yb16CassandraSession23ExecuteAndProcessOneRowIZNS0_10FetchValueINSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEEENS_6ResultIT_EERKS9_EUlRKNS_12CassandraRowEE_EENS_6StatusESE_RKSB_ Line | Count | Source | 273 | 1 | CHECKED_STATUS ExecuteAndProcessOneRow(const std::string& query, const Action& action) { | 274 | 1 | return ExecuteAndProcessOneRow(CassandraStatement(query), action); | 275 | 1 | } |
Unexecuted instantiation: _ZN2yb16CassandraSession23ExecuteAndProcessOneRowIZNS0_10FetchValueIiEENS_6ResultIT_EERKNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEEEUlRKNS_12CassandraRowEE_EENS_6StatusESE_RKS4_ |
276 | | |
277 | | template <class T> |
278 | 1 | Result<T> FetchValue(const std::string& query) { |
279 | 1 | T result = T(); |
280 | 1 | RETURN_NOT_OK(ExecuteAndProcessOneRow(query, [&result](const CassandraRow& row) { |
281 | 1 | result = row.Value(0).As<T>(); |
282 | 1 | })); |
283 | 1 | return result; |
284 | 1 | } _ZN2yb16CassandraSession10FetchValueINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEENS_6ResultIT_EERKS8_ Line | Count | Source | 278 | 1 | Result<T> FetchValue(const std::string& query) { | 279 | 1 | T result = T(); | 280 | 1 | RETURN_NOT_OK(ExecuteAndProcessOneRow(query, [&result](const CassandraRow& row) { | 281 | 1 | result = row.Value(0).As<T>(); | 282 | 1 | })); | 283 | 1 | return result; | 284 | 1 | } |
Unexecuted instantiation: _ZN2yb16CassandraSession10FetchValueIiEENS_6ResultIT_EERKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE |
285 | | |
286 | | CHECKED_STATUS ExecuteBatch(const CassandraBatch& batch); |
287 | | |
288 | | CassandraFuture SubmitBatch(const CassandraBatch& batch); |
289 | | |
290 | | // If 'local_keyspace' is not empty, creating temporary CassStatement and setting keyspace |
291 | | // for this statement only. Result CassPrepared will be based on this temporary statement. |
292 | | Result<CassandraPrepared> Prepare(const std::string& prepare_query, |
293 | | MonoDelta timeout = MonoDelta::kZero, |
294 | | const std::string& local_keyspace = std::string()); |
295 | | |
296 | | void Reset(); |
297 | | |
298 | | private: |
299 | | CassSessionPtr cass_session_; |
300 | | }; |
301 | | |
302 | | YB_STRONGLY_TYPED_BOOL(UsePartitionAwareRouting); |
303 | | |
304 | | class CppCassandraDriver { |
305 | | public: |
306 | | CppCassandraDriver( |
307 | | const std::vector<std::string>& hosts, uint16_t port, |
308 | | UsePartitionAwareRouting use_partition_aware_routing); |
309 | | |
310 | | ~CppCassandraDriver(); |
311 | | |
312 | | Result<CassandraSession> CreateSession(); |
313 | | |
314 | | private: |
315 | | CassCluster* cass_cluster_ = nullptr; |
316 | | }; |
317 | | |
318 | | class CassandraJson { |
319 | | public: |
320 | 21 | CassandraJson() = default; |
321 | 1 | explicit CassandraJson(const std::string& s) : value_(s) {} |
322 | 4 | explicit CassandraJson(std::string&& s) : value_(std::move(s)) {} |
323 | 6 | explicit CassandraJson(const char* s) : value_(s) {} |
324 | | |
325 | 24 | const std::string& value() const { |
326 | 24 | return value_; |
327 | 24 | } |
328 | | |
329 | | private: |
330 | | std::string value_; |
331 | | }; |
332 | | |
333 | 15 | inline std::ostream& operator<<(std::ostream& out, const CassandraJson& value) { |
334 | 15 | return out << value.value(); |
335 | 15 | } |
336 | | |
337 | 2 | inline bool operator==(const CassandraJson& lhs, const CassandraJson& rhs) { |
338 | 2 | return lhs.value() == rhs.value(); |
339 | 2 | } |
340 | | |
341 | | extern const MonoDelta kCassandraTimeOut; |
342 | | extern const std::string kCqlTestKeyspace; |
343 | | |
344 | | Result<CassandraSession> EstablishSession(CppCassandraDriver* driver); |
345 | | |
346 | | } // namespace yb |
347 | | |
348 | | #endif // YB_INTEGRATION_TESTS_CQL_TEST_UTIL_H |