*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;
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++) {
} 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);
}
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);
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;
}
}
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;
}
const unsigned char *data;
size_t size;
const char *value;
+ guid_128_t guid;
string_t *str;
switch (type) {
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;
}