From 59b217544b75ab3f8b5cb322d404028b95eb8b00 Mon Sep 17 00:00:00 2001 From: Michael Penick Date: Tue, 8 Mar 2016 08:26:45 -0700 Subject: [PATCH] Allow blob types to be bound/set using string functions --- src/data_type.hpp | 3 +- test/integration_tests/src/test_basics.cpp | 47 ++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/data_type.hpp b/src/data_type.hpp index 0304fa46a..1006c59e1 100644 --- a/src/data_type.hpp +++ b/src/data_type.hpp @@ -521,7 +521,8 @@ struct IsValidDataType { template<> struct IsValidDataType { bool operator()(CassString, const DataType::ConstPtr& data_type) const { - return is_string_type(data_type->value_type()); + // Also allow "bytes" types to be bound as "string" types + return is_string_type(data_type->value_type()) || is_bytes_type(data_type->value_type()); } }; diff --git a/test/integration_tests/src/test_basics.cpp b/test/integration_tests/src/test_basics.cpp index 314b2f770..22812f695 100644 --- a/test/integration_tests/src/test_basics.cpp +++ b/test/integration_tests/src/test_basics.cpp @@ -691,4 +691,51 @@ BOOST_AUTO_TEST_CASE(unset_parameters) BOOST_CHECK(test_utils::Value::equal(value, CassString("value1"))); } +/** + * Bind a blob as a string (char*). + * + * Verify that a "blob" can be bound using the string function. This was + * allowed in previous versions of the driver. + * + * @since 2.3 + * @test_category basic + * + */ +BOOST_AUTO_TEST_CASE(bind_blob_as_string) +{ + std::string table_name = str(boost::format("table_%s") % test_utils::generate_unique_str(uuid_gen)); + + test_utils::execute_query(session, + str(boost::format("CREATE TABLE %s (key text PRIMARY KEY, value blob)") % table_name)); + + std::string insert_query = str(boost::format("INSERT INTO %s (key, value) VALUES(?, ?)") % table_name); + + // Prepared needed to validate bind type information + test_utils::CassPreparedPtr prepared = test_utils::prepare(session, insert_query); + test_utils::CassStatementPtr statement(test_utils::CassStatementPtr(cass_prepared_bind(prepared.get()))); + + BOOST_CHECK_EQUAL(cass_statement_bind_string(statement.get(), 0, "key1"), CASS_OK); + + // Verify that a blob can be bound as a string + BOOST_CHECK_EQUAL(cass_statement_bind_string(statement.get(), 1, "value1"), CASS_OK); + + test_utils::CassFuturePtr future(cass_session_execute(session, statement.get())); + + CassError rc = cass_future_error_code(future.get()); + BOOST_REQUIRE(rc == CASS_OK); + + test_utils::CassResultPtr result; + test_utils::execute_query(session, + str(boost::format("SELECT * FROM %s") % table_name), &result); + + // Check to make sure the known values are still present + CassString key; + CassString value; + const CassRow* row = cass_result_first_row(result.get()); + test_utils::Value::get(cass_row_get_column(row, 0), &key); + test_utils::Value::get(cass_row_get_column(row, 1), &value); + BOOST_CHECK(test_utils::Value::equal(key, CassString("key1"))); + BOOST_CHECK(test_utils::Value::equal(value, CassString("value1"))); +} + BOOST_AUTO_TEST_SUITE_END()