static int
sql_lookup_get_query(struct sql_dict *dict, const char *key,
- string_t *query, const struct dict_sql_map **map_r,
- ARRAY_TYPE(sql_dict_param) *params, const char **error_r)
+ const struct dict_sql_map **map_r,
+ struct sql_statement **stmt_r,
+ const char **error_r)
{
const struct dict_sql_map *map;
ARRAY_TYPE(const_string) values;
"sql dict lookup: Invalid/unmapped key: %s", key);
return -1;
}
+
+ string_t *query = t_str_new(256);
+ ARRAY_TYPE(sql_dict_param) params;
+ t_array_init(¶ms, 4);
str_printfa(query, "SELECT %s FROM %s",
map->value_field, map->table);
if (sql_dict_where_build(dict, map, &values, key[0],
SQL_DICT_RECURSE_NONE, query,
- params, &error) < 0) {
+ ¶ms, &error) < 0) {
*error_r = t_strdup_printf(
"sql dict lookup: Failed to lookup key %s: %s", key, error);
return -1;
}
+ *stmt_r = sql_dict_statement_init(dict->db, str_c(query), ¶ms);
return 0;
}
{
struct sql_dict *dict = (struct sql_dict *)_dict;
const struct dict_sql_map *map;
+ struct sql_statement *stmt;
struct sql_result *result = NULL;
- string_t *query = t_str_new(256);
- ARRAY_TYPE(sql_dict_param) params;
int ret;
*value_r = NULL;
- t_array_init(¶ms, 4);
- if (sql_lookup_get_query(dict, key, query, &map, ¶ms, error_r) < 0)
+ if (sql_lookup_get_query(dict, key, &map, &stmt, error_r) < 0)
return -1;
- struct sql_statement *stmt =
- sql_dict_statement_init(dict->db, str_c(query), ¶ms);
result = sql_statement_query_s(&stmt);
ret = sql_result_next_row(result);
if (ret < 0) {
struct sql_dict *dict = (struct sql_dict *)_dict;
const struct dict_sql_map *map;
struct sql_dict_lookup_context *ctx;
- string_t *query = t_str_new(256);
- ARRAY_TYPE(sql_dict_param) params;
+ struct sql_statement *stmt;
const char *error;
- t_array_init(¶ms, 4);
- if (sql_lookup_get_query(dict, key, query, &map, ¶ms, &error) < 0) {
+ if (sql_lookup_get_query(dict, key, &map, &stmt, &error) < 0) {
struct dict_lookup_result result;
i_zero(&result);
ctx->callback = callback;
ctx->context = context;
ctx->map = map;
- struct sql_statement *stmt =
- sql_dict_statement_init(dict->db, str_c(query), ¶ms);
sql_statement_query(&stmt, sql_dict_lookup_async_callback, ctx);
}
}
static int
sql_dict_iterate_build_next_query(struct sql_dict_iterate_context *ctx,
- string_t *query,
- ARRAY_TYPE(sql_dict_param) *params,
+ struct sql_statement **stmt_r,
const char **error_r)
{
struct sql_dict *dict = (struct sql_dict *)ctx->ctx.dict;
ctx->result = NULL;
}
+ string_t *query = t_str_new(256);
str_append(query, "SELECT ");
if ((ctx->flags & DICT_ITERATE_FLAG_NO_VALUE) == 0)
str_printfa(query, "%s,", map->value_field);
recurse_type = SQL_DICT_RECURSE_NONE;
else
recurse_type = SQL_DICT_RECURSE_ONE;
+
+ ARRAY_TYPE(sql_dict_param) params;
+ t_array_init(¶ms, 4);
if (sql_dict_where_build(dict, map, &values,
ctx->paths[ctx->path_idx][0],
- recurse_type, query, params, error_r) < 0)
+ recurse_type, query, ¶ms, error_r) < 0)
return -1;
if ((ctx->flags & DICT_ITERATE_FLAG_SORT_BY_KEY) != 0) {
(unsigned long long)(ctx->ctx.max_rows - ctx->ctx.row_count));
}
+ *stmt_r = sql_dict_statement_init(dict->db, str_c(query), ¶ms);
ctx->map = map;
return 1;
}
static int sql_dict_iterate_next_query(struct sql_dict_iterate_context *ctx)
{
- struct sql_dict *dict = (struct sql_dict *)ctx->ctx.dict;
- string_t *query = t_str_new(256);
- ARRAY_TYPE(sql_dict_param) params;
+ struct sql_statement *stmt;
const char *error;
unsigned int path_idx = ctx->path_idx;
int ret;
- t_array_init(¶ms, 4);
- ret = sql_dict_iterate_build_next_query(ctx, query, ¶ms, &error);
+ ret = sql_dict_iterate_build_next_query(ctx, &stmt, &error);
if (ret <= 0) {
/* this is expected error */
if (ret == 0)
return -1;
}
- struct sql_statement *stmt =
- sql_dict_statement_init(dict->db, str_c(query), ¶ms);
if ((ctx->flags & DICT_ITERATE_FLAG_ASYNC) == 0) {
ctx->result = sql_statement_query_s(&stmt);
} else {
char key1;
};
-static int sql_dict_set_query(const struct dict_sql_build_query *build,
- const char **query_r,
- ARRAY_TYPE(sql_dict_param) *params,
+static int sql_dict_set_query(struct sql_dict_transaction_context *ctx,
+ const struct dict_sql_build_query *build,
+ struct sql_statement **stmt_r,
const char **error_r)
{
struct sql_dict *dict = build->dict;
const struct dict_sql_build_query_field *fields;
const struct dict_sql_field *sql_fields;
+ ARRAY_TYPE(sql_dict_param) params;
const char *const *extra_values;
unsigned int i, field_count, count, count2;
string_t *prefix, *suffix;
fields = array_get(&build->fields, &field_count);
i_assert(field_count > 0);
+ t_array_init(¶ms, 4);
prefix = t_str_new(64);
suffix = t_str_new(256);
str_printfa(prefix, "INSERT INTO %s", fields[0].map->table);
str_append_c(suffix, '?');
if (sql_dict_value_get(fields[i].map,
value_type, "value", fields[i].value,
- "", params, error_r) < 0)
+ "", ¶ms, error_r) < 0)
return -1;
}
if (build->key1 == DICT_PATH_PRIVATE[0]) {
str_append(suffix, ",?");
if (sql_dict_field_get_value(fields[0].map, &sql_fields[i],
extra_values[i], "",
- params, error_r) < 0)
+ ¶ms, error_r) < 0)
return -1;
}
str_append_str(prefix, suffix);
str_append_c(prefix, ')');
if (!dict->has_on_duplicate_key) {
- *query_r = str_c(prefix);
+ *stmt_r = sql_dict_transaction_stmt_init(ctx, str_c(prefix), ¶ms);
return 0;
}
str_append_c(prefix, '?');
if (sql_dict_value_get(fields[i].map,
value_type, "value", fields[i].value,
- "", params, error_r) < 0)
+ "", ¶ms, error_r) < 0)
return -1;
}
- *query_r = str_c(prefix);
+ *stmt_r = sql_dict_transaction_stmt_init(ctx, str_c(prefix), ¶ms);
return 0;
}
(struct sql_dict_transaction_context *)_ctx;
struct sql_dict *dict = (struct sql_dict *)_ctx->dict;
const struct dict_sql_map *map;
+ struct sql_statement *stmt;
ARRAY_TYPE(const_string) values;
struct dict_sql_build_query build;
struct dict_sql_build_query_field field;
- ARRAY_TYPE(sql_dict_param) params;
- const char *query, *error;
+ const char *error;
if (ctx->error != NULL)
return;
build.extra_values = &values;
build.key1 = key[0];
- t_array_init(¶ms, 4);
- if (sql_dict_set_query(&build, &query, ¶ms, &error) < 0) {
+ if (sql_dict_set_query(ctx, &build, &stmt, &error) < 0) {
ctx->error = i_strdup_printf("dict-sql: Failed to set %s=%s: %s",
key, value, error);
} else {
- struct sql_statement *stmt =
- sql_dict_transaction_stmt_init(ctx, query, ¶ms);
sql_update_stmt(ctx->sql_ctx, &stmt);
}
}
} else {
struct dict_sql_build_query build;
struct dict_sql_build_query_field *field;
- ARRAY_TYPE(sql_dict_param) params;
- const char *query, *error;
+ struct sql_statement *stmt;
+ const char *error;
i_zero(&build);
build.dict = dict;
field->map = map;
field->value = value;
- t_array_init(¶ms, 4);
- if (sql_dict_set_query(&build, &query, ¶ms, &error) < 0) {
+ if (sql_dict_set_query(ctx, &build, &stmt, &error) < 0) {
ctx->error = i_strdup_printf(
"dict-sql: Failed to set %s: %s", key, error);
} else {
- struct sql_statement *stmt =
- sql_dict_transaction_stmt_init(ctx, query, ¶ms);
sql_update_stmt(ctx->sql_ctx, &stmt);
}
i_free_and_null(ctx->prev_set_value);