Tag/TokyoCabinet
Tokyo Cabinetを試してみる
に書かれているサンプルから、試してみる事にする。
試したコードはハッシュデータベースを使ったコード例
まず下記ソースコードを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/

