diff options
Diffstat (limited to 'src/backend/access/rmgrdesc/rmgrdesc_utils.c')
-rw-r--r-- | src/backend/access/rmgrdesc/rmgrdesc_utils.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/src/backend/access/rmgrdesc/rmgrdesc_utils.c b/src/backend/access/rmgrdesc/rmgrdesc_utils.c new file mode 100644 index 00000000000..180f64bf84b --- /dev/null +++ b/src/backend/access/rmgrdesc/rmgrdesc_utils.c @@ -0,0 +1,84 @@ +/*------------------------------------------------------------------------- + * + * rmgrdesc_utils.c + * Support functions for rmgrdesc routines + * + * Copyright (c) 2023, PostgreSQL Global Development Group + * + * + * IDENTIFICATION + * src/backend/access/rmgrdesc/rmgrdesc_utils.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "access/rmgrdesc_utils.h" +#include "storage/off.h" + +/* + * Guidelines for formatting desc functions: + * + * member1_name: member1_value, member2_name: member2_value + * + * If the value is a list, please use: + * + * member3_name: [ member3_list_value1, member3_list_value2 ] + * + * The first item appended to the string should not be prepended by any spaces + * or comma, however all subsequent appends to the string are responsible for + * prepending themselves with a comma followed by a space. + * + * Arrays should have a space between the opening square bracket and first + * element and between the last element and closing brace. + * + * Flags should be in ALL CAPS. + * + * For lists/arrays of items, the number of those items should be listed at + * the beginning with all of the other numbers. + * + * List punctuation should still be included even if there are 0 items. + * + * Composite objects in a list should be surrounded with { }. + */ +void +array_desc(StringInfo buf, void *array, size_t elem_size, int count, + void (*elem_desc) (StringInfo buf, void *elem, void *data), + void *data) +{ + if (count == 0) + { + appendStringInfoString(buf, " []"); + return; + } + appendStringInfo(buf, " ["); + for (int i = 0; i < count; i++) + { + if (i > 0) + appendStringInfoString(buf, ","); + appendStringInfoString(buf, " "); + + elem_desc(buf, (char *) array + elem_size * i, data); + } + appendStringInfoString(buf, " ]"); +} + +void +offset_elem_desc(StringInfo buf, void *offset, void *data) +{ + appendStringInfo(buf, "%u", *(OffsetNumber *) offset); +} + +void +redirect_elem_desc(StringInfo buf, void *offset, void *data) +{ + OffsetNumber *new_offset = (OffsetNumber *) offset; + + appendStringInfo(buf, "%u->%u", new_offset[0], new_offset[1]); +} + +void +relid_desc(StringInfo buf, void *relid, void *data) +{ + appendStringInfo(buf, "%u", *(Oid *) relid); +} |