Kea  1.9.9-git
cql_exchange.h
Go to the documentation of this file.
1 // Copyright (C) 2018,2021 Internet Systems Consortium, Inc. ("ISC")
2 // Copyright (C) 2016-2017 Deutsche Telekom AG.
3 //
4 // Authors: Razvan Becheriu <razvan.becheriu@qualitance.com>
5 // Andrei Pavel <andrei.pavel@qualitance.com>
6 //
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
10 //
11 // http://www.apache.org/licenses/LICENSE-2.0
12 //
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
18 
19 #ifndef CQL_EXCHANGE_H
20 #define CQL_EXCHANGE_H
21 
22 #include <cql/cql_connection.h>
23 #include <cql/sql_common.h>
24 
25 #include <boost/any.hpp> // for boost::any
26 
27 #include <string>
28 #include <typeinfo> // for std::type_info
29 #include <unordered_map> // for std::unordered_map
30 #include <utility>
31 #include <vector>
32 
33 namespace isc {
34 namespace db {
35 
37 typedef std::vector<cass_byte_t> CassBlob;
38 
40 class CqlExchange;
41 
50 class AnyArray : public std::vector<boost::any> {
51 public:
53  void add(const boost::any& value);
54 
57  void remove(const size_t& index);
58 };
59 
60 // @brief Representation of a Cassandra User Defined Type
61 class Udt : public AnyArray {
62 public:
64  Udt(const CqlConnection& connection, const std::string& name);
65 
67  ~Udt();
68 
70  void freeUserType();
71 
73  void newUserType();
74 
77 
79  const std::string name_;
80 
83  const CassDataType* cass_data_type_;
84 
86  CassUserType* cass_user_type_;
87 };
88 
91 
97 typedef CassError (*CqlBindFunction)(const boost::any& value,
98  const size_t& index,
99  CassStatement* statement);
100 
105 typedef CassError (*CqlUdtSetFunction)(const boost::any& value,
106  const size_t& index,
107  CassUserType* cass_user_type);
108 
112 typedef CassError (*CqlCollectionAppendFunction)(const boost::any& value,
113  CassCollection* collection);
114 
120 typedef CassError (*CqlGetFunction)(const boost::any& data,
121  const CassValue* value);
122 
124 struct CqlFunction {
135 };
136 
142 class CqlExchange : public virtual SqlExchange {
143 public:
147  CqlExchange();
148 
150  virtual ~CqlExchange();
151 
159  static void convertToDatabaseTime(const time_t& cltt,
160  const uint32_t& valid_lifetime,
161  cass_int64_t& expire);
162 
167  static void convertFromDatabaseTime(const cass_int64_t& expire,
168  const cass_int64_t& valid_lifetime,
169  time_t& cltt);
171 
179  virtual void createBindForSelect(AnyArray& data,
180  StatementTag statement_tag = NULL) = 0;
181 
195  AnyArray executeSelect(const CqlConnection& connection,
196  const AnyArray& where_values,
197  StatementTag statement_tag,
198  const bool& single = false);
199 
208  void executeMutation(const CqlConnection& connection,
209  const AnyArray& assigned_values,
210  StatementTag statement_tag);
211 
222  bool statementApplied(CassFuture* future, size_t* row_count = NULL,
223  size_t* column_count = NULL);
224 
232  virtual boost::any retrieve() = 0;
233 };
234 
236 class CqlVersionExchange : public virtual CqlExchange {
237 public:
242 
244  virtual ~CqlVersionExchange();
245 
253  virtual void
255  StatementTag statement_tag = NULL) override;
256 
264  virtual VersionPair retrieveVersion(const CqlConnection& connection);
265 
272  virtual boost::any retrieve() override;
273 
276  static constexpr StatementTag GET_VERSION = "GET_VERSION";
278 
281 
282 private:
284  cass_int32_t version_;
286  cass_int32_t minor_;
288  VersionPair pair_;
289 };
290 
292 class CqlCommon {
293 public:
302  static void bindData(const AnyArray& data, CassStatement* statement);
303 
311  static void getData(const CassRow* row, AnyArray& data);
312 };
313 
316 exchangeType(const boost::any& object);
317 
320 exchangeType(const CassValueType& type);
321 
322 } // namespace db
323 } // namespace isc
324 
325 #endif // CQL_EXCHANGE_H
void executeMutation(const CqlConnection &connection, const AnyArray &assigned_values, StatementTag statement_tag)
Executes INSERT, UPDATE or DELETE statements.
void freeUserType()
Frees the underlying container.
virtual void createBindForSelect(AnyArray &data, StatementTag statement_tag=NULL) override
Create BIND array to receive C++ data.
ExchangeDataType exchangeType(const boost::any &object)
Determine exchange type based on boost::any type.
const CassDataType * cass_data_type_
Internal Cassandra driver object representing a Cassandra data type.
Definition: cql_exchange.h:83
Structure used to bind C++ input values to dynamic CQL parameters.
Definition: cql_exchange.h:50
static constexpr StatementTag GET_VERSION
Statement tags definitions.
Definition: cql_exchange.h:276
CqlGetFunction cqlGetFunction_
Converts a single Cassandra column value to a C++ object.
Definition: cql_exchange.h:134
CassError(* CqlUdtSetFunction)(const boost::any &value, const size_t &index, CassUserType *cass_user_type)
Sets a member in a UDT.
Definition: cql_exchange.h:105
virtual ~CqlVersionExchange()
Destructor.
static void getData(const CassRow *row, AnyArray &data)
Retrieves data returned by Cassandra.
void newUserType()
Creates the underlying container.
CassError(* CqlBindFunction)(const boost::any &value, const size_t &index, CassStatement *statement)
Binds a C++ object to a Cassandra statement's parameter.
Definition: cql_exchange.h:97
const CqlConnection & connection_
Connection to the Cassandra database.
Definition: cql_exchange.h:76
Cassandra Exchange.
Definition: cql_exchange.h:142
Wrapper over the bind and get functions that interface with Cassandra.
Definition: cql_exchange.h:124
char const *const StatementTag
Statement index representing the statement name.
bool statementApplied(CassFuture *future, size_t *row_count=NULL, size_t *column_count=NULL)
Check if CQL statement has been applied.
CassUserType * cass_user_type_
Internal Cassandra driver object representing a user defined type.
Definition: cql_exchange.h:86
void add(const boost::any &value)
Add a value at the end of the vector.
static void convertToDatabaseTime(const time_t &cltt, const uint32_t &valid_lifetime, cass_int64_t &expire)
virtual boost::any retrieve() override
Copy received data into the pair.
std::vector< cass_byte_t > CassBlob
Host identifier converted to Cassandra data type.
Definition: cql_exchange.h:37
std::pair< uint32_t, uint32_t > VersionPair
Pair containing major and minor versions.
CqlBindFunction cqlBindFunction_
Binds a C++ object to a Cassandra statement's parameter.
Definition: cql_exchange.h:127
ExchangeDataType
Used to map server data types with internal backend storage data types.
Definition: sql_common.h:26
Udt(const CqlConnection &connection, const std::string &name)
Parameterized constructor.
const std::string name_
Name of the UDT in the schema: CREATE TYPE ___ { ... }.
Definition: cql_exchange.h:79
Defines the logger used by the top-level component of kea-dhcp-ddns.
static void convertFromDatabaseTime(const cass_int64_t &expire, const cass_int64_t &valid_lifetime, time_t &cltt)
Converts time from Cassandra format.
Exchange used to retrieve schema version from the keyspace.
Definition: cql_exchange.h:236
CqlUdtSetFunction cqlUdtSetFunction_
Sets a member in a UDT. Used in INSERT & UPDATE statements.
Definition: cql_exchange.h:129
static void bindData(const AnyArray &data, CassStatement *statement)
Assigns values to every column of an INSERT or an UPDATE statement.
std::unordered_map< StatementTag, CqlTaggedStatement, StatementTagHash, StatementTagEqual > StatementMap
A container for all statements.
CassError(* CqlCollectionAppendFunction)(const boost::any &value, CassCollection *collection)
Sets an item in a collection.
Definition: cql_exchange.h:112
AnyArray executeSelect(const CqlConnection &connection, const AnyArray &where_values, StatementTag statement_tag, const bool &single=false)
Executes SELECT statements.
virtual boost::any retrieve()=0
Copy received data into the derived class' object.
virtual ~CqlExchange()
Destructor.
CassError(* CqlGetFunction)(const boost::any &data, const CassValue *value)
Converts a single Cassandra column value to a C++ object.
Definition: cql_exchange.h:120
static StatementMap tagged_statements_
Cassandra statements.
Definition: cql_exchange.h:280
Common CQL connector pool.
~Udt()
Destructor.
CqlCollectionAppendFunction cqlCollectionAppendFunction_
Sets an item in a collection. Used in INSERT & UPDATE statements.
Definition: cql_exchange.h:131
virtual VersionPair retrieveVersion(const CqlConnection &connection)
Standalone method used to retrieve schema version.
Common operations in Cassandra exchanges.
Definition: cql_exchange.h:292
CqlExchange()
Constructor.
Base class for backend exchanges.
Definition: sql_common.h:42
CqlVersionExchange()
Constructor.
AnyArray AnyCollection
Defines an array of arbitrary objects (used by Cassandra backend)
Definition: cql_exchange.h:90
virtual void createBindForSelect(AnyArray &data, StatementTag statement_tag=NULL)=0
Create BIND array to receive C++ data.