On 16.06.2015 00:42, Pavel Boldin wrote:
> Add multikey API:
>
> * virTypedParamsFilter that filters all the parameters with specified name.
> * virTypedParamsGetAllStrings that returns a list with all the values for
>specified name and string type.
>
> Signed-off-by: Pavel Boldin
> Signed-off-by: Michal Privoznik
> ---
> include/libvirt/libvirt-host.h | 5 ++
> src/libvirt_public.syms| 5 ++
> src/util/virtypedparam.c | 102
> +
> src/util/virtypedparam.h | 9
> tests/Makefile.am | 2 +-
> tests/virtypedparamtest.c | 100
> 6 files changed, 222 insertions(+), 1 deletion(-)
>
> diff --git a/include/libvirt/libvirt-host.h b/include/libvirt/libvirt-host.h
> index 070550b..8222cfb 100644
> --- a/include/libvirt/libvirt-host.h
> +++ b/include/libvirt/libvirt-host.h
> @@ -284,6 +284,11 @@ virTypedParamsGetString (virTypedParameterPtr params,
> const char *name,
> const char **value);
> int
> +virTypedParamsGetAllStrings(virTypedParameterPtr params,
> + int nparams,
> + const char *name,
> + const char ***values);
> +int
> virTypedParamsAddInt(virTypedParameterPtr *params,
> int *nparams,
> int *maxparams,
> diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
> index 716dd2f..0a1feea 100644
> --- a/src/libvirt_public.syms
> +++ b/src/libvirt_public.syms
> @@ -715,4 +715,9 @@ LIBVIRT_1.2.16 {
> virDomainSetUserPassword;
> } LIBVIRT_1.2.15;
>
> +LIBVIRT_1.3.0 {
> +global:
> +virTypedParamsGetAllStrings;
> +} LIBVIRT_1.2.16;
> +
I don't think this symbol needs to be exported.
> # define new API here using predicted next version number
> diff --git a/src/util/virtypedparam.c b/src/util/virtypedparam.c
> index 6f608d6..a12006c 100644
> --- a/src/util/virtypedparam.c
> +++ b/src/util/virtypedparam.c
> @@ -482,6 +482,51 @@ virTypedParamsGet(virTypedParameterPtr params,
> }
>
>
> +/**
> + * virTypedParamsFilter:
> + * @params: array of typed parameters
> + * @nparams: number of parameters in the @params array
> + * @name: name of the parameter to find
> + * @ret: pointer to the returned array
> + *
> + * Filters @params retaining only the parameters named @name in the
> + * resulting array @ret. Caller should free the @ret array but not
> + * the items since they are pointing to the @params elements.
> + *
> + * Returns amount of elements in @ret on success, -1 on error.
> + */
> +int
> +virTypedParamsFilter(virTypedParameterPtr params,
> + int nparams,
> + const char *name,
> + virTypedParameterPtr **ret)
> +{
> +size_t i, alloc = 0, n = 0;
> +
> +virCheckNonNullArgGoto(params, error);
> +virCheckNonNullArgGoto(name, error);
> +virCheckNonNullArgGoto(ret, error);
> +
> +*ret = NULL;
> +
> +for (i = 0; i < nparams; i++) {
> +if (STREQ(params[i].field, name)) {
> +if (VIR_RESIZE_N(*ret, alloc, n, 1) < 0)
> +goto error;
> +
> +(*ret)[n] = ¶ms[i];
> +
> +n++;
> +}
> +}
> +
> +return n;
> +
> + error:
> +return -1;
> +}
> +
> +
> #define VIR_TYPED_PARAM_CHECK_TYPE(check_type) \
> do { if (param->type != check_type) { \
> virReportError(VIR_ERR_INVALID_ARG, \
> @@ -750,6 +795,63 @@ virTypedParamsGetString(virTypedParameterPtr params,
>
>
> /**
> + * virTypedParamsGetAllStrings:
> + * @params: array of typed parameters
> + * @nparams: number of parameters in the @params array
> + * @name: name of the parameter to find
> + * @values: array of returned values
> + *
> + * Finds all parameters with desired @name within @params and
> + * store their values into @values. The @values array is self
> + * allocated and its length is stored into @picked. When no
> + * longer needed, caller should free the returned array, but not
> + * the items since they are taken from @params array.
> + *
> + * Returns amount of strings in @values array on success,
> + * -1 otherwise.
> + */
> +int
> +virTypedParamsGetAllStrings(virTypedParameterPtr params,
> +int nparams,
> +const char *name,
> +const char ***values)
> +{
> +size_t i, n;
> +int nfiltered;
> +virTypedParameterPtr *filtered = NULL;
> +
> +virResetLastError();
> +
> +virCheckNonNullArgGoto(values, error);
> +*values = NULL;
> +
> +nfiltered = virTypedParamsFilter(params, nparams, name, &filtered);
> +
> +if (nfiltered < 0)
> +goto error;
> +
> +if (nfiltered &&
> +VIR_ALLOC_N(*values, nfiltered) < 0)
> +