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:
Peter Krempa 2024-09-27 12:56:34 +02:00
parent e5fae984b1
commit b74fed0173
3 changed files with 25 additions and 9 deletions

View File

@ -391,10 +391,12 @@ virTypedParamsCopy(virTypedParameterPtr *dst,
* @params: array of typed parameters
* @nparams: number of parameters in the @params array
* @name: name of the parameter to find
* @type: type of fields to filter (ignored if 0 is passed)
* @ret: pointer to the returned array
*
* 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
* pointing to the @params elements. I.e. callers must not use
@ -406,6 +408,7 @@ size_t
virTypedParamsFilter(virTypedParameterPtr params,
int nparams,
const char *name,
int type,
virTypedParameterPtr **ret)
{
size_t i;
@ -414,10 +417,14 @@ virTypedParamsFilter(virTypedParameterPtr params,
*ret = g_new0(virTypedParameterPtr, nparams);
for (i = 0; i < nparams; i++) {
if (STREQ(params[i].field, name)) {
(*ret)[n] = &params[i];
n++;
}
if (STRNEQ(params[i].field, name))
continue;
if (type != 0 &&
params[i].type != type)
continue;
(*ret)[n++] = &params[i];
}
return n;
@ -453,7 +460,7 @@ virTypedParamsGetStringList(virTypedParameterPtr params,
*values = NULL;
nfiltered = virTypedParamsFilter(params, nparams, name, &filtered);
nfiltered = virTypedParamsFilter(params, nparams, name, 0, &filtered);
if (nfiltered == 0)
return 0;

View File

@ -85,6 +85,7 @@ size_t
virTypedParamsFilter(virTypedParameterPtr params,
int nparams,
const char *name,
int type,
virTypedParameterPtr **ret)
G_GNUC_WARN_UNUSED_RESULT;

View File

@ -91,13 +91,14 @@ testTypedParamsFilter(const void *opaque G_GNUC_UNUSED)
{ .field = "bar", .type = VIR_TYPED_PARAM_UINT },
{ .field = "foo", .type = VIR_TYPED_PARAM_INT },
{ .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;
nfiltered = virTypedParamsFilter(params, G_N_ELEMENTS(params),
"foo", &filtered);
"foo", 0, &filtered);
if (nfiltered != 3)
goto cleanup;
@ -108,7 +109,7 @@ testTypedParamsFilter(const void *opaque G_GNUC_UNUSED)
VIR_FREE(filtered);
nfiltered = virTypedParamsFilter(params, G_N_ELEMENTS(params),
"bar", &filtered);
"bar", VIR_TYPED_PARAM_UINT, &filtered);
if (nfiltered != 2)
goto cleanup;
@ -117,6 +118,13 @@ testTypedParamsFilter(const void *opaque G_GNUC_UNUSED)
if (filtered[i] != &params[i * 2])
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;
cleanup: