转载:点击打开链接
1. 简介
在Apache2.1版本中引入了DBD 框架,DBD提供了一个统一的、抽象的数据库操作接口,封装了不同数据库之间的接口和实现差异。可以使我们很容易的编写跨数据库(coss-database)的程序。
2. 说明
本文的目的是简单的介绍如何在C开发的程序中开始使用DBD,而不具体介绍每个API的用法,所有接口的用法在DBD的接口文件apr-dbd.h中有详细的注释。
笔者所用的环境是:
ubuntu-8.04
gcc-4.1.3
3. 安装apr、apr-util及DBD:MySQL驱动
安装apr-util之前肯定要先安装apr,安装过程很简单:
tar zvxf apr-1.3.3.tar.gz
cd apr-1.3.3
./configure --prefix=/usr/local
make
sudo make install
tar zvxf apr-util-1.3.4.tar.gz
cd apr-util-1.3.4
./configure --prefix=/usr/local --with-apr=/usr/local --with-mysql
make
sudo make install
我们这里使用mysql数据库,DBD的MySQL驱动是作为一个DSO动态加载的。
配置apr-util时要带--with-mysql的选项,如果使用sqlite2的数据库则要带--with-sqlite2的选项。要使用其他数据库,输入./configure --help可以查看。
4. 如何使用
关于如何使用可以看apr-util项目中对DBD的测试代码,它是很好的使用DEMO。这里我做一下简单的介绍。
1. 初始化
APU_DECLARE(apr_status_t) apr_dbd_init(apr_pool_t *pool)
它主要是创建驱动的hash表,如果驱动是通过DSO动态的加载则创建的hash表为空表。
2. 动态加载
APU_DECLARE(apr_status_t) apr_dbd_get_driver(apr_pool_t *pool, const char *name, const apr_dbd_driver_t **driver)
如果驱动是静态编译到apr-util中,则此函数相当于直接从第一步创建的hash表中根据参数name取得driver。如果驱动是使用DSO动态加载,则函数根据参数name找到动态加载的模块,并将模块驱动加载到driver中。以后就可以用这个driver中提供的和具体数据库相关的操作了。
3. 打开数据库
APU_DECLARE(apr_status_t) apr_dbd_open(const apr_dbd_driver_t *driver, apr_pool_t *pool, const char *params, apr_dbd_t **handle)
这个函数返回的是一个对数据库操作的句柄。打开数据库后,以后所有对数据库的操作都是通过这个句柄来实现。参数params值得一提,没有文档专门的说明这个值应该传递什么,params的值对不同的数据库传递的值也不同。我分析过MySQL DBD的驱动代码,对于MySQL来说这里要传的是要打开数据库的几个要素,如:主机名(host),用户名(user),密码(pass),数据库名(dbname)等等,这些信息组织成一个键值对形式的字符串并以delims = " \r\n\t;|," 中的任意一种分割,如:params = "host=localhost;user=root;pass=12345;dbname=test"。
4. 对数据库进行操作
如创建一个表,代码如下:
static int create_table(apr_pool_t* pool, apr_dbd_t* handle, const apr_dbd_driver_t* driver)
{
int rv = 0;
int nrows;
const char *statement = "CREATE TABLE apr_dbd_test ("
"col1 varchar(40) not null,"
"col2 varchar(40),"
"col3 integer)" ;
rv = apr_dbd_query(driver, handle, &nrows, statement);
return rv;
}
关于操作数据库的其他API我不做多余的介绍,因为apr-dbd.h中已经有非常详细的注释了,并且你也可以查看apr-util中队DBD的测试程序,它们简直是使用DBD API入门的教科书,这里有两个测试程序,分别是:
1. test/dbd.c 它没有使用apr的测试框架,直接是把常用的数据库的操作都做了一遍,使用哪一个数据库驱动由你输入的命令行参数决定。
2 test/testdbd.c 它应用了apr的测试框架,和1差不都,我这里就不累述了。