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 TyrantRubyクライアントがまともに動かなかった。

やり直し

port uninstallして、本体も最新版をソースから入れ直す。Tokyo Cabinet, Tokyo Tyrantとも普通に

# ./configure
# make
# make install

でインストールできるが、Tokyo Cabinetのmake installが終わった後じゃないとTokyo Tyrantはmakeできない。しばらく悩んだ。

Ruby bindingsは、

TC-rubyRubyGemsのgemspecが同梱されているので、gemを作りたい人は作ってください。今のところ、二重管理が面倒なので、CPANRubyForgeへのアップロードは予定していません。

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
[]
[]