| 1 | /*------------------------------------------------------------------------- |
| 2 | * help_config.c |
| 3 | * |
| 4 | * Displays available options under grand unified configuration scheme |
| 5 | * |
| 6 | * Options whose flag bits are set to GUC_NO_SHOW_ALL, GUC_NOT_IN_SAMPLE, |
| 7 | * or GUC_DISALLOW_IN_FILE are not displayed, unless the user specifically |
| 8 | * requests that variable by name |
| 9 | * |
| 10 | * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group |
| 11 | * |
| 12 | * IDENTIFICATION |
| 13 | * src/backend/utils/misc/help_config.c |
| 14 | * |
| 15 | *------------------------------------------------------------------------- |
| 16 | */ |
| 17 | #include "postgres.h" |
| 18 | |
| 19 | #include <limits.h> |
| 20 | #include <unistd.h> |
| 21 | |
| 22 | #include "utils/guc_tables.h" |
| 23 | #include "utils/help_config.h" |
| 24 | |
| 25 | |
| 26 | /* |
| 27 | * This union allows us to mix the numerous different types of structs |
| 28 | * that we are organizing. |
| 29 | */ |
| 30 | typedef union |
| 31 | { |
| 32 | struct config_generic generic; |
| 33 | struct config_bool _bool; |
| 34 | struct config_real real; |
| 35 | struct config_int integer; |
| 36 | struct config_string string; |
| 37 | struct config_enum _enum; |
| 38 | } mixedStruct; |
| 39 | |
| 40 | |
| 41 | static void printMixedStruct(mixedStruct *structToPrint); |
| 42 | static bool displayStruct(mixedStruct *structToDisplay); |
| 43 | |
| 44 | |
| 45 | void |
| 46 | GucInfoMain(void) |
| 47 | { |
| 48 | struct config_generic **guc_vars; |
| 49 | int numOpts, |
| 50 | i; |
| 51 | |
| 52 | /* Initialize the guc_variables[] array */ |
| 53 | build_guc_variables(); |
| 54 | |
| 55 | guc_vars = get_guc_variables(); |
| 56 | numOpts = GetNumConfigOptions(); |
| 57 | |
| 58 | for (i = 0; i < numOpts; i++) |
| 59 | { |
| 60 | mixedStruct *var = (mixedStruct *) guc_vars[i]; |
| 61 | |
| 62 | if (displayStruct(var)) |
| 63 | printMixedStruct(var); |
| 64 | } |
| 65 | |
| 66 | exit(0); |
| 67 | } |
| 68 | |
| 69 | |
| 70 | /* |
| 71 | * This function will return true if the struct passed to it |
| 72 | * should be displayed to the user. |
| 73 | */ |
| 74 | static bool |
| 75 | displayStruct(mixedStruct *structToDisplay) |
| 76 | { |
| 77 | return !(structToDisplay->generic.flags & (GUC_NO_SHOW_ALL | |
| 78 | GUC_NOT_IN_SAMPLE | |
| 79 | GUC_DISALLOW_IN_FILE)); |
| 80 | } |
| 81 | |
| 82 | |
| 83 | /* |
| 84 | * This function prints out the generic struct passed to it. It will print out |
| 85 | * a different format, depending on what the user wants to see. |
| 86 | */ |
| 87 | static void |
| 88 | printMixedStruct(mixedStruct *structToPrint) |
| 89 | { |
| 90 | printf("%s\t%s\t%s\t" , |
| 91 | structToPrint->generic.name, |
| 92 | GucContext_Names[structToPrint->generic.context], |
| 93 | _(config_group_names[structToPrint->generic.group])); |
| 94 | |
| 95 | switch (structToPrint->generic.vartype) |
| 96 | { |
| 97 | |
| 98 | case PGC_BOOL: |
| 99 | printf("BOOLEAN\t%s\t\t\t" , |
| 100 | (structToPrint->_bool.reset_val == 0) ? |
| 101 | "FALSE" : "TRUE" ); |
| 102 | break; |
| 103 | |
| 104 | case PGC_INT: |
| 105 | printf("INTEGER\t%d\t%d\t%d\t" , |
| 106 | structToPrint->integer.reset_val, |
| 107 | structToPrint->integer.min, |
| 108 | structToPrint->integer.max); |
| 109 | break; |
| 110 | |
| 111 | case PGC_REAL: |
| 112 | printf("REAL\t%g\t%g\t%g\t" , |
| 113 | structToPrint->real.reset_val, |
| 114 | structToPrint->real.min, |
| 115 | structToPrint->real.max); |
| 116 | break; |
| 117 | |
| 118 | case PGC_STRING: |
| 119 | printf("STRING\t%s\t\t\t" , |
| 120 | structToPrint->string.boot_val ? structToPrint->string.boot_val : "" ); |
| 121 | break; |
| 122 | |
| 123 | case PGC_ENUM: |
| 124 | printf("ENUM\t%s\t\t\t" , |
| 125 | config_enum_lookup_by_value(&structToPrint->_enum, |
| 126 | structToPrint->_enum.boot_val)); |
| 127 | break; |
| 128 | |
| 129 | default: |
| 130 | write_stderr("internal error: unrecognized run-time parameter type\n" ); |
| 131 | break; |
| 132 | } |
| 133 | |
| 134 | printf("%s\t%s\n" , |
| 135 | (structToPrint->generic.short_desc == NULL) ? "" : _(structToPrint->generic.short_desc), |
| 136 | (structToPrint->generic.long_desc == NULL) ? "" : _(structToPrint->generic.long_desc)); |
| 137 | } |
| 138 | |