KyotoCabinet を ruby で使ったときのメモ
インストール
Ubuntu 12.10 で kyotocabinet をインストールするには
apt-get install kyotocabinet-utils libkyotocabinet16 libkyotocabinet-dev
とする。ruby で使用するには gem をインストールする。
gem install kyotocabinet-ruby
とりあえず読む
- http://fallabs.com/kyotocabinet/rubydoc/
- KyotoCabinetをrubyで使う前に - みくりや -
- KyotoCabinetをrubyで使う(基本) - みくりや -
- KyotoCabinetをrubyで使う (キーをたどる) - みくりや -
注意点
使い方に関しては、上で挙げたサイトを見れば良いのだが、 今度、使用するときに忘れていそうな注意を書いておく。 gem は kyotocabinet-ruby 1.27.1 を使用した。
size と count
Hash みたいに全要素の数が欲しくて size を使うとはまる。 KyotoCabinet::DB#size はデータベースのファイルサイズで KyotoCabinet::DB#count が要素の数。
require 'kyotocabinet'
db = KyotoCabinet::DB::new
unless db.open('casket.kch', KyotoCabinet::DB::OWRITER | KyotoCabinet::DB::OCREATE)
STDERR.printf("open error: %s\n", db.error)
end
100.times do |n|
db.set(n.to_s, n.to_s)
end
p db.size # File size of database
p db.count # Item number of database
unless db.close
STDERR.printf("close error: %s\n", db.error)
end
each での raise や break
KyotoCabinet::DB#each で raise や break を実行しても、ループを抜けない。 KyotoCabinet::DB#each の返り値が false になるだけ。
require 'kyotocabinet'
db = KyotoCabinet::DB::new
unless db.open('casket.kch', KyotoCabinet::DB::OWRITER | KyotoCabinet::DB::OCREATE)
STDERR.printf("open error: %s\n", db.error)
end
3.times do |n|
db.set(n.to_s, n.to_s)
end
res = db.each do |key, val|
p [key, val]
end
p res # => true
res = db.each do |key, val|
break if key == "1"
p [key, val]
end
p res # => false
res = db.each do |key, val|
raise "Error" if key == "1"
p [key, val]
end
p res # => false
unless db.close
STDERR.printf("close error: %s\n", db.error)
end
each 内で get できない
KyotoCabinet::DB#each で KyotoCabinet::DB#get するとエラーになる。
require 'kyotocabinet'
db = KyotoCabinet::DB::new
unless db.open('casket.kch', KyotoCabinet::DB::OWRITER | KyotoCabinet::DB::OCREATE | KyotoCabinet::DB::OTRYLOCK | KyotoCabinet::DB::ONOLOCK)
STDERR.printf("open error: %s\n", db.error)
end
3.times do |n|
db.set(n.to_s, n.to_s)
end
res = db.each do |key, val|
p [key, val]
p db.get(key)
end
unless res
puts "Error: #{db.error}"
end
unless db.close
STDERR.printf("close error: %s\n", db.error)
end