免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2267 | 回复: 3
打印 上一主题 下一主题

PostgreSQL 8.0 dev diff patch [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-08-11 17:36 |只看该作者 |倒序浏览
注意: 把附件 pg80d_dif.zip.jpg 改名为 pg80d_dif.zip,解压即可.

Subject: 如何解决中文环境下 PostgreSQL 8.0 dev 的 token 和 timezone 问题
Author : Wwashington@smth bbs
Release: 2004/08/09

前言:PostgreSQL 是最强大的开放源码数据库,目前的 7.5 dev 突然变成 8.0 dev 了。既然是 dev 版肯定存在不少问题,导致使用不便甚至无法安装。我这篇文档是针对 2004/08/08 的 postgresql-snapshot.tar.gz 制作的,其他版本请大家自行研究。

关于 dev 版下载,http://mirrors.isc.org/pub/postgresql/dev/postgresql-snapshot.tar.gz

Part A. 故障描述

1) FATAL:  syntax error in file "E:/Unix/Sys/Pgsql/data/postgresql.conf"
line 261, near token "s"

2) WARNING:  could not find a match for Windows timezone "中国标准时间"

Part B. 故障分析

1) initdb -U postgres -D "E:/Unix/Sys/Pgsql/data" -L "E:/Unix/Sys/Pgsql/share" --noclean
使用这个脚本初始化,发现 near token "s" 错误,不删除错误配置,发现问题在 Chinese_People's

2) initdb -U postgres -D "E:/Unix/Sys/Pgsql/data" -L "E:/Unix/Sys/Pgsql/share" --locale=C
对于第一个问题,可以用上面的办法初始化,但是又出现了第二个问题,也就是 timezone 无法匹配

Part C. 故障解决

1) 经研究,token 问题是因为 src/bin/initdb/initdb.c 里面缺少了语法分析,由于时间关系,我只做了针对中文的快速补丁。真正支持多语言的补丁,应该是预先扫描 lc_messages、lc_monetary、lc_numeric、lc_time 的 string 里是否含有单引号(即'号),如果有则在前面增加反斜杠(即\号),可以用 &str 的形式取得指针然后进行字符串处理。

/* 如果检测到 's 就修改为 \'s,因为 Unix 的 Sed 语法需要反斜线 \ 作为定义符 */

        if (strcmp(lc_messages,"Chinese_People\'s Republic of China.936"==0 )
           {
             sprintf(lc_messages,"%s","Chinese_People\\\'s Republic of China.936";
           }
        if (strcmp(lc_monetary,"Chinese_People\'s Republic of China.936"==0 )
           {
             sprintf(lc_monetary,"%s","Chinese_People\\\'s Republic of China.936";
           }
        if (strcmp(lc_numeric,"Chinese_People\'s Republic of China.936"==0 )
           {
             sprintf(lc_numeric,"%s","Chinese_People\\\'s Republic of China.936";
           }
        if (strcmp(lc_time,"Chinese_People\'s Republic of China.936"==0 )
           {
             sprintf(lc_time,"%s","Chinese_People\\\'s Republic of China.936";
           }

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

2) 经研究,timezone 问题是因为 src/timezone/pgtz.c 按英文处理 locale,但是系统显示的是中文信息,所以必须增加一个本地语言的扫描,把所有的 locale 做一个合适的对应。由于时间关系,我没有写完整的函数,只对中文做了快速补丁。

        if (strcmp(tzname, "中国标准时间"==0 )
           {
             sprintf(tzname, "%s", "China Standard Time";
           }
                  
        for (i=0; win32_tzmap.stdname != NULL; i++)
        { ......
        }

pg80d_dif.zip.jpg

2.84 KB, 下载次数: 27

论坛徽章:
0
2 [报告]
发表于 2004-08-11 17:43 |只看该作者

PostgreSQL 8.0 dev diff patch

糟糕,发不了附件,想要的直接找我吧.刚才测了一下,对 8.0beta1也有效.

论坛徽章:
0
3 [报告]
发表于 2004-08-11 21:23 |只看该作者

PostgreSQL 8.0 dev diff patch

我觉得用 set TZ=CCT 更通用些。
不过对windows不熟,不知道有没有什么系统调用来处理更好些。

论坛徽章:
0
4 [报告]
发表于 2004-08-12 17:24 |只看该作者

PostgreSQL 8.0 dev diff patch

呵呵,你说的也是一个思路,象 PowerGres(PostgreSQL 7.3.6) 那样,直接设成 GMT 也很方便啊.但是这就丧失了系统检测 timezone 的意义了,不是吗?检测到 timezone 并且翻译成 encode 库里的名单,才是正解啊.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP