Tokyo Cabinet的Abstract Database API


你知道就算大雨让这座城市颠倒 我会给你怀抱 受不了看见你背影来到 写下我度秒如年难捱的离骚

简介

抽象データベースは、オンメモリハッシュデータベースとオンメモリツリーデータベースとハッシュデータベースとB+木データベースと固定長データベースとテーブルデータベースを同一のAPIで抽象化したデータベースです。それを扱うのが抽象データベースAPIです。`tcadb.h' にAPIの仕様の完全な記述があります。

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);
  • 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的调用

在特殊情况下,不同的数据结构,又提供了一些自己独有的API,例如B+Tree,可以添加重复的key,这时就需要用到tcbdbputdup2方法,用adb如何调用呢,看代码
TCADB *adb = tcadbnew();
if(!tcadbopen(adb, dbname)) {
    fprintf(stderr, "open error: %s\n", dbname);
}
tcbdbputdup2(adb->bdb, key, value);
if(!tcadbclose(adb)){
    fprintf(stderr, "close error:");
    return 0;
}
tcadbdel(adb);
通过adb->bdb就可以指定现在的抽象数据库为一个B+Tree数据库,其他数据库的获取方式如下:
  • Hash: adb->hdb
  • B+Tree: adb->bdb
  • 定长数据库: adb->fdb

qingfeng at me.com