YugabyteDB (2.13.0.0-b42, bfc6a6643e7399ac8a0e81d06a3ee6d6571b33ab)

Coverage Report

Created: 2022-03-09 17:30

/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