文章目录

由于PostgreSQL的代码托管是使用GIT做源码管理工具的,需要先安装git。

1
yum install git

所有的PostgreSQL项目的代码可以在这里找到。将代码clone到本地

1
git clone git://git.postgresql.org/git/postgresql.git

然后使用git checkout切换到9.3.4版本。并将该版本的代码copy一份当做working copy

1
2
3
cd postgresql/
git checkout REL9_3_4
cp -r postgres pg9.3.4

接下来build整个项目,先做configure

1
2
3
mkdir project
cd pg9.3.4/postgresql
./configure --prefix=$HOME/project --enable-depend --enable-cassert --enable-debug

其实可以通过./configure --help来看所有参数,部分参数解释如下

1
2
3
4
5
6
--enable-debug build with debugging symbols (-g)
--enable-profiling build with profiling enabled
--enable-coverage build with coverage testing instrumentation
--enable-dtrace build with DTrace support
--enable-depend turn on automatic dependency tracking
--enable-cassert enable assertion checks (for debugging)

--enable-debug是在make的过程中将编译信息带入到程序中,以便debug;--enable-cassert是在编译的过程中保留所有的assert校验,这个在debug的过程中也非常重要。

然后用make编译,发现编译不过,先提示需要安装bison,安装后编译,提示还要安装flex,于是安装这两个依赖

1
yum install bison flex

注意,安装完依赖之后,需要再次confugure,才能编译通过,不然还会提示一样的错误。confugure后再次编译,就会发现可以编译通过,如下图。

开发的IDE采用Eclipse,需要安装Eclipse和Eclipse的C++开发插件CDT,

1
yum install eclipse eclipse-cdt readline-devel

然后在eclipse中新建一个C++ project。注意,因为很多程序的运行和调试都要在postgres用户下完成,所以应该把eclipse project建立在postgres用户下。切换到postgres用户下,重新上述步骤编译PostgreSQL。

1
2
3
[postgres@anzhy ~]$ mkdir -p project
[postgres@anzhy ~]$ sudo cp -r /root/pg9.3.4 .
[postgres@anzhy ~]$ sudo chown postgres:postgres -R pg9.3.4/

在建立项目的时候,选择"Makefile Project with Existing Code",以已编译过的PostgreSQL代码来建立project,如下图。

eclipse通常会自动build当前project,如果出于速度考虑,可以将自动编译(auto-build)选项关掉。

如果要debug PostgreSQL的某个程序的话,需要先make install,由于我们编译的时候使用了--prefix=$HOME/project参数,所以会安装在$HOME/project这个目录下。例如,如果要debug initdb,需要先在eclise中建立调试的Application,并加上-D参数指定数据库存储文件的目录,如下图。

如果要debug真正执行的程序,多数情况下,PostgreSQL的debug都是这种情况,我们可以用"C/C++ Attach to Application",将debug的程序指定为真正运行的某个postgres进程,由于每个psql连接都会启动一个新的postgres进程,通常需要调试pid最大的那个,也就是最后连接上的那个psql,如下图。

然后就可以开始debug了,单步调试等等,在psql中执行的sql会暂停在那里直到debug完成。

如果要进行PostgreSQL的单元测试,在代码的src\test目录下,有所有的测试案例。运行前需要先make。examples目录下有单元测试的样例,regress目录下是基本的单元测试案例,该目录下的pg_regress程序是单元测试的主程序,可以用pg_regress --help来查看所有参数。

regress目录下,单元测试的测试项目记录在schedule文件中,例如,serial_schedule就是串行执行每个测试案例。另外,input目录下,是输入文件,包括一些create table语句;data目录下,存放的是数据;sql目录下,是测试用到的sql;results目录下,存放的是测试结果。regressplans.sh是执行测试用的脚本,执行脚本即可开始单元测试。

为了方便后续使用,可以加入一些PostgreSQL的环境变量,如下,

1
2
3
4
export POSTGRESQLHOME=/home/postgres/project
export PGDATA=$POSTGRESQLHOME/data
export LD_LIBRARY_PATH=$POSTGRESQLHOME/lib:$LD_LIBRARY_PATH
export PATH=$POSTGRESQLHOME/bin:/usr/local/pgadmin3/bin:/home/program/bin:$PATH

文章目录

欢迎来到Valleylord的博客!

本博的文章尽量原创。