1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

report: select: use _check_report_selection in dm_report_object to report only objects that satisfy the report selection

This is rebased and edited version of the original design and
patch proposed by Jun'ichi Nomura:
  http://www.redhat.com/archives/dm-devel/2007-April/msg00025.html

This activates the actual selection process in dm_report_object.
This commit is contained in:
Peter Rajnoha 2014-05-29 09:38:36 +02:00
parent d33280a978
commit bc6458de87

View File

@ -953,19 +953,20 @@ static int _check_report_selection(struct dm_report *rh, struct dm_list *fields)
int dm_report_object(struct dm_report *rh, void *object) int dm_report_object(struct dm_report *rh, void *object)
{ {
struct field_properties *fp; struct field_properties *fp;
struct row *row; struct row *row = NULL;
struct dm_report_field *field; struct dm_report_field *field;
void *data = NULL; void *data = NULL;
int len; int len;
int r = 0;
if (!rh) { if (!rh) {
log_error(INTERNAL_ERROR "dm_report handler is NULL."); log_error(INTERNAL_ERROR "dm_report handler is NULL.");
return 0; goto out;
} }
if (!(row = dm_pool_zalloc(rh->mem, sizeof(*row)))) { if (!(row = dm_pool_zalloc(rh->mem, sizeof(*row)))) {
log_error("dm_report_object: struct row allocation failed"); log_error("dm_report_object: struct row allocation failed");
return 0; goto out;
} }
row->rh = rh; row->rh = rh;
@ -976,25 +977,25 @@ int dm_report_object(struct dm_report *rh, void *object)
rh->keys_count))) { rh->keys_count))) {
log_error("dm_report_object: " log_error("dm_report_object: "
"row sort value structure allocation failed"); "row sort value structure allocation failed");
return 0; goto out;
} }
dm_list_init(&row->fields); dm_list_init(&row->fields);
dm_list_add(&rh->rows, &row->list);
/* For each field to be displayed, call its report_fn */ /* For each field to be displayed, call its report_fn */
dm_list_iterate_items(fp, &rh->field_props) { dm_list_iterate_items(fp, &rh->field_props) {
if (!(field = dm_pool_zalloc(rh->mem, sizeof(*field)))) { if (!(field = dm_pool_zalloc(rh->mem, sizeof(*field)))) {
log_error("dm_report_object: " log_error("dm_report_object: "
"struct dm_report_field allocation failed"); "struct dm_report_field allocation failed");
return 0; goto out;
} }
field->props = fp; field->props = fp;
if (!(data = _report_get_field_data(rh, fp, object))) { if (!(data = _report_get_field_data(rh, fp, object))) {
log_error("dm_report_object: no data for field %s", log_error("dm_report_object: "
"no data assigned to field %s",
rh->fields[fp->field_num].id); rh->fields[fp->field_num].id);
return 0; goto out;
} }
if (!rh->fields[fp->field_num].report_fn(rh, rh->mem, if (!rh->fields[fp->field_num].report_fn(rh, rh->mem,
@ -1003,24 +1004,38 @@ int dm_report_object(struct dm_report *rh, void *object)
log_error("dm_report_object: " log_error("dm_report_object: "
"report function failed for field %s", "report function failed for field %s",
rh->fields[fp->field_num].id); rh->fields[fp->field_num].id);
return 0; goto out;
} }
dm_list_add(&row->fields, &field->list);
}
if (!_check_report_selection(rh, &row->fields)) {
r = 1;
goto out;
}
dm_list_add(&rh->rows, &row->list);
dm_list_iterate_items(field, &row->fields) {
len = (int) strlen(field->report_string); len = (int) strlen(field->report_string);
if (len > field->props->width) if ((len > field->props->width))
field->props->width = len; field->props->width = len;
if ((rh->flags & RH_SORT_REQUIRED) && if ((rh->flags & RH_SORT_REQUIRED) &&
(field->props->flags & FLD_SORT_KEY)) { (field->props->flags & FLD_SORT_KEY)) {
(*row->sort_fields)[field->props->sort_posn] = field; (*row->sort_fields)[field->props->sort_posn] = field;
} }
dm_list_add(&row->fields, &field->list);
} }
if (!(rh->flags & DM_REPORT_OUTPUT_BUFFERED)) if (!(rh->flags & DM_REPORT_OUTPUT_BUFFERED))
return dm_report_output(rh); return dm_report_output(rh);
return 1; r = 1;
out:
if (!r)
dm_pool_free(rh->mem, row);
return r;
} }
/* /*