Re: pgsql 8.0 beta1 patch for token and timezone - Mailing list pgsql-bugs

From Bruce Momjian
Subject Re: pgsql 8.0 beta1 patch for token and timezone
Date
Msg-id 200410071652.i97GqbR08332@candle.pha.pa.us
Whole thread Raw
In response to pgsql 8.0 beta1 patch for token and timezone  ("Zhong Jacky" <jackyzhongxp@msn.com>)
Responses Re: pgsql 8.0 beta1 patch for token and timezone  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-bugs
I have reviewed your patch.  I found that the first patch was definitely
needed.  Your code adds escapes for single quotes in locale names placed
in postgresql.conf.  I also added code to escape a literal backslash as
well.  I re-factored your code and applied the attached patch.

Your second patch to pgtz.c is not needed anymore because we have a more
general solution added on September 1:

    /*
     * Localized Windows versions return localized names for the
     * timezone. Scan the registry to find the English name,
     * and then try matching against our table again.
     */
    memset(localtzname, 0, sizeof(localtzname));
    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                     "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones",
                     0,
                     KEY_READ,
                     &rootKey) != ERROR_SUCCESS)

Thanks.

---------------------------------------------------------------------------

Zhong Jacky wrote:
> Hi pgsql-bugs,
>
>    I'm a Chinese and I am using WinXp Chs to compile pgsql 8.0 beta 1
> in the MinGW environment. I found 2 bugs and fix them, maybe you can
> merge the patch into the offical release, thanks.
>
>    Part A) Below is the two bugs occur when we run initdb under WinXp Chs.
>
>    1) FATAL:  syntax error in file "E:/Unix/Sys/Pgsql/data/postgresql.conf"
>
> line 261, near token "s"
>
>       Reason: the string 'Chinese_People's Republic of China.936' should be
> 'Chinese_People\'s Republic of China.936', otherwise token mismatch. Plese
> remember the regular expression like sed and awk under Unix.
>
>       Patch: I wrote a function to detect ' in string and insert a \ symbol
>
>    2) WARNING:  could not find a match for Windows timezone "??????"
>
>       Reason: "??????" is the string stands for "China Standard
> Time",
> which shows in Chinese language.
>
>       Patch: use a scanzone() function to find and convert timezone to the
> English string in win32_tzmap[]. I can fix only Chinese because I only have
> WinXp Chs operating system, people can fix others in similar way.
>
>    Part B) You can visit these 2 websites for more detail and get patch.
>    1) http://blog.csdn.net/chaoyuebetter/archive/2004/08/13/73785.aspx
>    2) http://www.smth.edu.cn/bbsgcon.php?board=NewSoftware&num=2548
>
>    Part C) The patch is based on snap0812, but can work on snap0825, etc.
>
> Regards,
> Jacky
>
> _________________________________________________________________
> ???? MSN Explorer:   http://explorer.msn.com/lccn/
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: src/bin/initdb/initdb.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/bin/initdb/initdb.c,v
retrieving revision 1.56
diff -c -c -r1.56 initdb.c
*** src/bin/initdb/initdb.c    6 Oct 2004 09:13:10 -0000    1.56
--- src/bin/initdb/initdb.c    7 Oct 2004 16:45:32 -0000
***************
*** 181,186 ****
--- 181,187 ----
  static void make_template0(void);
  static void trapsig(int signum);
  static void check_ok(void);
+ static void escape_locale(char **locale);
  static bool chklocale(const char *locale);
  static void setlocales(void);
  static void usage(const char *progname);
***************
*** 1099,1114 ****
      snprintf(repltok, sizeof(repltok), "shared_buffers = %d", n_buffers);
      conflines = replace_token(conflines, "#shared_buffers = 1000", repltok);

      snprintf(repltok, sizeof(repltok), "lc_messages = '%s'", lc_messages);
      conflines = replace_token(conflines, "#lc_messages = 'C'", repltok);

      snprintf(repltok, sizeof(repltok), "lc_monetary = '%s'", lc_monetary);
      conflines = replace_token(conflines, "#lc_monetary = 'C'", repltok);

      snprintf(repltok, sizeof(repltok), "lc_numeric = '%s'", lc_numeric);
-
      conflines = replace_token(conflines, "#lc_numeric = 'C'", repltok);

      snprintf(repltok, sizeof(repltok), "lc_time = '%s'", lc_time);
      conflines = replace_token(conflines, "#lc_time = 'C'", repltok);

--- 1100,1119 ----
      snprintf(repltok, sizeof(repltok), "shared_buffers = %d", n_buffers);
      conflines = replace_token(conflines, "#shared_buffers = 1000", repltok);

+
+     escape_locale(&lc_messages);
      snprintf(repltok, sizeof(repltok), "lc_messages = '%s'", lc_messages);
      conflines = replace_token(conflines, "#lc_messages = 'C'", repltok);

+     escape_locale(&lc_monetary);
      snprintf(repltok, sizeof(repltok), "lc_monetary = '%s'", lc_monetary);
      conflines = replace_token(conflines, "#lc_monetary = 'C'", repltok);

+     escape_locale(&lc_numeric);
      snprintf(repltok, sizeof(repltok), "lc_numeric = '%s'", lc_numeric);
      conflines = replace_token(conflines, "#lc_numeric = 'C'", repltok);

+     escape_locale(&lc_time);
      snprintf(repltok, sizeof(repltok), "lc_time = '%s'", lc_time);
      conflines = replace_token(conflines, "#lc_time = 'C'", repltok);

***************
*** 1896,1906 ****
      }
  }


  /*
   * check if given string is a valid locale specifier
-  * based on some code given to me by Peter Eisentraut
-  * (but I take responsibility for it :-)
   */
  static bool
  chklocale(const char *locale)
--- 1901,1927 ----
      }
  }

+ /*
+  * Escape any single quotes or backslashes in locale
+  */
+ static void
+ escape_locale(char **locale)
+ {
+     int            len = strlen(*locale),
+                 i, j;
+     char        *loc_temp = xmalloc(len * 2);
+
+     for (i = 0, j = 0; i < len; i++)
+     {
+         if ((*locale)[i] == '\'' || (*locale)[i] == '\\')
+             loc_temp[j++] = '\\';
+         loc_temp[j++] = (*locale)[i];
+     }
+     *locale = loc_temp;
+ }

  /*
   * check if given string is a valid locale specifier
   */
  static bool
  chklocale(const char *locale)

pgsql-bugs by date:

Previous
From: pgsql-bugs@postgresql.org
Date:
Subject: Returned due to virus; was: Delivery Failure (webmaster@manager.co.th)
Next
From: Tom Lane
Date:
Subject: Re: pgsql 8.0 beta1 patch for token and timezone