1. mod_dbd DBD 例子https://github.com/FreeSWITCH/FreeSWITCH/blob/master/libs/apr-util/test/dbd.c
用mod_dbd模块链接mysql数据库的实例 [原始链接]http://ywf676.blog.163.com/blog/static/1614215832012858120516/
#include"httpd.h"
#include"http_config.h"
#include"http_log.h"
#include"apr_dbd.h"
#include"mod_dbd.h"
staticint nocardpay_handler(request_rec*r)
{
apr_status_t rv;
conn_rec*conn= r->connection;
ap_set_content_type(r,"text/html"); /* 设置MIME类型,以方便客户端解析html标记 */
ap_dbd_t*dbd= NULL; /* mod_dbd.c模块所提供的数据类型 */
apr_dbd_results_t*res= NULL;
apr_dbd_row_t*row= NULL;
constchar*query="select * from user"; /* 将要执行的SQL语句,要求数据库的连接在mod_dbd.c中已经正确配置 */
constchar*host= NULL;
constchar*user= NULL;
constchar*password = NULL;
dbd= ap_dbd_acquire(r);
if(!dbd)
{
ap_log_rerror(APLOG_MARK, APLOG_ERR,0, r,"Unable to acquire a database connection ");
return DECLINED;
}
rv= apr_dbd_select(dbd->driver, r->pool, dbd->handle,&res, query,0);
if(rv!=0)
{
ap_log_rerror(APLOG_MARK, APLOG_ERR,0, r,"Query execution error looking up '%s' in database", r->uri);
return DECLINED;
}
while(apr_dbd_get_row(dbd->driver, r->pool, res,&row,-1)==0)
{
/* 获得一行中第0,1,2列的数据 */
host= apr_dbd_get_entry(dbd->driver, row,0);
user= apr_dbd_get_entry(dbd->driver, row,1);
password= apr_dbd_get_entry(dbd->driver, row,2);
ap_rputs("<p>", r);
ap_rputs(host, r);
ap_rputs(user, r);
ap_rputs(password, r);
ap_rputs("</p>", r);
}
return OK;
}
staticvoid nocardpay_register_hooks(apr_pool_t*p)
{
ap_hook_handler(nocardpay_handler, NULL, NULL, APR_HOOK_MIDDLE);
}
/* Dispatch list for API hooks */
module AP_MODULE_DECLARE_DATA nocardpay_module =
{
STANDARD20_MODULE_STUFF,
NULL, /* create per-dir config structures */
NULL, /* merge per-dir config structures */
NULL, /* create per-server config structures */
NULL, /* merge per-server config structures */
NULL, /* table of config file commands */
nocardpay_register_hooks /* register hooks */
};
3.使用apr-util中的DBD API 【原始链接】http://www.cnblogs.com/codr/archive/2008/10/23.html
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差不都,我这里就不累述了