KyotoCabinet を ruby で使ったときのメモ

インストール

Ubuntu 12.10 で kyotocabinet をインストールするには

apt-get install kyotocabinet-utils libkyotocabinet16 libkyotocabinet-dev

とする。ruby で使用するには gem をインストールする。

gem install 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

Tags of current page

,