aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/misc/help_config.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/misc/help_config.c')
-rw-r--r--src/backend/utils/misc/help_config.c322
1 files changed, 22 insertions, 300 deletions
diff --git a/src/backend/utils/misc/help_config.c b/src/backend/utils/misc/help_config.c
index 422bd9dddd7..7adbf6c6f81 100644
--- a/src/backend/utils/misc/help_config.c
+++ b/src/backend/utils/misc/help_config.c
@@ -3,9 +3,6 @@
*
* Displays available options under grand unified configuration scheme
*
- * The purpose of this option is to list, sort, and make searchable, all
- * runtime options available to PostgreSQL, by their description and grouping.
- *
* Options whose flag bits are set to GUC_NO_SHOW_ALL, GUC_NOT_IN_SAMPLE,
* or GUC_DISALLOW_IN_FILE are not displayed, unless the user specifically
* requests that variable by name
@@ -13,17 +10,12 @@
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/misc/help_config.c,v 1.7 2003/09/27 09:29:31 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/misc/help_config.c,v 1.8 2003/10/18 22:59:09 petere Exp $
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
-#include <fcntl.h>
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#endif
-#include <errno.h>
#include <float.h>
#include <limits.h>
#include <unistd.h>
@@ -32,56 +24,6 @@
#include "utils/guc_tables.h"
#include "utils/help_config.h"
-extern int optind;
-extern char *optarg;
-
-
-/*
- * The following char constructs provide the different formats the variables
- * can be outputted in.
- */
-#define HUMAN_OUTPUT 0
-#define MACHINE_OUTPUT 1
-
-static const char *const GENERIC_FORMAT[] = {
- gettext_noop("Name: %-20s\nContext: %-20s\nGroup: %-20s\n"),
- "%s\t%s\t%s\t"
-};
-static const char *const GENERIC_DESC[] = {
- gettext_noop("Description: %s\n%s\n"),
- "%s\t%s\n"
-};
-static const char *const BOOL_FORMAT[] = {
- gettext_noop("Type: Boolean\nDefault value: %-s\n"),
- "BOOL\t%s\t\t\t"
-};
-static const char *const INT_FORMAT[] = {
- gettext_noop("Type: integer\nDefault value: %-20d\nMin value: %-20d\nMax value: %-20d\n"),
- "INT\t%d\t%d\t%d\t"
-};
-static const char *const REAL_FORMAT[] = {
- gettext_noop("Type: real\nDefault value: %-20g\nMin value: %-20g\nMax value: %-20g\n"),
- "REAL\t%g\t%g\t%g\t"
-};
-static const char *const STRING_FORMAT[] = {
- gettext_noop("Type: string\nDefault value: %-s\n"),
- "STRING\t%s\t\t\t"
-};
-static const char *const ROW_SEPARATOR[] = {
- "------------------------------------------------------------\n",
- ""
-};
-
-/*
- * Variables loaded from the command line
- */
-static char *nameString = NULL; /* The var name pattern to match */
-static char *groupString = NULL; /* The var group pattern to match */
-static int outFormat = HUMAN_OUTPUT;
-static bool suppressAllHeaders = false; /* MACHINE_OUTPUT output, no
- * column headers */
-static bool groupResults = true; /* sort result list by groups */
-
/*
* This union allows us to mix the numerous different types of structs
@@ -97,211 +39,40 @@ typedef union
} mixedStruct;
-/* function prototypes */
-static bool varMatches(mixedStruct *structToTest);
-static int compareMixedStructs(const void *, const void *);
-static mixedStruct **varsToDisplay(int *resultListSize);
-static void helpMessage(const char *progname);
-static void listAllGroups(void);
-static void printGenericHead(struct config_generic structToPrint);
-static void printGenericFoot(struct config_generic structToPrint);
static void printMixedStruct(mixedStruct *structToPrint);
static bool displayStruct(mixedStruct *structToDisplay);
-/*
- * Reads in the the command line options and sets the state of the program
- * accordingly. Initializes the result list and sorts it.
- */
int
-GucInfoMain(int argc, char *argv[])
+GucInfoMain(void)
{
- mixedStruct **varList;
- int resultListSize;
- int c;
- int i;
-
- while ((c = getopt(argc - 1, argv + 1, "g:GmMlh")) != -1)
- {
- switch (c)
- {
- case 'g':
- groupString = optarg;
- break;
- case 'G':
- groupResults = false;
- break;
- case 'm':
- outFormat = MACHINE_OUTPUT;
- break;
- case 'M':
- outFormat = MACHINE_OUTPUT;
- suppressAllHeaders = true;
- break;
- case 'l':
- listAllGroups();
- exit(0);
- case 'h':
- helpMessage(argv[0]);
- exit(0);
-
- default:
- fprintf(stderr, gettext("Try \"%s --help-config -h\" for more information.\n"), argv[0]);
- exit(1);
- }
- }
-
- if (optind < argc - 1)
- nameString = argv[optind + 1];
-
- /* get the list of variables that match the user's specs. */
- varList = varsToDisplay(&resultListSize);
-
- /* sort them by group if desired */
- /* (without this, we get the original sort by name from guc.c) */
- if (groupResults)
- qsort(varList, resultListSize,
- sizeof(mixedStruct *), compareMixedStructs);
-
- /* output the results */
- if (outFormat == MACHINE_OUTPUT && !suppressAllHeaders)
- printf("NAME\tCONTEXT\tGROUP\tTYPE\tDEFAULT_VALUE\tMIN\tMAX\tSHORT_DESCRIPTION\tLONG_DESCRIPTION\n");
-
- for (i = 0; varList[i] != NULL; i++)
- {
- printf(ROW_SEPARATOR[outFormat]);
- printMixedStruct(varList[i]);
- }
-
- return 0;
-}
-
-
-/*
- * This function is used to compare two mixedStruct types. It compares based
- * on the value of the 'group' field, and then the name of the variable.
- * Each void* is expected to be a pointer to a pointer to a struct.
- * (This is because it is used by qsort to sort an array of struct pointers)
- *
- * Returns an integer less than, equal to, or greater than zero if the first
- * argument (struct1) is considered to be respectively less than, equal to,
- * or greater than the second (struct2). The comparison is made frist on the
- * value of struct{1,2}.generic.group and then struct{1,2}.generic.name. The
- * groups will display in the order they are defined in enum config_group
- */
-static int
-compareMixedStructs(const void *struct1, const void *struct2)
-{
- mixedStruct *structVar1 = *(mixedStruct **) struct1;
- mixedStruct *structVar2 = *(mixedStruct **) struct2;
-
- if (structVar1->generic.group > structVar2->generic.group)
- return 1;
- else if (structVar1->generic.group < structVar2->generic.group)
- return -1;
- else
- return strcmp(structVar1->generic.name, structVar2->generic.name);
-}
-
-
-/*
- * This function returns a complete list of all the variables to display,
- * according to what the user wants to see.
- */
-static mixedStruct **
-varsToDisplay(int *resultListSize)
-{
- mixedStruct **resultList;
- int arrayIndex;
int i;
/* Initialize the guc_variables[] array */
build_guc_variables();
- /* Extract just the ones we want to display */
- resultList = malloc((num_guc_variables + 1) * sizeof(mixedStruct *));
- arrayIndex = 0;
-
for (i = 0; i < num_guc_variables; i++)
{
mixedStruct *var = (mixedStruct *) guc_variables[i];
- if (varMatches(var))
- resultList[arrayIndex++] = var;
+ if (displayStruct(var))
+ printMixedStruct(var);
}
- /* add an end marker */
- resultList[arrayIndex] = NULL;
-
- *resultListSize = arrayIndex;
- return resultList;
+ return 0;
}
/*
* This function will return true if the struct passed to it
* should be displayed to the user.
- *
- * The criteria to determine if the struct should not be displayed is:
- * + It's flag bits are set to GUC_NO_SHOW_ALL
- * + It's flag bits are set to GUC_NOT_IN_SAMPLE
- * + It's flag bits are set to GUC_DISALLOW_IN_FILE
*/
static bool
displayStruct(mixedStruct *structToDisplay)
{
- if (structToDisplay->generic.flags & (GUC_NO_SHOW_ALL |
- GUC_NOT_IN_SAMPLE |
- GUC_DISALLOW_IN_FILE))
- return false;
- else
- return true;
-}
-
-
-/*
- * Used to determine if a variable matches the user's specifications (stored in
- * global variables). Returns true if this particular variable information should
- * be returned to the user.
- */
-static bool
-varMatches(mixedStruct *structToTest)
-{
- bool matches = false;
- bool specificSearch = false; /* This is true if the user
- * searched for a variable in
- * particular. */
-
- if (nameString != NULL)
- {
- if (strstr(structToTest->generic.name, nameString) != NULL)
- {
- matches = true;
- specificSearch = true;
- }
- }
-
- if (groupString != NULL)
- {
- if (strstr(config_group_names[structToTest->generic.group], groupString) != NULL)
- {
- if (nameString != NULL)
- matches = (matches && true);
- else
- matches = true;
- }
- else
- matches = false;
- }
-
- /* return all variables */
- if (nameString == NULL && groupString == NULL)
- matches = true;
-
- if (specificSearch)
- return matches;
- else
- return matches && displayStruct(structToTest);
+ return !(structToDisplay->generic.flags & (GUC_NO_SHOW_ALL |
+ GUC_NOT_IN_SAMPLE |
+ GUC_DISALLOW_IN_FILE));
}
@@ -312,94 +83,45 @@ varMatches(mixedStruct *structToTest)
static void
printMixedStruct(mixedStruct *structToPrint)
{
- printGenericHead(structToPrint->generic);
+ printf("%s\t%s\t%s\t",
+ structToPrint->generic.name,
+ GucContext_Names[structToPrint->generic.context],
+ gettext(config_group_names[structToPrint->generic.group]));
switch (structToPrint->generic.vartype)
{
case PGC_BOOL:
- if (outFormat == HUMAN_OUTPUT)
- printf(gettext(BOOL_FORMAT[outFormat]),
- (structToPrint->bool.reset_val == 0) ?
- gettext("false") : gettext("true"));
- else
- printf(gettext(BOOL_FORMAT[outFormat]),
- (structToPrint->bool.reset_val == 0) ?
- "FALSE" : "TRUE");
+ printf("BOOLEAN\t%s\t\t\t",
+ (structToPrint->bool.reset_val == 0) ?
+ "FALSE" : "TRUE");
break;
case PGC_INT:
- printf(gettext(INT_FORMAT[outFormat]),
+ printf("INTEGER\t%d\t%d\t%d\t",
structToPrint->integer.reset_val,
structToPrint->integer.min,
structToPrint->integer.max);
break;
case PGC_REAL:
- printf(gettext(REAL_FORMAT[outFormat]),
+ printf("REAL\t%g\t%g\t%g\t",
structToPrint->real.reset_val,
structToPrint->real.min,
structToPrint->real.max);
break;
case PGC_STRING:
- printf(gettext(STRING_FORMAT[outFormat]),
+ printf("STRING\t%s\t\t\t",
structToPrint->string.boot_val);
break;
default:
- printf("Internal error: unrecognized run-time parameter type\n");
+ fprintf(stderr, "internal error: unrecognized run-time parameter type\n");
break;
}
- printGenericFoot(structToPrint->generic);
-}
-
-static void
-printGenericHead(struct config_generic structToPrint)
-{
- printf(gettext(GENERIC_FORMAT[outFormat]),
- structToPrint.name,
- GucContext_Names[structToPrint.context],
- gettext(config_group_names[structToPrint.group]));
-}
-
-static void
-printGenericFoot(struct config_generic sPrint)
-{
- printf(gettext(GENERIC_DESC[outFormat]),
- (sPrint.short_desc == NULL) ? "" : gettext(sPrint.short_desc),
- (sPrint.long_desc == NULL) ? "" : gettext(sPrint.long_desc));
-}
-
-static void
-listAllGroups(void)
-{
- int i;
-
- for (i = 0; config_group_names[i] != NULL; i++)
- printf("%s\n", gettext(config_group_names[i]));
-}
-
-static void
-helpMessage(const char *progname)
-{
- printf(gettext("%s --help-config displays information about the\n"
- "run-time configuration parameters available in the PostgreSQL server.\n\n"),
- progname);
- printf(gettext("Usage:\n %s --help-config [OPTION]... [NAME]\n\n"), progname);
- printf(gettext("General Options:\n"));
- printf(gettext(" NAME output information about parameters matching this name\n"));
- printf(gettext(" -g GROUP output information about parameters matching this group\n"));
- printf(gettext(" -l list available parameter groups\n"));
- printf(gettext(" -h show this help, then exit\n"));
- printf(gettext("\nOutput Options:\n"));
- printf(gettext(" -G do not group by category\n"));
- printf(gettext(" -m machine-friendly format: tab separated fields\n"));
- printf(gettext(" -M same as -m, but header with column names is suppressed\n"));
- printf(gettext("\n"
- "If no parameter name is specified, all parameters are shown. By default,\n"
- "parameters are grouped by category, sorted by name, and output in a human-\n"
- "friendly format. Available information about run-time parameters includes\n"
- "a short description, default value, maximum and minimum values.\n"));
+ printf("%s\t%s\n",
+ (structToPrint->generic.short_desc == NULL) ? "" : gettext(structToPrint->generic.short_desc),
+ (structToPrint->generic.long_desc == NULL) ? "" : gettext(structToPrint->generic.long_desc));
}