Entry

Berkeley DB XML で NXD みたいなことをしてみる

2005年12月23日

Sleepcat の Berkeley DB XML(以下 BDB XML)は XQuery をサポートする NXD です。先日から XML の文書管理をごにょごにょと考えていて,いぢってみることにしました。当初は自前で管理ツールを作るのもアリなのかなぁ,と思っていたんですけれど,あたしの浅知恵なんかよりよっぽど優れています。

もっとも,NXD というと XSLT や XQuery を使って問い合わせるのが通常ですけれど ,肝心の XQuery はというと,現在のところ W3C の勧告候補(Candidate Recommendation)にとどまっていたりします。現在の最新バージョンである BDB XML 2.2 は,XQuery 1.0 working draft(2005年4月)に基いているそうですから,ここでいぢる問い合せ方法はまだ決定稿とは言えないようです。XQuery ってかなり昔から策定作業が進んでたと思うけれど,まだ勧告候補だったんですね。

BDB XML には Java と C++ の2種類が用意されていて(Java の Xerces と Xerces C++ をパーサに使っている),これを使った API として Perl,Python,PHP,Tcl,Ruby 等々といった言語環境が用意されているようです。ただ,ここでは API いぢることはしないで,ビルドするときに一緒にできる dbxml というコマンドラインのプログラムをいぢってみようと思います。BDB XML には C++ 版を使います。

ビルドする

とりあえず,BDB XML のダウンロード・ページからソースをいただいてきたら,アーカイブを解凍してビルドします。ビルドは buildall.sh なるスクリプトが用意されているので,これを走らせるだけでオッケーです。FreeBSD 5.4R ではこんな感じ……。

# cd dbxml-2.2.8
# sh buildall.sh -p freebsd -c gcc -x g++ -m gmake

Xerces C++ がどうもコンパイルできないなぁ……と思っていたら,FreeBSD 付属の make を使っていたのが原因でした。-m オプションで gmake を使う必要があるみたい。buildall.sh は他にもたくさんのオプションがあるので,適宜試してみるといいと思います(--help でオプションの一覧を見ることができる)。

無事にビルドが終わると,./install 以下にできたものが入ります。一応,ビルド・オプションに --with-dbxml-prefix なるオプションもあるんですけれど,うちの環境ではどうもうまくいかなかったので,触らないで手動でインストールしておきます。

dbxml を使う準備

できたら早速いぢりたいところですけれど,その前に準備をば……。FreeBSD 5.4 を使っている場合,shared object 周りで不都合が出るそうなので,/etc/libmap.conf の冒頭に以下の行を追加しておきます(libmap.conf(4) の例を真似ただけ)。

libc_r.so.5             libpthread.so.1
libc_r.so               libpthread.so

また,ライブラリ・パスが通っていないところにインストールした場合は,環境変数 LD_LIBRARY_PTH と LD_RUN_PATH も指定しておく必要があります。具体的にはこんな感じ(csh の場合)。

% setenv LD_LIBRARY_PATH /home/aian/dbxml/lib
% setenv LD_RUN_PATH /home/aian/dbxml/lib

これでいぢれるはずです。

dbxml をいぢる

ごにょごにょやってみます。

aian:~ % dbxml

dbxml> createContainer sample.xmldb 
Creating node storage container with nodes indexed

dbxml> addDocument doc1 '<?xml version="1.0"?><foo>bar</foo>'
Document added, name = doc1

dbxml> getMetaData doc1 
Metadata for document: doc1
        http://www.sleepycat.com/2002/dbxml:name

dbxml> addDocument doc2 '<?xml version="1.0"?><foo>hello, world!</foo>'
Document added, name = doc2


dbxml> query 'collection("sample.xmldb")/foo'
2 objects returned for eager expression 'collection("sample.xmldb")/foo'


dbxml> print
<foo>bar</foo>
<foo>hello, world!</foo>

いいかんじ。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN