mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 05:35:25 +00:00
virTypedParamsFilter: Introduce option to filter also by type
The only caller of this function is doing some additional filtering so it's useful if the filtering function was able to do so internally. Introduce a 'type' parameter which will optionally filter the results by type and extend the testsuite to cover this scenario. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
This commit is contained in:
parent
e5fae984b1
commit
b74fed0173
@ -391,10 +391,12 @@ virTypedParamsCopy(virTypedParameterPtr *dst,
|
|||||||
* @params: array of typed parameters
|
* @params: array of typed parameters
|
||||||
* @nparams: number of parameters in the @params array
|
* @nparams: number of parameters in the @params array
|
||||||
* @name: name of the parameter to find
|
* @name: name of the parameter to find
|
||||||
|
* @type: type of fields to filter (ignored if 0 is passed)
|
||||||
* @ret: pointer to the returned array
|
* @ret: pointer to the returned array
|
||||||
*
|
*
|
||||||
* Filters @params retaining only the parameters named @name in the
|
* Filters @params retaining only the parameters named @name in the
|
||||||
* resulting array @ret.
|
* resulting array @ret. If @type is non-zero it also filters out parameters
|
||||||
|
* whose type doesn't match @type.
|
||||||
*
|
*
|
||||||
* Important Caller should free the @ret array but not the items since they are
|
* Important Caller should free the @ret array but not the items since they are
|
||||||
* pointing to the @params elements. I.e. callers must not use
|
* pointing to the @params elements. I.e. callers must not use
|
||||||
@ -406,6 +408,7 @@ size_t
|
|||||||
virTypedParamsFilter(virTypedParameterPtr params,
|
virTypedParamsFilter(virTypedParameterPtr params,
|
||||||
int nparams,
|
int nparams,
|
||||||
const char *name,
|
const char *name,
|
||||||
|
int type,
|
||||||
virTypedParameterPtr **ret)
|
virTypedParameterPtr **ret)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
@ -414,10 +417,14 @@ virTypedParamsFilter(virTypedParameterPtr params,
|
|||||||
*ret = g_new0(virTypedParameterPtr, nparams);
|
*ret = g_new0(virTypedParameterPtr, nparams);
|
||||||
|
|
||||||
for (i = 0; i < nparams; i++) {
|
for (i = 0; i < nparams; i++) {
|
||||||
if (STREQ(params[i].field, name)) {
|
if (STRNEQ(params[i].field, name))
|
||||||
(*ret)[n] = ¶ms[i];
|
continue;
|
||||||
n++;
|
|
||||||
}
|
if (type != 0 &&
|
||||||
|
params[i].type != type)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
(*ret)[n++] = ¶ms[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
@ -453,7 +460,7 @@ virTypedParamsGetStringList(virTypedParameterPtr params,
|
|||||||
|
|
||||||
*values = NULL;
|
*values = NULL;
|
||||||
|
|
||||||
nfiltered = virTypedParamsFilter(params, nparams, name, &filtered);
|
nfiltered = virTypedParamsFilter(params, nparams, name, 0, &filtered);
|
||||||
|
|
||||||
if (nfiltered == 0)
|
if (nfiltered == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -85,6 +85,7 @@ size_t
|
|||||||
virTypedParamsFilter(virTypedParameterPtr params,
|
virTypedParamsFilter(virTypedParameterPtr params,
|
||||||
int nparams,
|
int nparams,
|
||||||
const char *name,
|
const char *name,
|
||||||
|
int type,
|
||||||
virTypedParameterPtr **ret)
|
virTypedParameterPtr **ret)
|
||||||
G_GNUC_WARN_UNUSED_RESULT;
|
G_GNUC_WARN_UNUSED_RESULT;
|
||||||
|
|
||||||
|
@ -91,13 +91,14 @@ testTypedParamsFilter(const void *opaque G_GNUC_UNUSED)
|
|||||||
{ .field = "bar", .type = VIR_TYPED_PARAM_UINT },
|
{ .field = "bar", .type = VIR_TYPED_PARAM_UINT },
|
||||||
{ .field = "foo", .type = VIR_TYPED_PARAM_INT },
|
{ .field = "foo", .type = VIR_TYPED_PARAM_INT },
|
||||||
{ .field = "foobar", .type = VIR_TYPED_PARAM_STRING },
|
{ .field = "foobar", .type = VIR_TYPED_PARAM_STRING },
|
||||||
{ .field = "foo", .type = VIR_TYPED_PARAM_INT }
|
{ .field = "foo", .type = VIR_TYPED_PARAM_INT },
|
||||||
|
{ .field = "foobar", .type = VIR_TYPED_PARAM_INT },
|
||||||
};
|
};
|
||||||
virTypedParameterPtr *filtered = NULL;
|
virTypedParameterPtr *filtered = NULL;
|
||||||
|
|
||||||
|
|
||||||
nfiltered = virTypedParamsFilter(params, G_N_ELEMENTS(params),
|
nfiltered = virTypedParamsFilter(params, G_N_ELEMENTS(params),
|
||||||
"foo", &filtered);
|
"foo", 0, &filtered);
|
||||||
if (nfiltered != 3)
|
if (nfiltered != 3)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -108,7 +109,7 @@ testTypedParamsFilter(const void *opaque G_GNUC_UNUSED)
|
|||||||
VIR_FREE(filtered);
|
VIR_FREE(filtered);
|
||||||
|
|
||||||
nfiltered = virTypedParamsFilter(params, G_N_ELEMENTS(params),
|
nfiltered = virTypedParamsFilter(params, G_N_ELEMENTS(params),
|
||||||
"bar", &filtered);
|
"bar", VIR_TYPED_PARAM_UINT, &filtered);
|
||||||
|
|
||||||
if (nfiltered != 2)
|
if (nfiltered != 2)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -117,6 +118,13 @@ testTypedParamsFilter(const void *opaque G_GNUC_UNUSED)
|
|||||||
if (filtered[i] != ¶ms[i * 2])
|
if (filtered[i] != ¶ms[i * 2])
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
VIR_FREE(filtered);
|
||||||
|
|
||||||
|
nfiltered = virTypedParamsFilter(params, G_N_ELEMENTS(params),
|
||||||
|
"foobar", VIR_TYPED_PARAM_STRING, &filtered);
|
||||||
|
|
||||||
|
if (nfiltered != 1)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
rv = 0;
|
rv = 0;
|
||||||
cleanup:
|
cleanup:
|
||||||
|
Loading…
Reference in New Issue
Block a user