blob: 86bc0dbf69ee5b24a9096a98969e60ad6ec63a3e [file] [log] [blame]
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#include "integration.hpp"
#define TABLE_FORMAT \
"CREATE TABLE IF NOT EXISTS %s(key int, value_text text, value_uuid uuid, value_blob blob, " \
"value_list_floats list<float>, PRIMARY KEY (key, value_text))"
#define INSERT_QUERY_FORMAT \
"INSERT INTO %s(key, value_text, value_uuid, value_blob, value_list_floats) VALUES " \
"(:named_key, :named_text, :named_uuid, :named_blob, :named_list_floats)"
#define SELECT_QUERY_FORMAT \
"SELECT value_uuid, value_blob, value_list_floats FROM %s WHERE key=:named_key AND " \
"value_text=:named_text"
const Float FLOAT_VALUES[] = { Float::max(), Float::min(), Float(3.14159f), Float(2.71828f),
Float(1.61803f) };
const std::vector<Float> NUMBERS(FLOAT_VALUES, FLOAT_VALUES + ARRAY_LEN(FLOAT_VALUES));
class NamedParametersTests : public Integration {
public:
NamedParametersTests()
: key_(1)
, value_text_("DataStax C/C++ Driver")
, value_blob_("Cassandra")
, value_list_floats_(NUMBERS) {
value_uuid_ = uuid_generator_.generate_random_uuid();
}
virtual void SetUp() {
Integration::SetUp();
session_.execute(format_string(TABLE_FORMAT, table_name_.c_str()));
prepared_insert_statement_ =
session_.prepare(format_string(INSERT_QUERY_FORMAT, table_name_.c_str()));
prepared_select_statement_ =
session_.prepare(format_string(SELECT_QUERY_FORMAT, table_name_.c_str()));
}
Statement create_insert_statement(bool is_from_prepared = false) {
if (is_from_prepared) {
return prepared_insert_statement_.bind();
}
return Statement(format_string(INSERT_QUERY_FORMAT, table_name_.c_str()), 5);
}
Statement create_select_statement(bool is_from_prepared = false) {
if (is_from_prepared) {
return prepared_select_statement_.bind();
}
return Statement(format_string(SELECT_QUERY_FORMAT, table_name_.c_str()), 2);
}
void execute_select_statement(const Statement& select_statement) {
Result result = session_.execute(select_statement);
ASSERT_EQ(1u, result.row_count());
ASSERT_EQ(3u, result.column_count());
Row row = result.first_row();
EXPECT_EQ(value_uuid_, row.column_by_name<Uuid>("value_uuid"));
EXPECT_EQ(value_blob_, row.column_by_name<Blob>("value_blob"));
EXPECT_EQ(value_list_floats_, row.column_by_name<List<Float> >("value_list_floats"));
}
protected:
Integer key_;
Text value_text_;
Uuid value_uuid_;
Blob value_blob_;
List<Float> value_list_floats_;
private:
Prepared prepared_insert_statement_;
Prepared prepared_select_statement_;
};
/**
* Ensures named parameters can be used with simple statements when bound in order.
*
* @since 2.1.0-beta
* @jira_ticket CPP-263
* @cassandra_version 2.1.x
*/
CASSANDRA_INTEGRATION_TEST_F(NamedParametersTests, SimpleStatementInOrder) {
CHECK_FAILURE;
CHECK_VERSION(2.1.0);
Statement insert_statement = create_insert_statement();
insert_statement.bind<Integer>("named_key", key_);
insert_statement.bind<Text>("named_text", value_text_);
insert_statement.bind<Uuid>("named_uuid", value_uuid_);
insert_statement.bind<Blob>("named_blob", value_blob_);
insert_statement.bind<List<Float> >("named_list_floats", value_list_floats_);
session_.execute(insert_statement);
Statement select_statement = create_select_statement();
select_statement.bind<Integer>("named_key", key_);
select_statement.bind<Text>("named_text", value_text_);
execute_select_statement(select_statement);
}
/**
* Ensures named parameters can be used with simple statements when bound in any order.
*
* @since 2.1.0-beta
* @jira_ticket CPP-263
* @cassandra_version 2.1.x
*/
CASSANDRA_INTEGRATION_TEST_F(NamedParametersTests, SimpleStatementAnyOrder) {
CHECK_FAILURE;
CHECK_VERSION(2.1.0);
Statement insert_statement = create_insert_statement();
insert_statement.bind<Blob>("named_blob", value_blob_);
insert_statement.bind<Text>("named_text", value_text_);
insert_statement.bind<List<Float> >("named_list_floats", value_list_floats_);
insert_statement.bind<Integer>("named_key", key_);
insert_statement.bind<Uuid>("named_uuid", value_uuid_);
session_.execute(insert_statement);
Statement select_statement = create_select_statement();
select_statement.bind<Text>("named_text", value_text_);
select_statement.bind<Integer>("named_key", key_);
execute_select_statement(select_statement);
}
/**
* Ensures named parameters can be used with prepared statements when bound in order.
*
* @since 2.1.0-beta
* @jira_ticket CPP-263
* @cassandra_version 2.1.x
*/
CASSANDRA_INTEGRATION_TEST_F(NamedParametersTests, PreparedStatementInOrder) {
CHECK_FAILURE;
CHECK_VERSION(2.1.0);
Statement insert_statement = create_insert_statement(true);
insert_statement.bind<Integer>("named_key", key_);
insert_statement.bind<Text>("named_text", value_text_);
insert_statement.bind<Uuid>("named_uuid", value_uuid_);
insert_statement.bind<Blob>("named_blob", value_blob_);
insert_statement.bind<List<Float> >("named_list_floats", value_list_floats_);
session_.execute(insert_statement);
Statement select_statement = create_select_statement(true);
select_statement.bind<Integer>("named_key", key_);
select_statement.bind<Text>("named_text", value_text_);
execute_select_statement(select_statement);
}
/**
* Ensures named parameters can be used with prepared statements when bound in any order.
*
* @since 2.1.0-beta
* @jira_ticket CPP-263
* @cassandra_version 2.1.x
*/
CASSANDRA_INTEGRATION_TEST_F(NamedParametersTests, PreparedStatementAnyOrder) {
CHECK_FAILURE;
CHECK_VERSION(2.1.0);
Statement insert_statement = create_insert_statement(true);
insert_statement.bind<Blob>("named_blob", value_blob_);
insert_statement.bind<Text>("named_text", value_text_);
insert_statement.bind<List<Float> >("named_list_floats", value_list_floats_);
insert_statement.bind<Integer>("named_key", key_);
insert_statement.bind<Uuid>("named_uuid", value_uuid_);
session_.execute(insert_statement);
Statement select_statement = create_select_statement(true);
select_statement.bind<Text>("named_text", value_text_);
select_statement.bind<Integer>("named_key", key_);
execute_select_statement(select_statement);
}
/**
* Ensures invalid named parameters return an error when bound and executed using a simple
* statement.
*
* @since 2.1.0-beta
* @jira_ticket CPP-263
* @cassandra_version 2.1.x
*/
CASSANDRA_INTEGRATION_TEST_F(NamedParametersTests, SimpleStatementInvalidName) {
CHECK_FAILURE;
CHECK_VERSION(2.1.0);
Statement insert_statement = create_insert_statement();
insert_statement.bind<Integer>("invalid_named_key", key_);
insert_statement.bind<Text>("named_text", value_text_);
insert_statement.bind<Uuid>("named_uuid", value_uuid_);
insert_statement.bind<Blob>("named_blob", value_blob_);
insert_statement.bind<List<Float> >("named_list_floats", value_list_floats_);
EXPECT_EQ(CASS_ERROR_SERVER_INVALID_QUERY,
session_.execute(insert_statement, false).error_code());
}
/**
* Ensures invalid named parameters return an error when bound and executed using a prepared
* statement.
*
* @since 2.1.0-beta
* @jira_ticket CPP-263
* @cassandra_version 2.1.x
*/
CASSANDRA_INTEGRATION_TEST_F(NamedParametersTests, PreparedStatementInvalidName) {
CHECK_FAILURE;
CHECK_VERSION(2.1.0);
Statement insert_statement = create_insert_statement(true);
EXPECT_EQ(
CASS_ERROR_LIB_NAME_DOES_NOT_EXIST,
cass_statement_bind_int32_by_name(insert_statement.get(), "invalid_named_key", key_.value()));
}