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