Ruby with Berkeley DB

プログラミング言語Rubyに限らず,PostgreSQLMySQL等のデータベースを使うアプリが流行っています.しかし,熟練のプログラマなら,ちょっとしたデータ操作にわざわざリレーショナル・データベースを使うことに抵抗があるでしょう.ハッカーとは,常にシンプルでオプティマイズされたものを求めるものです.
そこでバークレーDB.Rubyは,デフォルトでDBMやGDBMを利用するライブラリが添付されています.ただし,大きくただし書きされているように,それらは「ファイルに保存されるハッシュクラス」で,さらに「キーもバリューもstringクラス」しか扱えないという大きな短所があります.

Ruby/Berkeley DBは,その短所が無いので,お勧めです.ハッシュや配列クラスのようにお手軽に使えます.

バークレーDBは,最近のLinuxディストリビューションだと,デフォルトで入っているようです.手元のCent OS 5.1だと,次のように入っていました.

# ls -l /usr/lib/libdb-4.3.*

  • rw-r--r-- 1 root root 1353252 1月 7 2007 /usr/lib/libdb-4.3.a
  • rw-r--r-- 1 root root 800 1月 7 2007 /usr/lib/libdb-4.3.la

lrwxrwxrwx 1 root root 22 9月 11 00:01 /usr/lib/libdb-4.3.so -> ../../lib/libdb-4.3.so

もし,バークレーDBが入っていない,もしくは最新のバークレーDBを使いたい場合は,現在のところ次のように取得できます.

# wget http://download.oracle.com/berkeley-db/db-4.6.21.NC.tar.gz

これは,ディスク上の自動暗号化等の機能が無いバージョンです.通常はこれで十分だと思います.
.gzを展開すると,db-4.6.21.NCというディレクトリが出来ますので,入ってコンフィギュア&インストール.

# cd db-4.6.21.NC/build_unix
# ../dist/configure
# make
# make install

終ったら,Ruby/bdbをインストールしましょう.

# wget ftp://moulon.inra.fr/pub/ruby/bdb.tar.gz
# gzip -d bdb.tar.gz
# tar xvf bdb.tar.gz
# cd bdb-0.62
# ruby extconf.rb --with-db-dir=/usr/local/BerkeleyDB.4.6/
# ruby extconf.rb
# make
# make install

バークレーDBはSQL構文が無い代わりに,簡単に使えます.少し凝ろうと思えば,トランザクションやなんかもあります.
とりあえず,ハッシュ関数的に簡単に使うサンプルプログラムを.

お好きなエディタで,次のようなデータベース書き込みサンプル,読み込みサンプルプログラムを作成下さい.


write.rb

#!/usr/bin/ruby
require 'bdb'
hello = BDB::Btree::open("./testdb","table1","w",0777);
hello["world"]="install ok";
hello["lucky"]=777;
hello[777]="happy";
hello.close();


read.rb

#!/usr/bin/ruby
require 'bdb'
hello = BDB::Btree::open("./testdb","table1","r",0777);
p hello["world"];
p hello["japan"];
p hello["lucky"];
p hello[777];
p hello[666];
hello.close();


データベース書き込みを実行しましょう.

# ruby write.rb

読み込みを実行しましょう.

# ruby read.rb
"install ok"
nil
"777"
"happy"
nil

一応,やたら詳しく説明を入れますと,

"install ok" <----- write.rbで,hello["world"]="install ok"と定義したので,read.rbのp hello["world"]で表示された
nil <----- write.rbで定義が無いので,read.rbのp hello["japan"]で何も表示されなかった
"777" <----- write.rbで,hello["lucky"]=777と定義したので,read.rbのp hello["lucky"]で表示された
"happy" <----- write.rbで,hello[777]="happy"と定義したので,read.rbのp hello[777]で表示された
nil <----- write.rbで,hello[666]=の定義が無いので,表示されなかった

このように,キーやバリューが文字列じゃなくて数字でもなんでも使うことができます.
濃い操作が必要無い場合は,このような組み込み型の軽いデータベースを使うのが筋ってものです.