From: Aki Tuomi Date: Thu, 20 Apr 2023 13:08:10 +0000 (+0000) Subject: dict-sql: Add support for UUID type X-Git-Tag: 2.4.0~2778 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9e46d634d493e9539b4da635138e7b3670b625f2;p=thirdparty%2Fdovecot%2Fcore.git dict-sql: Add support for UUID type --- diff --git a/src/lib-dict-backend/dict-sql-settings.c b/src/lib-dict-backend/dict-sql-settings.c index 7ca0373e1c..71e2f101e3 100644 --- a/src/lib-dict-backend/dict-sql-settings.c +++ b/src/lib-dict-backend/dict-sql-settings.c @@ -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); } diff --git a/src/lib-dict-backend/dict-sql-settings.h b/src/lib-dict-backend/dict-sql-settings.h index 04b1b0f718..98437166ec 100644 --- a/src/lib-dict-backend/dict-sql-settings.h +++ b/src/lib-dict-backend/dict-sql-settings.h @@ -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 { diff --git a/src/lib-dict-backend/dict-sql.c b/src/lib-dict-backend/dict-sql.c index 052d36b025..94062a2cd2 100644 --- a/src/lib-dict-backend/dict-sql.c +++ b/src/lib-dict-backend/dict-sql.c @@ -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; }