Mac OSXにTokyoCabinetをインストールした。
ファーストトライ
本体はportで入れた。(→ダメでした。後述)
$ port search tokyocabinet tokyocabinet @1.4.5 (databases) Tokyo Cabinet is a library of routines for managing a database. $ port search tokyotyrant tokyotyrant @1.1.14 (databases) Tokyo Tyrant is the network interface for Tokyo Cabinet. $ sudo port install tokyocabinet $ sudo port install tokyotyrant
Ruby API/クライアントは現時点でオフィシャルなgemは配布されてないみたい。
# gem search --remote tokyocabinet *** REMOTE GEMS *** careo-tokyocabinet (1.21) # gem search --remote tokyotyrant *** REMOTE GEMS *** actsasflinn-ruby-tokyotyrant (0.1.5) careo-tokyotyrant (1.3.0.1)
ソースにgemspecが付いてたのでgemをbuildして入れた。
# wget http://tokyocabinet.sourceforge.net/rubypkg/tokyocabinet-ruby-1.23.tar.gz # tar xzf tokyocabinet-ruby-1.23.tar.gz # cd tokyocabinet-ruby-1.23 # gem build tokyocabinet.gemspec # gem install tokyocabinet-1.23.gem # wget http://tokyocabinet.sourceforge.net/tyrantrubypkg/tokyotyrant-ruby-1.5.tar.gz # tar xzf tokyotyrant-ruby-1.5.tar.gz # cd tokyotyrant-ruby-1.5 # gem build tokyotyrant.gemspec # gem install tokyotyrant-1.5.gem
これでは全然ダメだった。Ruby bindingsに対して、portで入れた本体が古すぎた。プロトコルのバージョンが変わっているせいか、Tokyo TyrantのRubyクライアントがまともに動かなかった。
やり直し
- [mixi] Tokyo Cabinetリリース報告 http://mixi.jp/view_bbs.pl?id=33580292&comm_id=3528783
port uninstallして、本体も最新版をソースから入れ直す。Tokyo Cabinet, Tokyo Tyrantとも普通に
# ./configure # make # make install
でインストールできるが、Tokyo Cabinetのmake installが終わった後じゃないとTokyo Tyrantはmakeできない。しばらく悩んだ。
Ruby bindingsは、
TC-rubyはRubyGemsのgemspecが同梱されているので、gemを作りたい人は作ってください。今のところ、二重管理が面倒なので、CPANやRubyForgeへのアップロードは予定していません。
http://mixi.jp/view_bbs.pl?id=33580292&comm_id=3528783
ということなので、上記のままで大丈夫。
実験
require 'rubygems' require 'tokyotyrant' (c = TokyoTyrant::RDBTBL.new).open('127.0.0.1', 1978) c["a"] = {"aa" => "bb", "cc" => "dd" } qry = TokyoTyrant::RDBQRY.new(c) qry.addcond("aa", TokyoTyrant::RDBQRY::QCSTREQ, "bb") p qry.searchcount p qry.search p qry.searchget c.clear # データが全部消えるので要注意。 p qry.searchcount p qry.search p qry.searchget c.close
portで入れた状態では、
- qry.searchcount が少ない値を返す。
- qry.searchget が正しい値を返さない。
- c.clear で止まってしまう。
みたいな状況で正しく動作していないことに気づいた。
ソースから入れ直して以下が出力されるようになった。たぶん正常。
1 ["a"] [{"aa"=>"bb", "cc"=>"dd", ""=>"a"}] 0 [] []