From 9cb41c18642c5977aa70747801d48d5500152209 Mon Sep 17 00:00:00 2001 From: omikro2n Date: Fri, 18 Apr 2014 12:43:08 +0200 Subject: [PATCH 1/3] Enabled NULL values in prepared statements. --- include/cql/cql_execute.hpp | 3 + .../cql/internal/cql_message_execute_impl.hpp | 7 +- src/cql/cql_execute.cpp | 5 ++ src/cql/internal/cql_message_execute_impl.cpp | 68 +++++++++++++------ 4 files changed, 62 insertions(+), 21 deletions(-) diff --git a/include/cql/cql_execute.hpp b/include/cql/cql_execute.hpp index 97ddbf77f..d807939cb 100644 --- a/include/cql/cql_execute.hpp +++ b/include/cql/cql_execute.hpp @@ -85,6 +85,9 @@ class CQL_EXPORT cql_execute_t : void push_back(const bool val); + void + push_back_null(); + void pop_back(); diff --git a/include/cql/internal/cql_message_execute_impl.hpp b/include/cql/internal/cql_message_execute_impl.hpp index 0745ecb08..e26386e33 100644 --- a/include/cql/internal/cql_message_execute_impl.hpp +++ b/include/cql/internal/cql_message_execute_impl.hpp @@ -47,6 +47,8 @@ class cql_message_execute_impl_t : boost::shared_ptr retry_policy, bool is_traced); + ~cql_message_execute_impl_t(); + const std::vector& query_id() const; @@ -83,6 +85,9 @@ class cql_message_execute_impl_t : void push_back(const bool val); + void + push_back_null(); + void pop_back(); @@ -130,7 +135,7 @@ class cql_message_execute_impl_t : set_stream(const cql_stream_t& stream); private: - typedef std::list params_container_t; + typedef std::list params_container_t; cql::cql_message_buffer_t _buffer; std::vector _query_id; diff --git a/src/cql/cql_execute.cpp b/src/cql/cql_execute.cpp index 3ffebcada..02c867cd4 100644 --- a/src/cql/cql_execute.cpp +++ b/src/cql/cql_execute.cpp @@ -97,6 +97,11 @@ cql::cql_execute_t::push_back(const bool val) { _impl->push_back(val); } +void +cql::cql_execute_t::push_back_null() { + _impl->push_back_null(); +} + void cql::cql_execute_t::pop_back() { _impl->pop_back(); diff --git a/src/cql/internal/cql_message_execute_impl.cpp b/src/cql/internal/cql_message_execute_impl.cpp index 1466e6ba8..72bf716a6 100644 --- a/src/cql/internal/cql_message_execute_impl.cpp +++ b/src/cql/internal/cql_message_execute_impl.cpp @@ -57,6 +57,13 @@ cql::cql_message_execute_impl_t::cql_message_execute_impl_t( _retry_counter(0) {} +cql::cql_message_execute_impl_t::~cql_message_execute_impl_t() +{ + BOOST_FOREACH(param_t* p, _params) { + delete p; + } +} + cql::cql_message_buffer_t cql::cql_message_execute_impl_t::buffer() { return _buffer; @@ -84,56 +91,67 @@ cql::cql_message_execute_impl_t::consistency(const cql::cql_consistency_enum con void cql::cql_message_execute_impl_t::push_back(const param_t& val) { - _params.push_back(param_t(val.begin(), val.end())); + _params.push_back(new param_t(val.begin(), val.end())); } void cql::cql_message_execute_impl_t::push_back(const std::string& val) { - _params.push_back(param_t(val.begin(), val.end())); + _params.push_back(new param_t(val.begin(), val.end())); } void cql::cql_message_execute_impl_t::push_back(const cql::cql_short_t val) { - cql::cql_message_execute_impl_t::param_t p; - cql::encode_short(p, val); + cql::cql_message_execute_impl_t::param_t* p + = new cql::cql_message_execute_impl_t::param_t; + cql::encode_short(*p, val); _params.push_back(p); } void cql::cql_message_execute_impl_t::push_back(const cql::cql_int_t val) { - cql::cql_message_execute_impl_t::param_t p; - cql::encode_int(p, val); + cql::cql_message_execute_impl_t::param_t* p + = new cql::cql_message_execute_impl_t::param_t; + cql::encode_int(*p, val); _params.push_back(p); } void cql::cql_message_execute_impl_t::push_back(const cql::cql_bigint_t val) { - cql::cql_message_execute_impl_t::param_t p; - cql::encode_bigint(p, val); + cql::cql_message_execute_impl_t::param_t* p + = new cql::cql_message_execute_impl_t::param_t; + cql::encode_bigint(*p, val); _params.push_back(p); } void cql::cql_message_execute_impl_t::push_back(const float val) { - cql::cql_message_execute_impl_t::param_t p; - cql::encode_float(p, val); + cql::cql_message_execute_impl_t::param_t* p + = new cql::cql_message_execute_impl_t::param_t; + cql::encode_float(*p, val); _params.push_back(p); } void cql::cql_message_execute_impl_t::push_back(const double val) { - cql::cql_message_execute_impl_t::param_t p; - cql::encode_double(p, val); + cql::cql_message_execute_impl_t::param_t* p + = new cql::cql_message_execute_impl_t::param_t; + cql::encode_double(*p, val); _params.push_back(p); } void cql::cql_message_execute_impl_t::push_back(const bool val) { - cql::cql_message_execute_impl_t::param_t p; - cql::encode_bool(p, val); + cql::cql_message_execute_impl_t::param_t p + = new cql::cql_message_execute_impl_t::param_t; + cql::encode_bool(*p, val); _params.push_back(p); } +void +cql::cql_message_execute_impl_t::push_back_null() { + _params.push_back(NULL); +} + void cql::cql_message_execute_impl_t::pop_back() { _params.pop_back(); @@ -186,8 +204,9 @@ cql::cql_message_execute_impl_t::consume(cql::cql_error_t*) { cql::decode_short(stream, count); for (int i = 0; i < count; ++i) { - cql::cql_message_execute_impl_t::param_t p; - cql::decode_bytes(stream, p); + cql::cql_message_execute_impl_t::param_t* p + = new cql::cql_message_execute_impl_t::param_t; + cql::decode_bytes(stream, *p); _params.push_back(p); } @@ -235,8 +254,12 @@ cql::cql_message_execute_impl_t::consume(cql::cql_error_t*) { bool cql::cql_message_execute_impl_t::prepare(cql::cql_error_t*) { size_t size = (3 * sizeof(cql_short_t)) + _query_id.size(); - BOOST_FOREACH(const param_t& p, _params) { - size += p.size() + sizeof(cql_int_t); + BOOST_FOREACH(const param_t* p, _params) { + if (p != NULL) { + size += p->size() + sizeof(cql_int_t); + } else { + size += sizeof(cql_int_t); + } } _buffer->resize(size); @@ -246,8 +269,13 @@ cql::cql_message_execute_impl_t::prepare(cql::cql_error_t*) { cql::encode_short_bytes(stream, _query_id); cql::encode_short(stream, _params.size()); - BOOST_FOREACH(const param_t& p, _params) { - cql::encode_bytes(stream, p); + BOOST_FOREACH(const param_t* p, _params) { + if (p != NULL) { + cql::encode_bytes(stream, *p); + } else { + cql::cql_int_t v = htonl(-1); + stream::write(reinterpret_cast(&v), sizeof(v)); + } } cql::cql_short_t consistency = 0; From 8299e582a27c8dbce388e43a088c066e62159d13 Mon Sep 17 00:00:00 2001 From: omikro2n Date: Fri, 18 Apr 2014 18:39:06 +0200 Subject: [PATCH 2/3] Minor fixes. --- src/cql/internal/cql_message_execute_impl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cql/internal/cql_message_execute_impl.cpp b/src/cql/internal/cql_message_execute_impl.cpp index 72bf716a6..0ece52847 100644 --- a/src/cql/internal/cql_message_execute_impl.cpp +++ b/src/cql/internal/cql_message_execute_impl.cpp @@ -141,7 +141,7 @@ cql::cql_message_execute_impl_t::push_back(const double val) { void cql::cql_message_execute_impl_t::push_back(const bool val) { - cql::cql_message_execute_impl_t::param_t p + cql::cql_message_execute_impl_t::param_t* p = new cql::cql_message_execute_impl_t::param_t; cql::encode_bool(*p, val); _params.push_back(p); @@ -274,7 +274,7 @@ cql::cql_message_execute_impl_t::prepare(cql::cql_error_t*) { cql::encode_bytes(stream, *p); } else { cql::cql_int_t v = htonl(-1); - stream::write(reinterpret_cast(&v), sizeof(v)); + stream.write(reinterpret_cast(&v), sizeof(v)); } } From 3ab7e348add6d7ec456d8e0654cb27863026a39a Mon Sep 17 00:00:00 2001 From: omikro2n Date: Tue, 22 Apr 2014 18:13:28 +0200 Subject: [PATCH 3/3] Switched from raw pointers to boost::shared_ptrs in message parameters. --- .../cql/internal/cql_message_execute_impl.hpp | 4 +- src/cql/internal/cql_message_execute_impl.cpp | 41 +++++++------------ 2 files changed, 16 insertions(+), 29 deletions(-) diff --git a/include/cql/internal/cql_message_execute_impl.hpp b/include/cql/internal/cql_message_execute_impl.hpp index e26386e33..fe51e768e 100644 --- a/include/cql/internal/cql_message_execute_impl.hpp +++ b/include/cql/internal/cql_message_execute_impl.hpp @@ -47,8 +47,6 @@ class cql_message_execute_impl_t : boost::shared_ptr retry_policy, bool is_traced); - ~cql_message_execute_impl_t(); - const std::vector& query_id() const; @@ -135,7 +133,7 @@ class cql_message_execute_impl_t : set_stream(const cql_stream_t& stream); private: - typedef std::list params_container_t; + typedef std::list< boost::shared_ptr > params_container_t; cql::cql_message_buffer_t _buffer; std::vector _query_id; diff --git a/src/cql/internal/cql_message_execute_impl.cpp b/src/cql/internal/cql_message_execute_impl.cpp index 0ece52847..3b1e27a85 100644 --- a/src/cql/internal/cql_message_execute_impl.cpp +++ b/src/cql/internal/cql_message_execute_impl.cpp @@ -57,13 +57,6 @@ cql::cql_message_execute_impl_t::cql_message_execute_impl_t( _retry_counter(0) {} -cql::cql_message_execute_impl_t::~cql_message_execute_impl_t() -{ - BOOST_FOREACH(param_t* p, _params) { - delete p; - } -} - cql::cql_message_buffer_t cql::cql_message_execute_impl_t::buffer() { return _buffer; @@ -91,65 +84,62 @@ cql::cql_message_execute_impl_t::consistency(const cql::cql_consistency_enum con void cql::cql_message_execute_impl_t::push_back(const param_t& val) { - _params.push_back(new param_t(val.begin(), val.end())); + boost::shared_ptr p(new param_t(val.begin(), val.end())); + _params.push_back(p); } void cql::cql_message_execute_impl_t::push_back(const std::string& val) { - _params.push_back(new param_t(val.begin(), val.end())); + boost::shared_ptr p(new param_t(val.begin(), val.end())); + _params.push_back(p); } void cql::cql_message_execute_impl_t::push_back(const cql::cql_short_t val) { - cql::cql_message_execute_impl_t::param_t* p - = new cql::cql_message_execute_impl_t::param_t; + boost::shared_ptr p(new param_t); cql::encode_short(*p, val); _params.push_back(p); } void cql::cql_message_execute_impl_t::push_back(const cql::cql_int_t val) { - cql::cql_message_execute_impl_t::param_t* p - = new cql::cql_message_execute_impl_t::param_t; + boost::shared_ptr p(new param_t); cql::encode_int(*p, val); _params.push_back(p); } void cql::cql_message_execute_impl_t::push_back(const cql::cql_bigint_t val) { - cql::cql_message_execute_impl_t::param_t* p - = new cql::cql_message_execute_impl_t::param_t; + boost::shared_ptr p(new param_t); cql::encode_bigint(*p, val); _params.push_back(p); } void cql::cql_message_execute_impl_t::push_back(const float val) { - cql::cql_message_execute_impl_t::param_t* p - = new cql::cql_message_execute_impl_t::param_t; + boost::shared_ptr p(new param_t); cql::encode_float(*p, val); _params.push_back(p); } void cql::cql_message_execute_impl_t::push_back(const double val) { - cql::cql_message_execute_impl_t::param_t* p - = new cql::cql_message_execute_impl_t::param_t; + boost::shared_ptr p(new param_t); cql::encode_double(*p, val); _params.push_back(p); } void cql::cql_message_execute_impl_t::push_back(const bool val) { - cql::cql_message_execute_impl_t::param_t* p - = new cql::cql_message_execute_impl_t::param_t; + boost::shared_ptr p(new param_t); cql::encode_bool(*p, val); _params.push_back(p); } void cql::cql_message_execute_impl_t::push_back_null() { - _params.push_back(NULL); + boost::shared_ptr p; + _params.push_back(p); } void @@ -204,8 +194,7 @@ cql::cql_message_execute_impl_t::consume(cql::cql_error_t*) { cql::decode_short(stream, count); for (int i = 0; i < count; ++i) { - cql::cql_message_execute_impl_t::param_t* p - = new cql::cql_message_execute_impl_t::param_t; + boost::shared_ptr p(new param_t); cql::decode_bytes(stream, *p); _params.push_back(p); } @@ -254,7 +243,7 @@ cql::cql_message_execute_impl_t::consume(cql::cql_error_t*) { bool cql::cql_message_execute_impl_t::prepare(cql::cql_error_t*) { size_t size = (3 * sizeof(cql_short_t)) + _query_id.size(); - BOOST_FOREACH(const param_t* p, _params) { + BOOST_FOREACH(const boost::shared_ptr p, _params) { if (p != NULL) { size += p->size() + sizeof(cql_int_t); } else { @@ -269,7 +258,7 @@ cql::cql_message_execute_impl_t::prepare(cql::cql_error_t*) { cql::encode_short_bytes(stream, _query_id); cql::encode_short(stream, _params.size()); - BOOST_FOREACH(const param_t* p, _params) { + BOOST_FOREACH(const boost::shared_ptr p, _params) { if (p != NULL) { cql::encode_bytes(stream, *p); } else {