Line data Source code
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-2025, 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 0 : GucInfoMain(void) 47 : { 48 : struct config_generic **guc_vars; 49 : int numOpts; 50 : 51 : /* Initialize the GUC hash table */ 52 0 : build_guc_variables(); 53 : 54 0 : guc_vars = get_guc_variables(&numOpts); 55 : 56 0 : for (int i = 0; i < numOpts; i++) 57 : { 58 0 : mixedStruct *var = (mixedStruct *) guc_vars[i]; 59 : 60 0 : if (displayStruct(var)) 61 0 : printMixedStruct(var); 62 : } 63 : 64 0 : exit(0); 65 : } 66 : 67 : 68 : /* 69 : * This function will return true if the struct passed to it 70 : * should be displayed to the user. 71 : */ 72 : static bool 73 0 : displayStruct(mixedStruct *structToDisplay) 74 : { 75 0 : return !(structToDisplay->generic.flags & (GUC_NO_SHOW_ALL | 76 : GUC_NOT_IN_SAMPLE | 77 : GUC_DISALLOW_IN_FILE)); 78 : } 79 : 80 : 81 : /* 82 : * This function prints out the generic struct passed to it. It will print out 83 : * a different format, depending on what the user wants to see. 84 : */ 85 : static void 86 0 : printMixedStruct(mixedStruct *structToPrint) 87 : { 88 0 : printf("%s\t%s\t%s\t", 89 : structToPrint->generic.name, 90 : GucContext_Names[structToPrint->generic.context], 91 : _(config_group_names[structToPrint->generic.group])); 92 : 93 0 : switch (structToPrint->generic.vartype) 94 : { 95 : 96 0 : case PGC_BOOL: 97 0 : printf("BOOLEAN\t%s\t\t\t", 98 : (structToPrint->_bool.reset_val == 0) ? 99 : "FALSE" : "TRUE"); 100 0 : break; 101 : 102 0 : case PGC_INT: 103 0 : printf("INTEGER\t%d\t%d\t%d\t", 104 : structToPrint->integer.reset_val, 105 : structToPrint->integer.min, 106 : structToPrint->integer.max); 107 0 : break; 108 : 109 0 : case PGC_REAL: 110 0 : printf("REAL\t%g\t%g\t%g\t", 111 : structToPrint->real.reset_val, 112 : structToPrint->real.min, 113 : structToPrint->real.max); 114 0 : break; 115 : 116 0 : case PGC_STRING: 117 0 : printf("STRING\t%s\t\t\t", 118 : structToPrint->string.boot_val ? structToPrint->string.boot_val : ""); 119 0 : break; 120 : 121 0 : case PGC_ENUM: 122 0 : printf("ENUM\t%s\t\t\t", 123 : config_enum_lookup_by_value(&structToPrint->_enum, 124 : structToPrint->_enum.boot_val)); 125 0 : break; 126 : 127 0 : default: 128 0 : write_stderr("internal error: unrecognized run-time parameter type\n"); 129 0 : break; 130 : } 131 : 132 0 : printf("%s\t%s\n", 133 : (structToPrint->generic.short_desc == NULL) ? "" : _(structToPrint->generic.short_desc), 134 : (structToPrint->generic.long_desc == NULL) ? "" : _(structToPrint->generic.long_desc)); 135 0 : }