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
|
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: