PostgreSQL9.3dev 源码阅读: 开篇(系统启动)

一直没有集中的时间和精力去好好阅读PostgreSQL(后边简称postgres或者PG)的源码,由于平时大都工作在windows平台,所以,也懒得切换到linux vm下,尝试直接通过VisualStudio2008来理顺PG中的代码。由于都是用C所写,可移植性相当好,读懂了一个平台,换到另一个平台,相信不是什么难事。

可以说,PG的代码注释非常漂亮,也很完整,只可惜本人水平有限,难以在短时间内获得大收获。

一、准备工作:

你所要的,是一份完整的源码和VisualStudio2008开发境。完整的源码有两种途径:
1.  直接从PG官网上下载一份比较近的源码,如:
     http://ftp.postgresql.org/pub/source/v9.2.1/postgresql-9.2.1.tar.gz  (9.2.1)

2. 直接使用GIT,本地clone一份,可以得到最新的源码
     有精力的话,可以参考PG的相关文档,它会告诉你如何获取最新的源码

3. 1和2的区别是什么?
    1里有关SQL的语法解析.l, .y已经免去了,直接有生成的代码。如果是2, 则需要flex和bison (GnuWin32工具)生成对应的代码。

4. 下载一个windows版本的Perl吧。生成VC的工程需要它。假定Perl安装到c:\perl

二、编译一个Debug版本
进到代码$pg\src\tools\vc目录,创建一个config.pl文件,内容大致如下:

# Configuration arguments for vcbuild.
use strict;
use warnings;

our $config = {
    asserts => 0,    # --enable-cassert
      # integer_datetimes=>1,   # --enable-integer-datetimes - on is now default
      # float4byval=>1,         # --disable-float4-byval, on by default
      # float8byval=>0,         # --disable-float8-byval, off by default
      # blocksize => 8,         # --with-blocksize, 8kB by default
      # wal_blocksize => 8,     # --with-wal-blocksize, 8kB by default
      # wal_segsize => 16,      # --with-wal-segsize, 16MB by default
    ldap    => 1,        # --with-ldap
    nls     => undef,    # --enable-nls=<path>
    tcl     => undef,    # --with-tls=<path>
    perl    => 'c:\Perl',    # --with-perl
    python  => undef,    # --with-python=<path>
    krb5    => undef,    # --with-krb5=<path>
    openssl => undef,    # --with-ssl=<path>
    uuid    => undef,    # --with-ossp-uuid
    xml     => undef,    # --with-libxml=<path>
    xslt    => undef,    # --with-libxslt=<path>
    iconv   => undef,    # (not in configure, path to iconv)
    zlib    => undef     # --with-zlib=<path>
};

1;

[注意:],因为只是阅读源码,一些第三方的依赖包,这里全部弄成undef,如果想自己构建完整的PG包,那则需要好好整理了。

这样,你的基本环境就具备了。 先进入VS2008的编译命令行(菜单里头进)。进到刚才的"tools"目录,命令行下,运行:

build.bat DEBUG

进入漫长的编译过程。

编译完成以后,就可以运行install.bat  d:\pgsql,将其安装到d:\pgsql里头了。

三、调试

为发布目录d:\pgsql设置几个简单的环境变量:

PGHOME   ->  d:\pgsql
PGDATA     -> %PGHOME%\data
PATH          -> %PGHOME%\bin;%PGHOME%\lib;%PATH%
在这之后,进到目录:

d:\pgsql, 运行以下几个简单的命令:
initdb -E UTF-8 --locale=chs
pg_ctl start
createdb iihero
psql iihero
这样,即可进到psql的运行环境。

想要调试,只要用VS2008打开pgsql\pgsql.sln方案文件,所有的工程即会打开。attach上你所要的postgres.exe进程即可。

以上是所有的从源码到调试的最基本的准备工作。

四、Win32下是如何启动的:
也就是说pg_ctl.exe是从哪个地方进去的?
入口点在:
bin->工程pg_ctl->pg_ctl.c,这个文件只有在win32平台才需要。别的平台上也没有pg_ctl这个可执行程序。它的作用只是要启动一个进程postgres.exe, 然后自己退出。
       通过getopt_long(argc, argv, "cD:l:m:N:o:p:P:sS:t:U:wW", long_options, &option_index), 得到正确的命令行参数,
       如果得到的是start命令:START_COMMAND,  do_wait置为false,如果是STOP,则do_wait置为true。
       紧接着会调用do_start() (针对START_COMMAND)
       它会调用start_postmaster(),然后结束(不用wait)
       你如果细看一下start_postmaster() 的实现,会发现它就是通过调用CreateRestrictedProcess(cmd, ...),通过命令行,来创建一个进程postgres,而这个进程的实现位于:  (工程)postgres->src->main->main.c
       在启动过程中又会创建若干子进程。
       代码浏览路径:
       postgres->src->backend->main->main.c

       再到bootstrap, 再到:
       postgres->src->backend->postmaster->*.c

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iihero

谢谢打赏,不断前行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值