From: Timo Sirainen Date: Tue, 13 Oct 2015 17:40:38 +0000 (+0300) Subject: dict-sql: Added support for value_type field, which deprecates value_hexblob. X-Git-Tag: 2.2.20.rc1~154 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b0c9213ef64937fb5eb2deac6a8dfed024e1393a;p=thirdparty%2Fdovecot%2Fcore.git dict-sql: Added support for value_type field, which deprecates value_hexblob. value_type=string|hexblob|uint are supported now. --- diff --git a/src/lib-dict/dict-sql-settings.c b/src/lib-dict/dict-sql-settings.c index f0d871865c..81da9a9314 100644 --- a/src/lib-dict/dict-sql-settings.c +++ b/src/lib-dict/dict-sql-settings.c @@ -36,6 +36,7 @@ static const struct setting_def dict_sql_map_setting_defs[] = { DEF_STR(table), DEF_STR(username_field), DEF_STR(value_field), + DEF_STR(value_type), DEF_BOOL(value_hexblob), { 0, NULL, 0 } @@ -129,6 +130,12 @@ static const char *dict_sql_map_finish(struct setting_parser_ctx *ctx) return "Missing setting: table"; if (ctx->cur_map.value_field == NULL) return "Missing setting: value_field"; + if (ctx->cur_map.value_type != NULL) { + if (strcmp(ctx->cur_map.value_type, "string") != 0 && + strcmp(ctx->cur_map.value_type, "hexblob") != 0 && + strcmp(ctx->cur_map.value_type, "uint") != 0) + return "Invalid value in value_type"; + } if (ctx->cur_map.username_field == NULL) { /* not all queries require this */ diff --git a/src/lib-dict/dict-sql-settings.h b/src/lib-dict/dict-sql-settings.h index c5d0f341a8..62aff2ec17 100644 --- a/src/lib-dict/dict-sql-settings.h +++ b/src/lib-dict/dict-sql-settings.h @@ -19,6 +19,7 @@ struct dict_sql_map { const char *table; const char *username_field; const char *value_field; + const char *value_type; bool value_hexblob; ARRAY(struct dict_sql_field) sql_fields; diff --git a/src/lib-dict/dict-sql.c b/src/lib-dict/dict-sql.c index d1f2d6b92f..1257562d11 100644 --- a/src/lib-dict/dict-sql.c +++ b/src/lib-dict/dict-sql.c @@ -380,13 +380,26 @@ sql_dict_result_unescape(enum dict_sql_type type, pool_t pool, return str_c(str); } +static enum dict_sql_type +sql_dict_map_type(const struct dict_sql_map *map) +{ + if (map->value_type != NULL) { + if (strcmp(map->value_type, "string") == 0) + return DICT_SQL_TYPE_STRING; + if (strcmp(map->value_type, "hexblob") == 0) + return DICT_SQL_TYPE_HEXBLOB; + if (strcmp(map->value_type, "uint") == 0) + return DICT_SQL_TYPE_UINT; + i_unreached(); /* should have checked already at parsing */ + } + return map->value_hexblob ? DICT_SQL_TYPE_HEXBLOB : DICT_SQL_TYPE_STRING; +} + static const char * sql_dict_result_unescape_value(const struct dict_sql_map *map, pool_t pool, struct sql_result *result) { - enum dict_sql_type value_type = map->value_hexblob ? - DICT_SQL_TYPE_HEXBLOB : DICT_SQL_TYPE_STRING; - return sql_dict_result_unescape(value_type, pool, result, 0); + return sql_dict_result_unescape(sql_dict_map_type(map), pool, result, 0); } static const char * @@ -876,8 +889,8 @@ static int sql_dict_set_query(const struct dict_sql_build_query *build, if (build->inc) str_append(suffix, fields[i].value); else { - enum dict_sql_type value_type = fields[i].map->value_hexblob ? - DICT_SQL_TYPE_HEXBLOB : DICT_SQL_TYPE_STRING; + enum dict_sql_type value_type = + sql_dict_map_type(fields[i].map); if (sql_dict_value_escape(suffix, dict, value_type, "value", fields[i].value, "", error_r) < 0) return -1; @@ -919,8 +932,8 @@ static int sql_dict_set_query(const struct dict_sql_build_query *build, fields[i].map->value_field, fields[i].value); } else { - enum dict_sql_type value_type = fields[i].map->value_hexblob ? - DICT_SQL_TYPE_HEXBLOB : DICT_SQL_TYPE_STRING; + enum dict_sql_type value_type = + sql_dict_map_type(fields[i].map); if (sql_dict_value_escape(prefix, dict, value_type, "value", fields[i].value, "", error_r) < 0) return -1;