LibSDB官方资料 http://siag.nu/libsdb/ 提供各个版本的source安装包下载, 说明文档, 一个demo
这个东西具有以下优点 :
1 小
2 原生c语言编写, 移植相对简单
3 采用类似jdbc这样的url连接各种数据库, 目前支持ODBC(cygwin), Lago,Mysql,Sqlite,Mimer,Postgresql,Oracle,Gdbm,MiniSQL
4 openSource 这个就不多说了
缺点:
暂时未发现获取字段名的接口, 我只能分析select语句的 字段列表,自己来维护
* query.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <unistd.h>
#include "common.h"
#include "sdb.h"
static int persistent = 0;
/*回调函数,获取查询数据的接口,用户提供
*@ param int n 字段数
*@ param char **p 结果集,全部为字符类型了,自己去做转换
*@ param void *closure 出口参数, 结果集最终会通过这里返回,但是处理工作由你来做
*/
static int db_callback(int n, char **p, void *closure) {
int i;
char b[10];
if (!n)
return 0;
sprintf(b, "%d ", n);
printf("共%s个字段\t", b); /* 列数 */
for (i = 0; i < n; i++) {
char *q = p[i];
if (q == NULL)
q = "";
sprintf(b, "%ld ", (long)strlen(q));
//printf("共%s位\t", b); //打印数据长度
printf("%s\t", q);
}
printf("\n");
return 0;
}
int main(int argc, char **argv){
char u[1024];
char *db;
char sqlstr[1024];
if (argc < 1) {
printf("Usage: sdb_client [options] url\n");
exit(0);
}
//打开url指向数据库,
db = sdb_open(argv[1]);
if (db == NULL) {
printf("sdb_open 失败");
}
sprintf(sqlstr,"SELECT %s, %s, %s, %s FROM %s "
"ORDER BY acttime ",
"acttime",
"seq_num",
"msg",
"connname",
"mtmsg");
//查询 , 传递 db(数据库连接) , sqlstr (sql语句), db_callback(回调函数指针), 参数出口
sdb_query(db, sqlstr, db_callback, NULL);
if (db) sdb_close(db);
}
sdb_query原型:
int sdb_query(char *url, char *query,int (*callback)(int, char **, void *), void *closure)
各种数据库对应的URL
mysql:host=XXX:db=XXX:uid=XXX:pwd=XXX
postgres:host=XXX:db=XXX:port=XXX
oracle:uid=XXX:pwd=XXX OR oracle:uid=username/password@instance
sqlite:db=/full/path/to/db
lago:host=XXX:port=XXX:db=XXX:uid=XXX:pwd=XXX
mimer:
odbc:dsn=postgresql
gdbm:db=foo.db