Mercurial > dovecot > core-2.2
changeset 20270:bd3ac2e8e8a5
dict-sql: Improve error message for invalid value fields.
It'll now show which map's pattern matched, making it easier to find
from the config file.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Thu, 02 Jun 2016 16:06:08 +0300 |
parents | 53ba0bd3d5a7 |
children | 55e8d679fa2b |
files | src/lib-dict/dict-sql.c |
diffstat | 1 files changed, 18 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-dict/dict-sql.c Mon May 23 17:47:50 2016 +0300 +++ b/src/lib-dict/dict-sql.c Thu Jun 02 16:06:08 2016 +0300 @@ -214,6 +214,7 @@ static int sql_dict_value_escape(string_t *str, struct sql_dict *dict, + const struct dict_sql_map *map, enum dict_sql_type value_type, const char *field_name, const char *value, const char *value_suffix, const char **error_r) @@ -229,8 +230,8 @@ case DICT_SQL_TYPE_UINT: if (value_suffix[0] != '\0' || str_to_uint(value, &num) < 0) { *error_r = t_strdup_printf( - "field %s value isn't unsigned integer: %s%s", - field_name, value, value_suffix); + "%s field's value isn't unsigned integer: %s%s (in pattern: %s)", + field_name, value, value_suffix, map->pattern); return -1; } str_printfa(str, "%u", num); @@ -243,8 +244,8 @@ if (hex_to_binary(value, buf) < 0) { /* we shouldn't get untrusted input here. it's also a bit annoying to handle this error. */ - *error_r = t_strdup_printf("field %s value isn't hexblob: %s", - field_name, value); + *error_r = t_strdup_printf("%s field's value isn't hexblob: %s (in pattern: %s)", + field_name, value, map->pattern); return -1; } str_append(buf, value_suffix); @@ -254,11 +255,12 @@ static int sql_dict_field_escape_value(string_t *str, struct sql_dict *dict, + const struct dict_sql_map *map, const struct dict_sql_field *field, const char *value, const char *value_suffix, const char **error_r) { - return sql_dict_value_escape(str, dict, field->value_type, + return sql_dict_value_escape(str, dict, map, field->value_type, field->name, value, value_suffix, error_r); } @@ -290,7 +292,7 @@ if (i > 0) str_append(query, " AND"); str_printfa(query, " %s = ", sql_fields[i].name); - if (sql_dict_field_escape_value(query, dict, &sql_fields[i], + if (sql_dict_field_escape_value(query, dict, map, &sql_fields[i], values[i], "", error_r) < 0) return -1; } @@ -302,11 +304,11 @@ str_append(query, " AND"); if (i < count2) { str_printfa(query, " %s LIKE ", sql_fields[i].name); - if (sql_dict_field_escape_value(query, dict, &sql_fields[i], + if (sql_dict_field_escape_value(query, dict, map, &sql_fields[i], values[i], "/%", error_r) < 0) return -1; str_printfa(query, " AND %s NOT LIKE ", sql_fields[i].name); - if (sql_dict_field_escape_value(query, dict, &sql_fields[i], + if (sql_dict_field_escape_value(query, dict, map, &sql_fields[i], values[i], "/%/%", error_r) < 0) return -1; } else { @@ -321,7 +323,7 @@ str_append(query, " AND"); str_printfa(query, " %s LIKE ", sql_fields[i].name); - if (sql_dict_field_escape_value(query, dict, &sql_fields[i], + if (sql_dict_field_escape_value(query, dict, map, &sql_fields[i], values[i], "/%", error_r) < 0) return -1; } @@ -908,8 +910,9 @@ else { 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) + if (sql_dict_value_escape(suffix, dict, fields[i].map, + value_type, "value", fields[i].value, + "", error_r) < 0) return -1; } } @@ -926,7 +929,7 @@ for (i = 0; i < count; i++) { str_printfa(prefix, ",%s", sql_fields[i].name); str_append_c(suffix, ','); - if (sql_dict_field_escape_value(suffix, dict, &sql_fields[i], + if (sql_dict_field_escape_value(suffix, dict, fields[0].map, &sql_fields[i], extra_values[i], "", error_r) < 0) return -1; } @@ -951,8 +954,9 @@ } else { 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) + if (sql_dict_value_escape(prefix, dict, fields[i].map, + value_type, "value", fields[i].value, + "", error_r) < 0) return -1; } }