From: Timo Sirainen Date: Mon, 28 Feb 2022 21:42:50 +0000 (-0500) Subject: dict-sql: Add "double" value type X-Git-Tag: 2.4.0~4285 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a5afc79a883f68efee9d19df347696439764bf2c;p=thirdparty%2Fdovecot%2Fcore.git dict-sql: Add "double" value type --- diff --git a/src/lib-dict-backend/dict-sql-settings.c b/src/lib-dict-backend/dict-sql-settings.c index 0d44923423..f26e7fc35f 100644 --- a/src/lib-dict-backend/dict-sql-settings.c +++ b/src/lib-dict-backend/dict-sql-settings.c @@ -142,6 +142,8 @@ dict_sql_value_type_parse(const char *value_type, enum dict_sql_type *type_r) *type_r = DICT_SQL_TYPE_INT; else if (strcmp(value_type, "uint") == 0) *type_r = DICT_SQL_TYPE_UINT; + else if (strcmp(value_type, "double") == 0) + *type_r = DICT_SQL_TYPE_DOUBLE; else return FALSE; return TRUE; @@ -238,6 +240,11 @@ parse_setting(const char *key, const char *value, field->variable = p_strndup(ctx->pool, value + 7, value_len-7-1); field->sql_field.value_type = DICT_SQL_TYPE_UINT; + } else if (str_begins(value, "${double:") && + value[value_len-1] == '}') { + field->variable = p_strndup(ctx->pool, value + 9, + value_len-9-1); + field->sql_field.value_type = DICT_SQL_TYPE_DOUBLE; } else { field->variable = p_strdup(ctx->pool, value + 1); } diff --git a/src/lib-dict-backend/dict-sql-settings.h b/src/lib-dict-backend/dict-sql-settings.h index c9ee037d27..1d0821b472 100644 --- a/src/lib-dict-backend/dict-sql-settings.h +++ b/src/lib-dict-backend/dict-sql-settings.h @@ -5,6 +5,7 @@ enum dict_sql_type { DICT_SQL_TYPE_STRING = 0, DICT_SQL_TYPE_INT, DICT_SQL_TYPE_UINT, + DICT_SQL_TYPE_DOUBLE, DICT_SQL_TYPE_HEXBLOB }; diff --git a/src/lib-dict-backend/dict-sql.c b/src/lib-dict-backend/dict-sql.c index d9ce48acae..ccd54e3804 100644 --- a/src/lib-dict-backend/dict-sql.c +++ b/src/lib-dict-backend/dict-sql.c @@ -29,6 +29,7 @@ struct sql_dict_param { const char *value_str; int64_t value_int64; + double value_double; const void *value_binary; size_t value_binary_size; }; @@ -249,6 +250,9 @@ sql_dict_statement_bind(struct sql_statement *stmt, unsigned int column_idx, case DICT_SQL_TYPE_UINT: sql_statement_bind_int64(stmt, column_idx, param->value_int64); break; + case DICT_SQL_TYPE_DOUBLE: + sql_statement_bind_double(stmt, column_idx, param->value_double); + break; case DICT_SQL_TYPE_HEXBLOB: sql_statement_bind_binary(stmt, column_idx, param->value_binary, param->value_binary_size); @@ -317,6 +321,15 @@ sql_dict_value_get(const struct dict_sql_map *map, return -1; } return 0; + case DICT_SQL_TYPE_DOUBLE: + if (value_suffix[0] != '\0' || + str_to_double(value, ¶m->value_double) < 0) { + *error_r = t_strdup_printf( + "%s field's value isn't a double: %s%s (in pattern: %s)", + field_name, value, value_suffix, map->pattern); + return -1; + } + return 0; case DICT_SQL_TYPE_HEXBLOB: break; } @@ -482,6 +495,7 @@ sql_dict_result_unescape(enum dict_sql_type type, pool_t pool, case DICT_SQL_TYPE_STRING: case DICT_SQL_TYPE_INT: case DICT_SQL_TYPE_UINT: + case DICT_SQL_TYPE_DOUBLE: value = sql_result_get_field_value(result, result_idx); return value == NULL ? "" : p_strdup(pool, value); case DICT_SQL_TYPE_HEXBLOB: