]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dict-sql: Add support for UUID type
authorAki Tuomi <aki.tuomi@open-xchange.com>
Thu, 20 Apr 2023 13:08:10 +0000 (13:08 +0000)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Tue, 2 May 2023 09:55:12 +0000 (09:55 +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 7ca0373e1c74d12c2ffff0963abc93b3a8a63ea7..71e2f101e382ca7761920e08e84cc375609d580a 100644 (file)
@@ -145,6 +145,8 @@ dict_sql_value_type_parse(const char *value_type, enum dict_sql_type *type_r)
                *type_r = DICT_SQL_TYPE_UINT;
        else if (strcmp(value_type, "double") == 0)
                *type_r = DICT_SQL_TYPE_DOUBLE;
+       else if (strcmp(value_type, "uuid") == 0)
+               *type_r = DICT_SQL_TYPE_UUID;
        else
                return FALSE;
        return TRUE;
@@ -177,7 +179,7 @@ static const char *dict_sql_map_finish(struct setting_parser_ctx *ctx)
                        return "Number of fields in value_fields doesn't match value_type";
                for (i = 0; i < ctx->cur_map.values_count; i++) {
                        if (!dict_sql_value_type_parse(types[i], &value_types[i]))
-                               return "Invalid value in value_type";
+                               return t_strdup_printf("Invalid value %s in value_type", types[i]);
                }
        } else {
                for (i = 0; i < ctx->cur_map.values_count; i++) {
@@ -241,6 +243,9 @@ parse_setting(const char *key, const char *value,
                } else if (str_begins(value, "${double:", &arg) && *last == '}') {
                        field->variable = p_strdup_until(ctx->pool, arg, last);
                        field->sql_field.value_type = DICT_SQL_TYPE_DOUBLE;
+               } else if (str_begins(value, "${uuid:", &arg) && *last == '}') {
+                       field->variable = p_strdup_until(ctx->pool, arg, last);
+                       field->sql_field.value_type = DICT_SQL_TYPE_UUID;
                } else {
                        field->variable = p_strdup(ctx->pool, value + 1);
                }
index 04b1b0f718a7e76220cd174c3b4d3b10ae9854c0..98437166ec8fcbe262a836962f197e59b8a47ef1 100644 (file)
@@ -6,7 +6,8 @@ enum dict_sql_type {
        DICT_SQL_TYPE_INT,
        DICT_SQL_TYPE_UINT,
        DICT_SQL_TYPE_DOUBLE,
-       DICT_SQL_TYPE_HEXBLOB
+       DICT_SQL_TYPE_HEXBLOB,
+       DICT_SQL_TYPE_UUID,
 };
 
 struct dict_sql_field {
index 052d36b025c74a932220e61b939721a5f0ef049e..94062a2cd2a2f20a7a7de759d475e03f27b6954a 100644 (file)
@@ -33,6 +33,7 @@ struct sql_dict_param {
        double value_double;
        const void *value_binary;
        size_t value_binary_size;
+       guid_128_t value_uuid;
 };
 ARRAY_DEFINE_TYPE(sql_dict_param, struct sql_dict_param);
 
@@ -259,6 +260,9 @@ sql_dict_statement_bind(struct sql_statement *stmt, unsigned int column_idx,
                sql_statement_bind_binary(stmt, column_idx, param->value_binary,
                                          param->value_binary_size);
                break;
+       case DICT_SQL_TYPE_UUID:
+               sql_statement_bind_uuid(stmt, column_idx, param->value_uuid);
+               break;
        }
 }
 
@@ -332,6 +336,15 @@ sql_dict_value_get(const struct dict_sql_map *map,
                        return -1;
                }
                return 0;
+       case DICT_SQL_TYPE_UUID:
+               if (value_suffix[0] != '\0' ||
+                   guid_128_from_uuid_string(value, param->value_uuid) < 0) {
+                       *error_r = t_strdup_printf(
+                               "%s field's value isn't an uuid: %s%s (in pattern: %s)",
+                               field_name, value, value_suffix, map->pattern);
+                       return -1;
+               }
+               return 0;
        case DICT_SQL_TYPE_HEXBLOB:
                break;
        }
@@ -494,6 +507,7 @@ sql_dict_result_unescape(enum dict_sql_type type, pool_t pool,
        const unsigned char *data;
        size_t size;
        const char *value;
+       guid_128_t guid;
        string_t *str;
 
        switch (type) {
@@ -503,6 +517,12 @@ sql_dict_result_unescape(enum dict_sql_type type, pool_t pool,
        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_UUID:
+               value = sql_result_get_field_value(result, result_idx);
+               if (value == NULL)
+                       return "";
+               guid_128_from_uuid_string(value, guid);
+               return guid_128_to_uuid_string(guid, FORMAT_RECORD);
        case DICT_SQL_TYPE_HEXBLOB:
                break;
        }