Mercurial > dovecot > core-2.2
changeset 22520:124286dedf19
dict-sql: Add signed "int" type
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Tue, 15 Aug 2017 15:37:01 +0300 |
parents | 5a08febe285f |
children | 6be650aee0b5 |
files | src/lib-dict/dict-sql-settings.c src/lib-dict/dict-sql-settings.h src/lib-dict/dict-sql.c |
diffstat | 3 files changed, 19 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-dict/dict-sql-settings.c Tue Aug 15 14:55:48 2017 +0300 +++ b/src/lib-dict/dict-sql-settings.c Tue Aug 15 15:37:01 2017 +0300 @@ -138,6 +138,8 @@ *type_r = DICT_SQL_TYPE_STRING; else if (strcmp(value_type, "hexblob") == 0) *type_r = DICT_SQL_TYPE_HEXBLOB; + else if (strcmp(value_type, "int") == 0) + *type_r = DICT_SQL_TYPE_INT; else if (strcmp(value_type, "uint") == 0) *type_r = DICT_SQL_TYPE_UINT; else @@ -226,6 +228,11 @@ field->variable = p_strndup(ctx->pool, value + 10, value_len-10-1); field->sql_field.value_type = DICT_SQL_TYPE_HEXBLOB; + } else if (strncmp(value, "${int:", 6) == 0 && + value[value_len-1] == '}') { + field->variable = p_strndup(ctx->pool, value + 6, + value_len-6-1); + field->sql_field.value_type = DICT_SQL_TYPE_INT; } else if (strncmp(value, "${uint:", 7) == 0 && value[value_len-1] == '}') { field->variable = p_strndup(ctx->pool, value + 7,
--- a/src/lib-dict/dict-sql-settings.h Tue Aug 15 14:55:48 2017 +0300 +++ b/src/lib-dict/dict-sql-settings.h Tue Aug 15 15:37:01 2017 +0300 @@ -3,6 +3,7 @@ enum dict_sql_type { DICT_SQL_TYPE_STRING = 0, + DICT_SQL_TYPE_INT, DICT_SQL_TYPE_UINT, DICT_SQL_TYPE_HEXBLOB };
--- a/src/lib-dict/dict-sql.c Tue Aug 15 14:55:48 2017 +0300 +++ b/src/lib-dict/dict-sql.c Tue Aug 15 15:37:01 2017 +0300 @@ -228,6 +228,7 @@ const char **error_r) { buffer_t *buf; + int64_t snum; uint64_t num; switch (value_type) { @@ -235,6 +236,15 @@ str_printfa(str, "'%s%s'", sql_escape_string(dict->db, value), value_suffix); return 0; + case DICT_SQL_TYPE_INT: + if (value_suffix[0] != '\0' || str_to_int64(value, &snum) < 0) { + *error_r = t_strdup_printf( + "%s field's value isn't 64bit signed integer: %s%s (in pattern: %s)", + field_name, value, value_suffix, map->pattern); + return -1; + } + str_printfa(str, "%"PRId64, snum); + return 0; case DICT_SQL_TYPE_UINT: if (value_suffix[0] != '\0' || str_to_uint64(value, &num) < 0) { *error_r = t_strdup_printf( @@ -382,6 +392,7 @@ switch (type) { case DICT_SQL_TYPE_STRING: + case DICT_SQL_TYPE_INT: case DICT_SQL_TYPE_UINT: return p_strdup(pool, sql_result_get_field_value(result, result_idx)); case DICT_SQL_TYPE_HEXBLOB: