reset all update - Mailing list pgsql-patches

From Marko Kreen
Subject reset all update
Date
Msg-id 20010611114008.A3818@l-t.ee
Whole thread Raw
Responses Re: reset all update  (Bruce Momjian <pgman@candle.pha.pa.us>)
Re: reset all update  (Peter Eisentraut <peter_e@gmx.net>)
List pgsql-patches
* GUCify command line arguments.
* ResetAllOptions() comment
* split set_config_option()
* use set_config_option_real() on string reset
  - it calls hooks and free()'s the previous val
* check if string val changed on reset

--
marko


Index: src/backend/postmaster/postmaster.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/postmaster/postmaster.c,v
retrieving revision 1.218
diff -u -c -r1.218 postmaster.c
*** src/backend/postmaster/postmaster.c    2001/06/11 04:12:29    1.218
--- src/backend/postmaster/postmaster.c    2001/06/11 09:17:01
***************
*** 422,435 ****
  #ifndef USE_ASSERT_CHECKING
                  postmaster_error("Assert checking is not compiled in.");
  #else
!                 assert_enabled = atoi(optarg);
  #endif
                  break;
              case 'a':
                  /* Can no longer set authentication method. */
                  break;
              case 'B':
!                 NBuffers = atoi(optarg);
                  break;
              case 'b':
                  /* Can no longer set the backend executable file to use. */
--- 422,435 ----
  #ifndef USE_ASSERT_CHECKING
                  postmaster_error("Assert checking is not compiled in.");
  #else
!                 SetConfigOption("debug_assertions", optarg, PGC_POSTMASTER, true);
  #endif
                  break;
              case 'a':
                  /* Can no longer set authentication method. */
                  break;
              case 'B':
!                 SetConfigOption("shared_buffers", optarg, PGC_POSTMASTER, true);
                  break;
              case 'b':
                  /* Can no longer set the backend executable file to use. */
***************
*** 443,465 ****
                   * Turn on debugging for the postmaster and the backend
                   * servers descended from it.
                   */
!                 DebugLvl = atoi(optarg);
                  break;
              case 'F':
!                 enableFsync = false;
                  break;
              case 'h':
!                 VirtualHost = optarg;
                  break;
              case 'i':
!                 NetServer = true;
                  break;
              case 'k':
!                 UnixSocketDir = optarg;
                  break;
  #ifdef USE_SSL
              case 'l':
!                 EnableSSL = true;
                  break;
  #endif
              case 'm':
--- 443,465 ----
                   * Turn on debugging for the postmaster and the backend
                   * servers descended from it.
                   */
!                 SetConfigOption("debug_level", optarg, PGC_POSTMASTER, true);
                  break;
              case 'F':
!                 SetConfigOption("enable_fsync", optarg, PGC_POSTMASTER, true);
                  break;
              case 'h':
!                 SetConfigOption("virtual_host", optarg, PGC_POSTMASTER, true);
                  break;
              case 'i':
!                 SetConfigOption("tcpip_socket", optarg, PGC_POSTMASTER, true);
                  break;
              case 'k':
!                 SetConfigOption("unix_socket_directory", optarg, PGC_POSTMASTER, true);
                  break;
  #ifdef USE_SSL
              case 'l':
!                 SetConfigOption("ssl", optarg, PGC_POSTMASTER, true);
                  break;
  #endif
              case 'm':
***************
*** 479,489 ****
                   * The max number of backends to start. Can't set to less
                   * than 1 or more than compiled-in limit.
                   */
!                 MaxBackends = atoi(optarg);
!                 if (MaxBackends < 1)
!                     MaxBackends = 1;
!                 if (MaxBackends > MAXBACKENDS)
!                     MaxBackends = MAXBACKENDS;
                  break;
              case 'n':
                  /* Don't reinit shared mem after abnormal exit */
--- 479,485 ----
                   * The max number of backends to start. Can't set to less
                   * than 1 or more than compiled-in limit.
                   */
!                 SetConfigOption("max_connections", optarg, PGC_POSTMASTER, true);
                  break;
              case 'n':
                  /* Don't reinit shared mem after abnormal exit */
***************
*** 500,506 ****
                  strcpy(original_extraoptions, optarg);
                  break;
              case 'p':
!                 PostPortNumber = atoi(optarg);
                  break;
              case 'S':

--- 496,502 ----
                  strcpy(original_extraoptions, optarg);
                  break;
              case 'p':
!                 SetConfigOption("port", optarg, PGC_POSTMASTER, true);
                  break;
              case 'S':

***************
*** 510,516 ****
                   * it's most badly needed on SysV-derived systems like
                   * SVR4 and HP-UX.
                   */
!                 SilentMode = true;
                  break;
              case 's':

--- 506,512 ----
                   * it's most badly needed on SysV-derived systems like
                   * SVR4 and HP-UX.
                   */
!                 SetConfigOption("silent_mode", optarg, PGC_POSTMASTER, true);
                  break;
              case 's':

Index: src/backend/tcop/postgres.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/tcop/postgres.c,v
retrieving revision 1.219
diff -u -c -r1.219 postgres.c
*** src/backend/tcop/postgres.c    2001/06/07 04:50:57    1.219
--- src/backend/tcop/postgres.c    2001/06/11 09:17:07
***************
*** 1108,1113 ****
--- 1108,1115 ----
      const char *DBName = NULL;
      bool        secure = true;
      int            errs = 0;
+     GucContext    ctx;
+     char        *tmp;

      int            firstchar;
      StringInfo    parser_input;
***************
*** 1117,1122 ****
--- 1119,1126 ----

      char       *potential_DataDir = NULL;

+     ctx = IsUnderPostmaster ? PGC_BACKEND : PGC_POSTMASTER;
+
      /*
       * Catch standard options before doing much else.  This even works on
       * systems without getopt_long.
***************
*** 1188,1194 ****
          {
              case 'A':
  #ifdef USE_ASSERT_CHECKING
!                 assert_enabled = atoi(optarg);
  #else
                  fprintf(stderr, "Assert checking is not compiled in\n");
  #endif
--- 1192,1198 ----
          {
              case 'A':
  #ifdef USE_ASSERT_CHECKING
!                 SetConfigOption("debug_assertions", optarg, ctx, true);
  #else
                  fprintf(stderr, "Assert checking is not compiled in\n");
  #endif
***************
*** 1200,1206 ****
                   * specify the size of buffer pool
                   */
                  if (secure)
!                     NBuffers = atoi(optarg);
                  break;

              case 'C':
--- 1204,1210 ----
                   * specify the size of buffer pool
                   */
                  if (secure)
!                     SetConfigOption("shared_buffers", optarg, ctx, true);
                  break;

              case 'C':
***************
*** 1217,1233 ****
                  break;

              case 'd':            /* debug level */
!                 DebugLvl = atoi(optarg);
                  if (DebugLvl >= 1);
!                 Log_connections = true;
                  if (DebugLvl >= 2)
!                     Debug_print_query = true;
                  if (DebugLvl >= 3)
!                     Debug_print_parse = true;
                  if (DebugLvl >= 4)
!                     Debug_print_plan = true;
                  if (DebugLvl >= 5)
!                     Debug_print_rewritten = true;
                  break;

              case 'E':
--- 1221,1238 ----
                  break;

              case 'd':            /* debug level */
!                 tmp = "true";
!                 SetConfigOption("debug_level", optarg, ctx, true);
                  if (DebugLvl >= 1);
!                 SetConfigOption("log_connections", tmp, ctx, true);
                  if (DebugLvl >= 2)
!                     SetConfigOption("debug_print_query", tmp, ctx, true);
                  if (DebugLvl >= 3)
!                     SetConfigOption("debug_print_parse", tmp, ctx, true);
                  if (DebugLvl >= 4)
!                     SetConfigOption("debug_print_plan", tmp, ctx, true);
                  if (DebugLvl >= 5)
!                     SetConfigOption("debug_print_rewritten", tmp, ctx, true);
                  break;

              case 'E':
***************
*** 1252,1258 ****
                   * turn off fsync
                   */
                  if (secure)
!                     enableFsync = false;
                  break;

              case 'f':
--- 1257,1263 ----
                   * turn off fsync
                   */
                  if (secure)
!                     SetConfigOption("fsync", "true", ctx, true);
                  break;

              case 'f':
***************
*** 1260,1288 ****
                  /*
                   * f - forbid generation of certain plans
                   */
                  switch (optarg[0])
                  {
                      case 's':    /* seqscan */
!                         enable_seqscan = false;
                          break;
                      case 'i':    /* indexscan */
!                         enable_indexscan = false;
                          break;
                      case 't':    /* tidscan */
!                         enable_tidscan = false;
                          break;
                      case 'n':    /* nestloop */
!                         enable_nestloop = false;
                          break;
                      case 'm':    /* mergejoin */
!                         enable_mergejoin = false;
                          break;
                      case 'h':    /* hashjoin */
!                         enable_hashjoin = false;
                          break;
                      default:
                          errs++;
                  }
                  break;

              case 'i':
--- 1265,1296 ----
                  /*
                   * f - forbid generation of certain plans
                   */
+                 tmp = NULL;
                  switch (optarg[0])
                  {
                      case 's':    /* seqscan */
!                         tmp = "enable_seqscan";
                          break;
                      case 'i':    /* indexscan */
!                         tmp = "enable_indexscan";
                          break;
                      case 't':    /* tidscan */
!                         tmp = "enable_tidscan";
                          break;
                      case 'n':    /* nestloop */
!                         tmp = "enable_nestloop";
                          break;
                      case 'm':    /* mergejoin */
!                         tmp = "enable_mergejoin";
                          break;
                      case 'h':    /* hashjoin */
!                         tmp = "enable_hashjoin";
                          break;
                      default:
                          errs++;
                  }
+                 if (tmp)
+                     SetConfigOption(tmp, "false", ctx, true);
                  break;

              case 'i':
***************
*** 1352,1364 ****
                  /*
                   * S - amount of sort memory to use in 1k bytes
                   */
!                 {
!                     int            S;
!
!                     S = atoi(optarg);
!                     if (S >= 4 * BLCKSZ / 1024)
!                         SortMem = S;
!                 }
                  break;

              case 's':
--- 1360,1366 ----
                  /*
                   * S - amount of sort memory to use in 1k bytes
                   */
!                 SetConfigOption("sort_mem", optarg, ctx, true);
                  break;

              case 's':
***************
*** 1366,1372 ****
                  /*
                   * s - report usage statistics (timings) after each query
                   */
!                 Show_query_stats = 1;
                  break;

              case 't':
--- 1368,1374 ----
                  /*
                   * s - report usage statistics (timings) after each query
                   */
!                 SetConfigOption("show_query_stats", optarg, ctx, true);
                  break;

              case 't':
***************
*** 1380,1402 ****
                   *    caution: -s can not be used together with -t.
                   * ----------------
                   */
                  switch (optarg[0])
                  {
                      case 'p':
                          if (optarg[1] == 'a')
!                             Show_parser_stats = 1;
                          else if (optarg[1] == 'l')
!                             Show_planner_stats = 1;
                          else
                              errs++;
                          break;
                      case 'e':
!                         Show_executor_stats = 1;
                          break;
                      default:
                          errs++;
                          break;
                  }
                  break;

              case 'v':
--- 1382,1407 ----
                   *    caution: -s can not be used together with -t.
                   * ----------------
                   */
+                 tmp = NULL;
                  switch (optarg[0])
                  {
                      case 'p':
                          if (optarg[1] == 'a')
!                             tmp = "show_parser_stats";
                          else if (optarg[1] == 'l')
!                             tmp = "show_planner_stats";
                          else
                              errs++;
                          break;
                      case 'e':
!                         tmp = "show_parser_stats";
                          break;
                      default:
                          errs++;
                          break;
                  }
+                 if (tmp)
+                     SetConfigOption(tmp, "true", ctx, true);
                  break;

              case 'v':
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/utils/misc/guc.c,v
retrieving revision 1.37
diff -u -c -r1.37 guc.c
*** src/backend/utils/misc/guc.c    2001/06/07 04:50:57    1.37
--- src/backend/utils/misc/guc.c    2001/06/11 09:17:09
***************
*** 143,148 ****
--- 143,151 ----
  };


+ static bool set_config_option_real(enum config_type type, struct config_generic *record,
+                 const char *value, bool DoIt, bool makeDefault, int elevel);
+
  /*
   * TO ADD AN OPTION:
   *
***************
*** 264,270 ****
      DEF_PGPORT, 1, 65535},

      {"sort_mem", PGC_USERSET, &SortMem,
!     512, 1, INT_MAX},

      {"debug_level", PGC_USERSET, &DebugLvl,
      0, 0, 16},
--- 267,273 ----
      DEF_PGPORT, 1, 65535},

      {"sort_mem", PGC_USERSET, &SortMem,
!     512, 4*BLCKSZ/1024, INT_MAX},

      {"debug_level", PGC_USERSET, &DebugLvl,
      0, 0, 16},
***************
*** 413,420 ****


  /*
!  * Reset all options to their specified default values. Should only be
!  * called at program startup.
   */
  void
  ResetAllOptions(void)
--- 416,424 ----


  /*
!  * Reset all options to their specified default values.
!  *
!  * Default values come from: builtin, config file, command line.
   */
  void
  ResetAllOptions(void)
***************
*** 433,455 ****
      for (i = 0; ConfigureNamesString[i].name; i++)
      {
          char       *str = NULL;

!         if (!ConfigureNamesString[i].default_val
!                 && ConfigureNamesString[i].boot_default_val)
          {
!             str = strdup(ConfigureNamesString[i].boot_default_val);
              if (str == NULL)
                  elog(ERROR, "out of memory");

!             ConfigureNamesString[i].default_val = str;
          }
!         if (ConfigureNamesString[i].default_val)
!         {
!             str = strdup(ConfigureNamesString[i].default_val);
!             if (str == NULL)
!                 elog(ERROR, "out of memory");
!         }
!         *(ConfigureNamesString[i].variable) = str;
      }

      if (getenv("PGPORT"))
--- 437,459 ----
      for (i = 0; ConfigureNamesString[i].name; i++)
      {
          char       *str = NULL;
+         struct config_string *cf = &ConfigureNamesString[i];

!         if (!cf->default_val && cf->boot_default_val)
          {
!             str = strdup(cf->boot_default_val);
              if (str == NULL)
                  elog(ERROR, "out of memory");

!             cf->default_val = str;
          }
!
!         if (!cf->variable || !cf->default_val)
!             continue;
!
!         if (!*cf->variable || strcmp(cf->default_val, *cf->variable))
!             set_config_option_real(PGC_STRING, (struct config_generic *)cf,
!                     cf->default_val, true, false, ERROR);
      }

      if (getenv("PGPORT"))
***************
*** 607,612 ****
--- 611,617 ----
          return false;
      }

+
      /*
       * Check if the option can be set at this time. See guc.h for the
       * precise rules. Note that we don't want to throw errors if we're in
***************
*** 644,649 ****
--- 649,663 ----
          elog(ERROR, "permission denied");


+     return set_config_option_real(type, (struct config_generic *)record,
+             value, DoIt, makeDefault, elevel);
+ }
+
+ static bool
+ set_config_option_real(enum config_type type, struct config_generic *record,
+                     const char *value, bool DoIt, bool makeDefault,
+                     int elevel)
+ {
      /*
       * Evaluate value and set variable
       */
***************
*** 659,665 ****

                      if (!parse_bool(value, &boolval))
                      {
!                         elog(elevel, "option '%s' requires a boolean value", name);
                          return false;
                      }
                      if (DoIt)
--- 673,680 ----

                      if (!parse_bool(value, &boolval))
                      {
!                         elog(elevel, "option '%s' requires a boolean value",
!                                 conf->name);
                          return false;
                      }
                      if (DoIt)
***************
*** 684,697 ****

                      if (!parse_int(value, &intval))
                      {
!                         elog(elevel, "option '%s' expects an integer value", name);
                          return false;
                      }
                      if (intval < conf->min || intval > conf->max)
                      {
                          elog(elevel, "option '%s' value %d is outside"
                               " of permissible range [%d .. %d]",
!                              name, intval, conf->min, conf->max);
                          return false;
                      }
                      if (DoIt)
--- 699,713 ----

                      if (!parse_int(value, &intval))
                      {
!                         elog(elevel, "option '%s' expects an integer value",
!                                 conf->name);
                          return false;
                      }
                      if (intval < conf->min || intval > conf->max)
                      {
                          elog(elevel, "option '%s' value %d is outside"
                               " of permissible range [%d .. %d]",
!                              conf->name, intval, conf->min, conf->max);
                          return false;
                      }
                      if (DoIt)
***************
*** 716,729 ****

                      if (!parse_real(value, &dval))
                      {
!                         elog(elevel, "option '%s' expects a real number", name);
                          return false;
                      }
                      if (dval < conf->min || dval > conf->max)
                      {
                          elog(elevel, "option '%s' value %g is outside"
                               " of permissible range [%g .. %g]",
!                              name, dval, conf->min, conf->max);
                          return false;
                      }
                      if (DoIt)
--- 732,746 ----

                      if (!parse_real(value, &dval))
                      {
!                         elog(elevel, "option '%s' expects a real number",
!                                 conf->name);
                          return false;
                      }
                      if (dval < conf->min || dval > conf->max)
                      {
                          elog(elevel, "option '%s' value %g is outside"
                               " of permissible range [%g .. %g]",
!                              conf->name, dval, conf->min, conf->max);
                          return false;
                      }
                      if (DoIt)
***************
*** 746,752 ****
                  {
                      if (conf->parse_hook && !(conf->parse_hook) (value))
                      {
!                         elog(elevel, "invalid value for option '%s': '%s'", name, value);
                          return false;
                      }
                      if (DoIt)
--- 763,769 ----
                  {
                      if (conf->parse_hook && !(conf->parse_hook) (value))
                      {
!                         elog(elevel, "invalid value for option '%s': '%s'", conf->name, value);
                          return false;
                      }
                      if (DoIt)

pgsql-patches by date:

Previous
From: Marko Kreen
Date:
Subject: sequence.c compile failure
Next
From: Dave Bodenstab
Date:
Subject: 7.1 odbc bug & patch