const CassDataType *data_type;
CassValueType value_type;
- if (stmt->prep == NULL) {
- value_type = value >= -2147483648 && value <= 2147483647 ?
- CASS_VALUE_TYPE_INT : CASS_VALUE_TYPE_BIGINT;
- } else {
- /* prepared statements require exactly correct value type */
- data_type = cass_prepared_parameter_data_type(stmt->prep->prepared, column_idx);
- value_type = cass_data_type_type(data_type);
- }
+ i_assert(stmt->prep != NULL);
+
+ /* statements require exactly correct value type */
+ data_type = cass_prepared_parameter_data_type(stmt->prep->prepared, column_idx);
+ value_type = cass_data_type_type(data_type);
switch (value_type) {
case CASS_VALUE_TYPE_INT:
static struct sql_statement *
driver_cassandra_statement_init(struct sql_db *db ATTR_UNUSED,
- const char *query_template)
+ const char *query_template ATTR_UNUSED)
{
pool_t pool = pool_alloconly_create("cassandra sql statement", 1024);
struct cassandra_sql_statement *stmt =
p_new(pool, struct cassandra_sql_statement, 1);
-
- /* Count the number of parameters in the query. We'll assume that all
- the changing parameters are bound, so there shouldn't be any
- quoted strings with '?' in them. */
- const char *p = query_template;
- size_t param_count = 0;
- while ((p = strchr(p, '?')) != NULL) {
- param_count++;
- p++;
- }
-
stmt->stmt.pool = pool;
- stmt->cass_stmt = cass_statement_new(query_template, param_count);
return &stmt->stmt;
}
(struct cassandra_sql_statement *)_stmt;
if (stmt->cass_stmt != NULL)
cass_statement_bind_string(stmt->cass_stmt, column_idx, value);
- else {
+ else if (stmt->prep != NULL) {
struct cassandra_sql_arg *arg =
driver_cassandra_add_pending_arg(stmt, column_idx);
arg->value_str = p_strdup(_stmt->pool, value);
if (stmt->cass_stmt != NULL) {
cass_statement_bind_bytes(stmt->cass_stmt, column_idx,
value, value_size);
- } else {
+ } else if (stmt->prep != NULL) {
struct cassandra_sql_arg *arg =
driver_cassandra_add_pending_arg(stmt, column_idx);
arg->value_binary = p_memdup(_stmt->pool, value, value_size);
if (stmt->cass_stmt != NULL)
driver_cassandra_bind_int(stmt, column_idx, value);
- else {
+ else if (stmt->prep != NULL) {
struct cassandra_sql_arg *arg =
driver_cassandra_add_pending_arg(stmt, column_idx);
arg->value_int64 = value;
struct cassandra_sql_statement *stmt =
(struct cassandra_sql_statement *)_stmt;
struct cassandra_db *db = (struct cassandra_db *)_stmt->db;
+ const char *query = sql_statement_get_query(_stmt);
- stmt->result = driver_cassandra_query_init(db, sql_statement_get_query(_stmt),
+ stmt->result = driver_cassandra_query_init(db, query,
CASSANDRA_QUERY_TYPE_READ,
callback, context);
- if (stmt->cass_stmt == NULL) {
+ if (stmt->cass_stmt != NULL) {
+ stmt->result->statement = stmt->cass_stmt;
+ } else if (stmt->prep != NULL) {
/* wait for prepare to finish */
+ return;
} else {
- stmt->result->statement = stmt->cass_stmt;
- (void)driver_cassandra_send_query(stmt->result);
- pool_unref(&_stmt->pool);
+ stmt->result->statement = cass_statement_new(query, 0);
+ if (stmt->pending_timestamp != 0) {
+ cass_statement_set_timestamp(stmt->result->statement,
+ stmt->pending_timestamp);
+ }
}
+ (void)driver_cassandra_send_query(stmt->result);
+ pool_unref(&_stmt->pool);
}
static struct sql_result *
transaction_set_failed(ctx, "Multiple changes in transaction not supported");
return;
}
- ctx->stmt = stmt;
+ if (stmt->prep != NULL)
+ ctx->stmt = stmt;
+ else
+ ctx->query = i_strdup(sql_statement_get_query(_stmt));
}
const struct sql_db driver_cassandra_db = {