2014年01月15日 星期三 17:17
APR的dbd模块提供操作关系数据库的功能,目前APR支持多种关系数据库,包括MySQL,PostgreSQL,SQLite等,以下代码示例演示了如何通过APR dbd模块操作MySQL数据库,包括建立连接,Escape操作,Prepared模式,Transaction等。
#include <stdio.h>
#include <apr.h>
#include <apr_pools.h>
#include <apr_errno.h>
#include <apr_strings.h>
#include <apr_dbd.h>
void apr_err(const char *s, apr_status_t rv)
{
char buf[120];
fprintf(stderr, "%s: %s (%d)\n", s,
apr_strerror(rv, buf, sizeof buf), rv);
}
int main(int argc,char **argv) {
apr_initialize();
apr_pool_t *pool;
apr_pool_create(&pool,NULL);
apr_status_t st;
apr_dbd_t *db;
apr_dbd_init(pool);
const apr_dbd_driver_t *driver=NULL;
st=apr_dbd_get_driver(pool,"mysql",&driver);
if(st != APR_SUCCESS) {
apr_err("apr_dbd_get_driver()",st);
return st;
}
char *params=apr_psprintf(pool,
"host=%s,port=%d,user=%s,pass=%s,dbname=%s",
"10.1.9.140",3306,"user","pass","test");
st=apr_dbd_open(driver,pool,params,&db);
if(st != APR_SUCCESS) {
apr_err("apr_dbd_open()",st);
return st;
}
char *fmt="insert into friends (name,email) values ('%s','%s')";
const char *e_name=apr_dbd_escape(driver,pool,"laomeng",db);
const char *e_email=apr_dbd_escape(driver,pool,"laomeng188@163.com",db);
char *sql=apr_psprintf(pool,fmt,e_name,e_email);
int nrows=0;
st=apr_dbd_query(driver,db,&nrows,sql);
printf("nrows = %d\n",nrows);
apr_dbd_prepared_t *pdt=NULL;
char *pdq="insert into friends (name,email) values (%s,%s)";
st=apr_dbd_prepare(driver,pool,db,pdq,NULL,&pdt);
if(st != APR_SUCCESS) {
apr_err("apr_dbd_prepare()",st);
return st;
}
apr_dbd_transaction_t *trs=NULL;
st=apr_dbd_transaction_start(driver,pool,db,&trs);
st=apr_dbd_pvquery(driver,pool,db,&nrows,pdt,"laoli","laoli@qq.com");
if(st != APR_SUCCESS) {
apr_err("apr_dbd_pvquery()",st);
return st;
}
st=apr_dbd_transaction_end(driver,pool,trs);
char *sel="select name,email from friends";
apr_dbd_results_t *res=NULL;
st=apr_dbd_select(driver,pool,db,&res,sel,-1);
if(st != APR_SUCCESS) {
apr_err("apr_dbd_select()",st);
fprintf(stderr, "%s\n", apr_dbd_error(driver,db,st));
return st;
}
nrows=apr_dbd_num_tuples(driver,res);
printf("rows of result: %d\n",nrows);
int ncols=apr_dbd_num_cols(driver,res);
printf("cols of result: %d\n",ncols);
apr_dbd_row_t *row=NULL;
for(int i=1; -1 != apr_dbd_get_row(driver,pool,res,&row,i);i++ ) {
printf("name = %s, email = %s\n",apr_dbd_get_entry(driver,row,0),apr_dbd_get_entry(driver,row,1));
}
apr_dbd_close(driver,db);
apr_pool_destroy(pool);
apr_terminate();
return 0;
}
参考资料:
http://apr.apache.org/docs/apr-util/1.3/group___a_p_r___util___d_b_d.html
Zeuux © 2025
京ICP备05028076号