Tag/TokyoCabinet

Tokyo Cabinetを試してみる

Tokyo Cabinet第1版基本仕様書

に書かれているサンプルから、試してみる事にする。

試したコードはハッシュデータベースを使ったコード例

まず下記ソースコードをtchdb.cというファイルで保存した。

#include <tcutil.h>
#include <tchdb.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>

int main(int argc, char **argv){

   TCHDB *hdb;
   int ecode;
   char *key, *value;

   /* オブジェクトを作成する */
   hdb = tchdbnew();

   /* データベースを開く */
   if(!tchdbopen(hdb, "casket.hdb", HDBOWRITER | HDBOCREAT)){
       ecode = tchdbecode(hdb);
       fprintf(stderr, "open error: %s\n", tchdberrmsg(ecode));
   }

   /* レコードを格納する */
   if(!tchdbput2(hdb, "foo", "hop") ||
    !tchdbput2(hdb, "bar", "step") ||
    !tchdbput2(hdb, "baz", "jump")){
       ecode = tchdbecode(hdb);
       fprintf(stderr, "put error: %s\n", tchdberrmsg(ecode));
   }

   /* レコードを取得する */
   value = tchdbget2(hdb, "foo");
   if(value){
       printf("取得した値を表示:%s\n", value);
       free(value);
   } else {
       ecode = tchdbecode(hdb);
       fprintf(stderr, "get error: %s\n", tchdberrmsg(ecode));
   }

   /* 横断的にレコードを参照する */
   tchdbiterinit(hdb);
   while((key = tchdbiternext2(hdb)) != NULL){
       value = tchdbget2(hdb, key);
       if(value){
         printf("レコードを参照:%s:%s\n", key, value);
         free(value);
       }
       free(key);
   }

   /* データベースを閉じる */
   if(!tchdbclose(hdb)){
       ecode = tchdbecode(hdb);
       fprintf(stderr, "close error: %s\n", tchdberrmsg(ecode));
   }

   /* オブジェクトを破棄する */
   tchdbdel(hdb);

   return 0;
}

ファイルを確認する。

$ ls
tchdb.c

Cファイルが1つだけあるので、このファイルをコンパイルする必要がある。 次にファイルをコンパイルするのだが、 リンカオプションには

  • -ltokyocabinet
  • -lz
  • -lbz2
  • -lpthread
  • -lm
  • -lc

を加えてコンパイルする必要がある。 この時に作成する実行ファイルは今回は「tchdb」としたので、コマンドは下記になる。

$ cc -I/usr/local/include tchdb.c -o tchdb -L/usr/local/lib -ltokyocabinet -lz -lbz2 -lpthread -lm -lc
$ ls
tchdb*  tchdb.c

tchdbという実行ファイルがある事を確認。 次にそのファイルを実行する。

$ ./tchdb
取得した値を表示:hop
レコードを参照:foo:hop
レコードを参照:bar:step
レコードを参照:baz:jump

と表示されるはず。 実際に「casket.hdb」ファイルが出来ているかを確認する。

$ ls
casket.hdb  tchdb*  tchdb.c

出来ているので、試しに同じkeyへ他の値を入れてみる。 putしている部分で、fooに対して日本語の「ほげ」を入れてみる。

if(!tchdbput2(hdb, "foo", "ほげ") ||

書き換えたら、再度コンパイルして実行。

$ cc -I/usr/local/include tchdb.c -o tchdb -L/usr/local/lib -ltokyocabinet -lz -lbz2 -lpthread -lm -lc
$ ./tchdb
取得した値を表示:ほげ
レコードを参照:foo:ほげ
レコードを参照:bar:step
レコードを参照:baz:jump

こんな感じになった。 とりあえず日本語が通る事が確認でけた。

Posted at: 
2009/01/16 09:29:36
0 Comments
0 TrackBacks
Tags: 
TokyoCabinet
Trackback: 
http://kishi-r.com/2009/01/16/c_tokyocabinet/trackback/

MacPortsでTokyoCabinetインストール

まずTokyo CabinetをMacPortsでインストール出来るか、探してみる。

$ port search tokyo
tokyocabinet @1.3.9 (databases)
    Tokyo Cabinet is a library of routines for managing a database.

1.3.9が見つかったみたいなので、インストールしてみる。

$ sudo port install tokyocabinet
Password:
--->  Fetching tokyocabinet
--->  Attempting to fetch tokyocabinet-1.3.9.tar.gz from http://nchc.dl.sourceforge.net/tokyocabinet
--->  Verifying checksum(s) for tokyocabinet
--->  Extracting tokyocabinet
--->  Configuring tokyocabinet
--->  Building tokyocabinet
--->  Staging tokyocabinet into destroot
--->  Installing tokyocabinet @1.3.9_0
--->  Activating tokyocabinet @1.3.9_0
--->  Cleaning tokyocabinet

でけた。

ついでにpytcもインストールしておく。

$ sudo easy_install pytc
Password:
Searching for pytc
Reading http://pypi.python.org/simple/pytc/
Reading http://coderepos.org/share/wiki/PyTC
Best match: pytc 0.7
Downloading http://pypi.python.org/packages/source/p/pytc/pytc-0.7.tar.gz#md5=a7346ee22dbe772fbdcd989282335bd8
Processing pytc-0.7.tar.gz
Running pytc-0.7/setup.py -q bdist_egg --dist-dir /tmp/easy_install-WswIFi/pytc-0.7/egg-dist-tmp-hLMIrG
ld warning: in /opt/local/lib/libtokyocabinet.dylib, file is not of required architecture
zip_safe flag not set; analyzing archive contents...
Adding pytc 0.7 to easy-install.pth file

Installed /Library/Python/2.5/site-packages/pytc-0.7-py2.5-macosx-10.5-i386.egg
Processing dependencies for pytc
Finished processing dependencies for pytc

pytcがpythonから読み込めるのかチェックしてみる。

$ python
>>> import pytc

これでエラーが起きなければ、OK

読み込めない場合は、

>>> import pytc
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named pytc

こんなエラーが出るはず。

この原因は、pythonのバージョンをまず確認して、

そのバージョンのpythonのsite-packagesディレクトリにpytc(pytc-0.7-py2.5-macosx-10.5-i386.egg)が無いのが原因となる。

※まぁー自分のpythonが2.6だったので、読み込めないよって怒られてたんだけどねw

この場合は、ソースコードからインストールするなどの対処が必要となる。

ソースからインストールするには、ここからダウンロードしてインストールすれば解決。
$ sudo curl -O http://pypi.python.org/packages/source/p/pytc/pytc-0.7.tar.gz
$ ls
pytc-0.7.tar.gz
$ tar zxvf pytc-0.7.tar.gz
$ cd pytc-0.7
$ ls
PKG-INFO  pytc.c    setup.py*
$ sudo python2.6 setup.py build
running build
running build_ext
building 'pytc' extension
creating build
creating build/temp.macosx-10.5-i386-2.6
/usr/bin/gcc-4.0 -fno-strict-aliasing -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/opt/local/include -I/sw/include -I/opt/local/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6 -c pytc.c -o build/temp.macosx-10.5-i386-2.6/pytc.o
creating build/lib.macosx-10.5-i386-2.6
/usr/bin/gcc-4.0 -L/opt/local/lib -bundle -undefined dynamic_lookup build/temp.macosx-10.5-i386-2.6/pytc.o -L/usr/local/lib -L/opt/local/lib -L/sw/lib -ltokyocabinet -o build/lib.macosx-10.5-i386-2.6/pytc.so
$ sudo python2.6 setup.py install
running install
running build
running build_ext
running install_lib
copying build/lib.macosx-10.5-i386-2.6/pytc.so -> /opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages
running install_egg_info
Writing /opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/pytc-0.7-py2.6.egg-info

とりあえずでけたので、色々と弄ってみる事にする。

Posted at: 
2009/01/04 14:32:43
0 Comments
0 TrackBacks
Tags: 
Mac
TokyoCabinet
Trackback: 
http://kishi-r.com/2009/01/04/mac_tokyocabinet/trackback/

あわせて読みたい 人気ブログランキング - kishi-r.com track feed

Categories