HyperEstraier メモ

This entry was posted by on Thursday, 7 September, 2006
>そういえば H.E. には @digest という属性があって、ドキュメントのダイジェストが格納されている。この取扱が気になったので、ちょっと調べてみた。 > >まず、 @digest は H.E. では ESTDATTRDIGEST という名前で定義されている(estraier.h)。んで、この値は estraier.c では3箇所しか参照されていない。どれも est_db_put_doc の中。 > >中を見てみると、まず put_doc しようとしているドキュメントに @digest 属性が存在するかどうかのチェックをしている(1)。で、ない場合は、 ESTDOC の本文すべてと隠しテキストをタブ文字で結合して md5 のダイジェスト値を計算し、その結果を @digest に書き戻す(2)。 > >最後に、 put_doc しようとしているドキュメントの uri を見て、現在の DB に同一 uri があるかどうかを調べている。もし現在の DB に同じ uri のドキュメントがあり、そして @digest も一致しているなら(ここがみっつめ)、属性値の変更であろうと判断して、新しいドキュメントにするのではなく、 edit_doc に処理を切り替える。というところに使われているだけのようだ。そうでなければ、内容の変更があるとして、同一 uri の古いドキュメントを削除して、通常の追加作業に合流する。 > >ということのようだ。 edit_doc は属性の編集しかしないから、本文を変更するには put_doc するしかない。つまり、ダイジェスト値と本文に不整合を起こしたければ、適当な値 @digest にあらかじめセットしておいて put_doc すればよい。 > >まあそれはあんまり意味はないけど、仮に get_doc して本文や隠しテキストに追加するなどの処理を加え、その結果をそのまんま put_doc するとしよう。すると、その変更の結果として @digest が変わるわけじゃないから、 put_doc しても実際には edit_doc だけで済まされてしまい、本文への追加はデータベースに反映されないようだ。まあ、本文に訂正もなく追加だけというドキュメントは珍しいだろうから、そうなるとドキュメントはほとんど一から作りなおしだろうし、現実には問題にはならないんだろうけど。ふむふむ。 > >いや、この @digest ってナンかに使えないかなーと思ったのと、ダイジェスト値が一致してたらドキュメントを実質的に加えないとかいった処理が行われているのかなーとちょっと思って調べたんですが、やっぱ内部用途としての運用がメインで、そんな面倒そうなことまではやってなかったですね、という感じですね。ふむ。 >

Comments are closed.