take 2: show all / reset all - Mailing list pgsql-patches

From Marko Kreen
Subject take 2: show all / reset all
Date
Msg-id 20010602131807.A16109@l-t.ee
Whole thread Raw
Responses Re: take 2: show all / reset all  (Bruce Momjian <pgman@candle.pha.pa.us>)
Re: take 2: show all / reset all  (Bruce Momjian <pgman@candle.pha.pa.us>)
List pgsql-patches
Ok, now I am awake.  How about this one?

reset all: command line and .conf options change defaults
on RESET ALL those are restored.

show all: GUC + non-GUC.

--
marko



Index: doc/src/sgml/ref/reset.sgml
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/doc/src/sgml/ref/reset.sgml,v
retrieving revision 1.10
diff -c -r1.10 reset.sgml
*** doc/src/sgml/ref/reset.sgml    2000/12/25 23:15:26    1.10
--- doc/src/sgml/ref/reset.sgml    2001/06/02 11:04:32
***************
*** 16,21 ****
--- 16,24 ----
    <synopsis>
  RESET <replaceable class="PARAMETER">variable</replaceable>
    </synopsis>
+   <synopsis>
+ RESET ALL
+   </synopsis>

    <refsect2 id="R2-SQL-RESET-1">
     <title>Inputs</title>
***************
*** 27,32 ****
--- 30,43 ----
         <para>
      The name of a run-time parameter. See <xref
      linkend="sql-set" endterm="sql-set-title"> for a list.
+        </para>
+       </listitem>
+      </varlistentry>
+      <varlistentry>
+       <term>ALL</term>
+       <listitem>
+        <para>
+         Resets all run-time parameters to default values.
         </para>
        </listitem>
       </varlistentry>
Index: doc/src/sgml/ref/show.sgml
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/doc/src/sgml/ref/show.sgml,v
retrieving revision 1.11
diff -c -r1.11 show.sgml
*** doc/src/sgml/ref/show.sgml    2000/12/25 23:15:26    1.11
--- doc/src/sgml/ref/show.sgml    2001/06/02 11:04:32
***************
*** 16,21 ****
--- 16,24 ----
    <synopsis>
  SHOW <replaceable class="PARAMETER">name</replaceable>
    </synopsis>
+   <synopsis>
+ SHOW ALL
+   </synopsis>

    <refsect2 id="R2-SQL-SHOW-1">
     <title>Inputs</title>
***************
*** 29,34 ****
--- 32,45 ----
          The name of a run-time parameter. See
      <xref linkend="sql-set" endterm="sql-set-title">
          for a list.
+        </para>
+       </listitem>
+      </varlistentry>
+      <varlistentry>
+       <term>ALL</term>
+       <listitem>
+        <para>
+         Show all current session parameters.
         </para>
        </listitem>
       </varlistentry>
Index: src/backend/commands/variable.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/commands/variable.c,v
retrieving revision 1.48
diff -c -r1.48 variable.c
*** src/backend/commands/variable.c    2001/05/08 21:06:42    1.48
--- src/backend/commands/variable.c    2001/06/02 11:04:34
***************
*** 724,736 ****
      else if (strcasecmp(name, "session_authorization") == 0)
          SetSessionAuthorization(value);
      else
!         SetConfigOption(name, value, superuser() ? PGC_SUSET : PGC_USERSET);

      if (mvalue)
          pfree(mvalue);
  }

-
  void
  GetPGVariable(const char *name)
  {
--- 724,735 ----
      else if (strcasecmp(name, "session_authorization") == 0)
          SetSessionAuthorization(value);
      else
!         SetConfigOption(name, value, superuser() ? PGC_SUSET : PGC_USERSET, false);

      if (mvalue)
          pfree(mvalue);
  }

  void
  GetPGVariable(const char *name)
  {
***************
*** 747,754 ****
      else if (strcasecmp(name, "server_encoding") == 0)
          show_server_encoding();
      else if (strcasecmp(name, "seed") == 0)
          show_random_seed();
!     else
      {
          const char *val = GetConfigOption(name);

--- 746,763 ----
      else if (strcasecmp(name, "server_encoding") == 0)
          show_server_encoding();
      else if (strcasecmp(name, "seed") == 0)
+         show_random_seed();
+     else if (strcasecmp(name, "all") == 0)
+     {
+         ShowAllGUCConfig();
+         show_date();
+         show_timezone();
+         show_DefaultXactIsoLevel();
+         show_XactIsoLevel();
+         show_client_encoding();
+         show_server_encoding();
          show_random_seed();
!     } else
      {
          const char *val = GetConfigOption(name);

***************
*** 773,778 ****
          reset_server_encoding();
      else if (strcasecmp(name, "seed") == 0)
          reset_random_seed();
!     else
!         SetConfigOption(name, NULL, superuser() ? PGC_SUSET : PGC_USERSET);
  }
--- 782,798 ----
          reset_server_encoding();
      else if (strcasecmp(name, "seed") == 0)
          reset_random_seed();
!     else if (strcasecmp(name, "all") == 0)
!     {
!         reset_DefaultXactIsoLevel();
!         reset_XactIsoLevel();
!         reset_random_seed();
!         /* reset_server_encoding(); */
!         reset_client_encoding();
!         reset_date();
!         reset_timezone();
!
!         ResetAllOptions();
!     } else
!         SetConfigOption(name, NULL, superuser() ? PGC_SUSET : PGC_USERSET, false);
  }
Index: src/backend/parser/gram.y
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/parser/gram.y,v
retrieving revision 2.227
diff -c -r2.227 gram.y
*** src/backend/parser/gram.y    2001/05/27 09:59:29    2.227
--- src/backend/parser/gram.y    2001/06/02 11:04:46
***************
*** 860,865 ****
--- 860,871 ----
                      n->name  = "timezone";
                      $$ = (Node *) n;
                  }
+         | SHOW ALL
+                 {
+                     VariableShowStmt *n = makeNode(VariableShowStmt);
+                     n->name  = "all";
+                     $$ = (Node *) n;
+                 }
          | SHOW TRANSACTION ISOLATION LEVEL
                  {
                      VariableShowStmt *n = makeNode(VariableShowStmt);
***************
*** 884,889 ****
--- 890,901 ----
                  {
                      VariableResetStmt *n = makeNode(VariableResetStmt);
                      n->name  = "XactIsoLevel";
+                     $$ = (Node *) n;
+                 }
+         | RESET ALL
+                 {
+                     VariableResetStmt *n = makeNode(VariableResetStmt);
+                     n->name  = "all";
                      $$ = (Node *) n;
                  }
          ;
Index: src/backend/postmaster/postmaster.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/postmaster/postmaster.c,v
retrieving revision 1.215
diff -c -r1.215 postmaster.c
*** src/backend/postmaster/postmaster.c    2001/05/30 14:15:26    1.215
--- src/backend/postmaster/postmaster.c    2001/06/02 11:04:52
***************
*** 530,536 ****
                              elog(ERROR, "-c %s requires argument", optarg);
                      }

!                     SetConfigOption(name, value, PGC_POSTMASTER);
                      free(name);
                      if (value)
                          free(value);
--- 530,536 ----
                              elog(ERROR, "-c %s requires argument", optarg);
                      }

!                     SetConfigOption(name, value, PGC_POSTMASTER, true);
                      free(name);
                      if (value)
                          free(value);
Index: src/backend/tcop/postgres.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/tcop/postgres.c,v
retrieving revision 1.218
diff -c -r1.218 postgres.c
*** src/backend/tcop/postgres.c    2001/04/14 19:11:45    1.218
--- src/backend/tcop/postgres.c    2001/06/02 11:04:57
***************
*** 1462,1468 ****

                      /* all options are allowed if not under postmaster */
                      SetConfigOption(name, value,
!                      (IsUnderPostmaster) ? PGC_BACKEND : PGC_POSTMASTER);
                      free(name);
                      if (value)
                          free(value);
--- 1462,1468 ----

                      /* all options are allowed if not under postmaster */
                      SetConfigOption(name, value,
!                      (IsUnderPostmaster) ? PGC_BACKEND : PGC_POSTMASTER, true);
                      free(name);
                      if (value)
                          free(value);
Index: src/backend/utils/misc/guc-file.l
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/utils/misc/guc-file.l,v
retrieving revision 1.6
diff -c -r1.6 guc-file.l
*** src/backend/utils/misc/guc-file.l    2001/01/24 19:01:31    1.6
--- src/backend/utils/misc/guc-file.l    2001/06/02 11:05:07
***************
*** 260,272 ****
       */
      for(item = head; item; item=item->next)
      {
!         if (!set_config_option(item->name, item->value, context, false))
              goto cleanup_exit;
      }

      /* If we got here all the options parsed okay. */
      for(item = head; item; item=item->next)
!         set_config_option(item->name, item->value, context, true);

   cleanup_exit:
      free_name_value_list(head);
--- 260,272 ----
       */
      for(item = head; item; item=item->next)
      {
!         if (!set_config_option(item->name, item->value, context, false, false))
              goto cleanup_exit;
      }

      /* If we got here all the options parsed okay. */
      for(item = head; item; item=item->next)
!         set_config_option(item->name, item->value, context, true, true);

   cleanup_exit:
      free_name_value_list(head);
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/utils/misc/guc.c,v
retrieving revision 1.36
diff -c -r1.36 guc.c
*** src/backend/utils/misc/guc.c    2001/05/17 17:44:18    1.36
--- src/backend/utils/misc/guc.c    2001/06/02 11:05:10
***************
*** 136,144 ****
      const char *name;
      GucContext    context;
      char      **variable;
!     const char *default_val;
      bool        (*parse_hook) (const char *proposed);
      void        (*assign_hook) (const char *newval);
  };


--- 136,145 ----
      const char *name;
      GucContext    context;
      char      **variable;
!     const char *boot_default_val;
      bool        (*parse_hook) (const char *proposed);
      void        (*assign_hook) (const char *newval);
+     char        *default_val;
  };


***************
*** 433,438 ****
--- 434,448 ----
      {
          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);
***************
*** 582,588 ****
   */
  bool
  set_config_option(const char *name, const char *value, GucContext
!                   context, bool DoIt)
  {
      struct config_generic *record;
      enum config_type type;
--- 592,598 ----
   */
  bool
  set_config_option(const char *name, const char *value, GucContext
!                   context, bool DoIt, bool makeDefault)
  {
      struct config_generic *record;
      enum config_type type;
***************
*** 653,659 ****
--- 663,673 ----
                          return false;
                      }
                      if (DoIt)
+                     {
                          *conf->variable = boolval;
+                         if (makeDefault)
+                             conf->default_val = boolval;
+                     }
                  }
                  else if (DoIt)
                      *conf->variable = conf->default_val;
***************
*** 681,687 ****
--- 695,705 ----
                          return false;
                      }
                      if (DoIt)
+                     {
                          *conf->variable = intval;
+                         if (makeDefault)
+                             conf->default_val = intval;
+                     }
                  }
                  else if (DoIt)
                      *conf->variable = conf->default_val;
***************
*** 709,715 ****
--- 727,737 ----
                          return false;
                      }
                      if (DoIt)
+                     {
                          *conf->variable = dval;
+                         if (makeDefault)
+                             conf->default_val = dval;
+                     }
                  }
                  else if (DoIt)
                      *conf->variable = conf->default_val;
***************
*** 742,753 ****
--- 764,796 ----
                          if (*conf->variable)
                              free(*conf->variable);
                          *conf->variable = str;
+                         if (makeDefault)
+                         {
+                             if (conf->default_val)
+                                 free(conf->default_val);
+                             str = strdup(value);
+                             if (str == NULL) {
+                                 elog(elevel, "out of memory");
+                                 return false;
+                             }
+                             conf->default_val = str;
+                         }
                      }
                  }
                  else if (DoIt)
                  {
                      char       *str;

+                     if (!conf->default_val && conf->boot_default_val)
+                     {
+                         str = strdup(conf->boot_default_val);
+                         if (str == NULL)
+                         {
+                             elog(elevel, "out of memory");
+                             return false;
+                         }
+                         conf->boot_default_val = str;
+                     }
                      str = strdup(conf->default_val);
                      if (str == NULL)
                      {
***************
*** 776,784 ****
   */
  void
  SetConfigOption(const char *name, const char *value, GucContext
!                 context)
  {
!     (void) set_config_option(name, value, context, true);
  }


--- 819,827 ----
   */
  void
  SetConfigOption(const char *name, const char *value, GucContext
!                 context, bool makeDefault)
  {
!     (void) set_config_option(name, value, context, true, makeDefault);
  }


***************
*** 825,830 ****
--- 868,924 ----
      }
      return NULL;
  }
+
+ static void
+ _ShowOption(enum config_type opttype, struct config_generic *record)
+ {
+     static char buffer[256];
+     char *val;
+
+     switch (opttype)
+     {
+         case PGC_BOOL:
+             val = *((struct config_bool *) record)->variable ? "on" : "off";
+             break;
+         case PGC_INT:
+             snprintf(buffer, 256, "%d", *((struct config_int *) record)->variable);
+             val = buffer;
+             break;
+
+         case PGC_REAL:
+             snprintf(buffer, 256, "%g", *((struct config_real *) record)->variable);
+             val = buffer;
+             break;
+
+         case PGC_STRING:
+             val = *((struct config_string *) record)->variable;
+             break;
+
+         default:
+             val = "???";
+     }
+     elog(NOTICE, "%s is %s", record->name, val);
+ }
+
+ void
+ ShowAllGUCConfig(void)
+ {
+     int            i;
+
+     for (i = 0; ConfigureNamesBool[i].name; i++)
+         _ShowOption(PGC_BOOL, (struct config_generic *)&ConfigureNamesBool[i]);
+
+     for (i = 0; ConfigureNamesInt[i].name; i++)
+         _ShowOption(PGC_INT, (struct config_generic *)&ConfigureNamesInt[i]);
+
+     for (i = 0; ConfigureNamesReal[i].name; i++)
+         _ShowOption(PGC_REAL, (struct config_generic *)&ConfigureNamesReal[i]);
+
+     for (i = 0; ConfigureNamesString[i].name; i++)
+         _ShowOption(PGC_STRING, (struct config_generic *)&ConfigureNamesString[i]);
+ }
+
+



Index: src/include/utils/guc.h
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/include/utils/guc.h,v
retrieving revision 1.6
diff -c -r1.6 guc.h
*** src/include/utils/guc.h    2001/03/22 04:01:12    1.6
--- src/include/utils/guc.h    2001/06/02 11:05:23
***************
*** 46,57 ****
  } GucContext;


! void        SetConfigOption(const char *name, const char *value, GucContext context);
  const char *GetConfigOption(const char *name);
  void        ProcessConfigFile(GucContext context);
  void        ResetAllOptions(void);
  void        ParseLongOption(const char *string, char **name, char **value);
! bool        set_config_option(const char *name, const char *value, GucContext context, bool DoIt);


  extern bool Debug_print_query;
--- 46,58 ----
  } GucContext;


! void        SetConfigOption(const char *name, const char *value, GucContext context, bool makeDefault);
  const char *GetConfigOption(const char *name);
  void        ProcessConfigFile(GucContext context);
  void        ResetAllOptions(void);
  void        ParseLongOption(const char *string, char **name, char **value);
! bool        set_config_option(const char *name, const char *value, GucContext context, bool DoIt, bool makeDefault);
! void        ShowAllGUCConfig(void);


  extern bool Debug_print_query;

pgsql-patches by date:

Previous
From: Gerhard Häring
Date:
Subject: Patch for incomplete libpq DLL .def file
Next
From: Bruce Momjian
Date:
Subject: Re: show all;