]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dict-sql: Add "double" value type
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 28 Feb 2022 21:42:50 +0000 (16:42 -0500)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Fri, 4 Mar 2022 06:57:51 +0000 (06:57 +0000)
src/lib-dict-backend/dict-sql-settings.c
src/lib-dict-backend/dict-sql-settings.h
src/lib-dict-backend/dict-sql.c

index 0d449234234a0b3299cd2ffa6b2d4252f5106505..f26e7fc35f1fbb528ff23a36ea797ab9176a066e 100644 (file)
@@ -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);
                }
index c9ee037d277f2ecfb0cb833eba449594298e8ff0..1d0821b4721a5d1d9a2bb0de08d49d349c33e374 100644 (file)
@@ -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
 };
 
index d9ce48acae78f284eb33bbab640d095ec5632dca..ccd54e38046d22323eebb964df68f636e88e2e0f 100644 (file)
@@ -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, &param->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: