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..fe51e768e 100644 --- a/include/cql/internal/cql_message_execute_impl.hpp +++ b/include/cql/internal/cql_message_execute_impl.hpp @@ -83,6 +83,9 @@ class cql_message_execute_impl_t : void push_back(const bool val); + void + push_back_null(); + void pop_back(); @@ -130,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/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..3b1e27a85 100644 --- a/src/cql/internal/cql_message_execute_impl.cpp +++ b/src/cql/internal/cql_message_execute_impl.cpp @@ -84,53 +84,61 @@ 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())); + 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(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; - cql::encode_short(p, val); + 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; - cql::encode_int(p, val); + 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; - cql::encode_bigint(p, val); + 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; - cql::encode_float(p, val); + 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; - cql::encode_double(p, val); + 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; - cql::encode_bool(p, val); + 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() { + boost::shared_ptr p; _params.push_back(p); } @@ -186,8 +194,8 @@ 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); + boost::shared_ptr p(new param_t); + cql::decode_bytes(stream, *p); _params.push_back(p); } @@ -235,8 +243,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 boost::shared_ptr p, _params) { + if (p != NULL) { + size += p->size() + sizeof(cql_int_t); + } else { + size += sizeof(cql_int_t); + } } _buffer->resize(size); @@ -246,8 +258,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 boost::shared_ptr 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;