3月 092013
 

Your ads will be inserted here by

Easy AdSense.

Please go to the plugin admin page to
Paste your ad code OR
Suppress this ad slot.

1. tokyo cabinet系统介绍
tokyo cabinet官方主页http://fallabs.com/tokyocabinet/,是一款kv型的数据库,没有数据类型,没有表的概念,key和value都可以是任意长度的字符串。
2. 安装
tokyo cabinet安装比较简单:
1. 下载源文件包:http://fallabs.com/tokyocabinet/tokyocabinet-1.4.47.tar.gz
2. 解压该文件:
tar zxvf tokyocabinet-1.4.48.tar.gz
3. 编译安装
cd tokyocabinet-1.4.48/
./configure ; make ; make install
上面及完成整个tokyo cabinet数据库的安装,tokyo cabinet的使用也非常简单,和通常意义上的数据库操作是类似的:
1. 首先打开数据库,得到和数据库操作的句柄
2. 使用该句柄执行操作
3. 释放该句柄

#include 
#include 
#include 
#include 
#include 
int main(int argc, char **argv){
    TCADB *adb;
    char *key, *value;
    /* create the object 初始化数据库*/
    adb = tcadbnew();
    /* open the database 打开并创建数据库*/
    if(!tcadbopen(adb, "casket.tch")){
        fprintf(stderr, "open error\n");
    }
    /* store records 插入数据*/
    if(!tcadbput2(adb, "foo", "hop") ||
       !tcadbput2(adb, "bar", "step") ||
       !tcadbput2(adb, "baz", "jump")){
        fprintf(stderr, "put error\n");
    }
    /* retrieve records 根据key值获取value*/
    value = tcadbget2(adb, "foo");
    if(value){
        printf("%s\n", value);
        free(value);
    } else {
        fprintf(stderr, "get error\n");
    }
    /* traverse records 遍历所有的数据*/
    tcadbiterinit(adb);
    while((key = tcadbiternext2(adb)) != NULL){
    value = tcadbget2(adb, key);
    if(value){
        printf("%s:%s\n", key, value);
        free(value);
    }
        free(key);
    }
    /* close the database 关闭数据库*/
    if(!tcadbclose(adb)){
        fprintf(stderr, "close error\n");
    }
    /* delete the object 删除数据库*/
        tcadbdel(adb);
    return 0;
}

Tokyo Cabinet的数据结构分为
1.Hash结构
2.B+Tree
3.定长数据库
但无论哪种数据结构,最后都会抽象为以下操作,以及分别对应不同的API

put

Hash: bool tchdbput2(TCHDB *hdb, const char *kstr, const char *vstr);
B+Tree: bool tcbdbput2(TCBDB *bdb, const char *kstr, const char *vstr);
Table: bool tctdbput3(TCTDB *tdb, const char *pkstr, const char *cstr);

Your ads will be inserted here by

Easy AdSense.

Please go to the plugin admin page to
Paste your ad code OR
Suppress this ad slot.

get

Hash: char *tchdbget2(TCHDB *hdb, const char *kstr);
B+Tree: char *tcbdbget2(TCBDB *bdb, const char *kstr);
Table: char *tctdbget3(TCTDB *tdb, const char *pkstr);

这样,就为开发相应的接口,增加了不少复杂度,需要针对不同的数据结构,去调用不同的API,但Abstract Database API有效减少了这个麻烦,看下面的代码

TCADB *adb = tcadbnew();
if(!tcadbopen(adb, dbname)) {
    fprintf(stderr, "open error: %s\n", dbname);
}
tcadbput2(adb, key, value);
if(!tcadbclose(adb)){
    fprintf(stderr, "close error:");
    return 0;
}
tcadbdel(adb);

一个tcadbput2,就可以代替所有的put方法了,adb是通过判断所操作数据库的扩展名,来决定调用哪种数据库的API,扩展名对应如下:
Hash: .tch
B+Tree: .tcb
定长数据库: .tcf
—相关API总结—
初始化数据库:adb = tcadbnew();
打开或创建数据库:tcadbopen(adb, “casket.tch”)
插入key-value值:tcadbput2(adb, “foo”, “hop”)
根据key值获取value:value = tcadbget2(adb, “foo”);
将数据库指针指向第0个数据(个人理解):tcadbiterinit(adb);
获取下一个key值,调用后指向下一位:key = tcadbiternext2(adb)
关闭数据库:tcadbclose(adb)
删除数据库:tcadbdel(adb);

参考:
http://qingfeng.github.com/2009/08/06/TokyoCabinet-Abstract-Database-API/
http://blog.csdn.net/xuqianghit/article/details/6929256