1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-30 17:18:21 +03:00

libdm: report: fix field width calculation when using dm_report_column_headings

This fixes commit 0ba5f4b8e9 which moved
field recalculation (field width and sort position) from
dm_report_object to dm_report_output but it didn't handle the case when
dm_report_column_headings was used separately to report headings (before
dm_report_outpout call) and hence we ended up with intial widths for
fields in the headings.

If we're using dm_report_column_headings, we need to recalculate
fields if we haven't done so yet, the same way as we do in
dm_report_output.
This commit is contained in:
Peter Rajnoha 2016-06-27 14:27:43 +02:00 committed by Alasdair G Kergon
parent 1b11f09d2a
commit 3985b12a2d

View File

@ -25,7 +25,8 @@
*/
#define RH_SORT_REQUIRED 0x00000100
#define RH_HEADINGS_PRINTED 0x00000200
#define RH_ALREADY_REPORTED 0x00000400
#define RH_FIELD_CALC_NEEDED 0x00000400
#define RH_ALREADY_REPORTED 0x00000800
struct selection {
struct dm_pool *mem;
@ -1282,6 +1283,8 @@ struct dm_report *dm_report_init(uint32_t *report_types,
if (output_flags & DM_REPORT_OUTPUT_BUFFERED)
rh->flags |= RH_SORT_REQUIRED;
rh->flags |= RH_FIELD_CALC_NEEDED;
dm_list_init(&rh->field_props);
dm_list_init(&rh->rows);
@ -4032,6 +4035,7 @@ static void _reset_field_props(struct dm_report *rh)
struct field_properties *fp;
dm_list_iterate_items(fp, &rh->field_props)
fp->width = fp->initial_width;
rh->flags |= RH_FIELD_CALC_NEEDED;
}
int dm_report_set_selection(struct dm_report *rh, const char *selection)
@ -4188,11 +4192,45 @@ static int _report_headings(struct dm_report *rh)
return 0;
}
static int _should_display_row(struct row *row)
{
return row->field_sel_status || row->selected;
}
static void _recalculate_fields(struct dm_report *rh)
{
struct row *row;
struct dm_report_field *field;
size_t len;
dm_list_iterate_items(row, &rh->rows) {
dm_list_iterate_items(field, &row->fields) {
if ((rh->flags & RH_SORT_REQUIRED) &&
(field->props->flags & FLD_SORT_KEY)) {
(*row->sort_fields)[field->props->sort_posn] = field;
}
if (_should_display_row(row)) {
len = (int) strlen(field->report_string);
if ((len > field->props->width))
field->props->width = len;
}
}
}
rh->flags &= ~RH_FIELD_CALC_NEEDED;
}
int dm_report_column_headings(struct dm_report *rh)
{
/* Columns-as-rows does not use _report_headings. */
if (rh->flags & DM_REPORT_OUTPUT_COLUMNS_AS_ROWS)
return 1;
if (rh->flags & RH_FIELD_CALC_NEEDED)
_recalculate_fields(rh);
return _report_headings(rh);
}
@ -4246,11 +4284,6 @@ static int _row_compare(const void *a, const void *b)
return 0; /* Identical */
}
static int _should_display_row(struct row *row)
{
return row->field_sel_status || row->selected;
}
static int _sort_rows(struct dm_report *rh)
{
struct row *(*rows)[];
@ -4701,9 +4734,6 @@ static int _print_basic_report_header(struct dm_report *rh)
int dm_report_output(struct dm_report *rh)
{
struct row *row;
struct dm_report_field *field;
size_t len;
int r = 0;
if (_is_json_report(rh) &&
@ -4715,21 +4745,8 @@ int dm_report_output(struct dm_report *rh)
goto out;
}
dm_list_iterate_items(row, &rh->rows) {
dm_list_iterate_items(field, &row->fields) {
if ((rh->flags & RH_SORT_REQUIRED) &&
(field->props->flags & FLD_SORT_KEY)) {
(*row->sort_fields)[field->props->sort_posn] = field;
}
if (_should_display_row(row)) {
len = (int) strlen(field->report_string);
if ((len > field->props->width))
field->props->width = len;
}
}
}
if (rh->flags & RH_FIELD_CALC_NEEDED)
_recalculate_fields(rh);
if ((rh->flags & RH_SORT_REQUIRED))
_sort_rows(rh);