2018/03/09

[c/c++][lmdb]同じ名前のDBが複数出来てしまう謎 (3) - 番外編

また、lmdbで(自分で)やらかしていることに気付いた。


lmdbで、mdp_dumpというコマンドがある。
DBのフォルダを指定すると、どういう構成になっているか分からなくても、取りあえずダンプ出力してくれる。
便利だ。

サンプルとしてソースファイルもあるので、やり方をまねしていた。


が、まねの仕方が甘かった。


https://github.com/LMDB/lmdb/blob/mdb.master/libraries/liblmdb/mdb_dump.c#L275-L277

この部分を、いつの間にか違う実装にしていた。
ええ、前回の失敗と同じですよ。。。

ちゃんとここでは、keyのsize + 1だけバッファをとり、コピーして、末尾に\0を設定しているのだけど、私は何も考えずにconst char*でキャストして使っていたのだ。


これは何がkeyになっているかというと、DB名だ。
つまり、mdb_dbi_open()で渡したconst char*である。
だから、ここは\0も含めてDBに入っているのだろうと思い込んでいたのだけど、実際に収められているのはstrlen()のサイズだった。

困ったことに、キャストしただけでもほとんどの場合でうまくいってて、まったく気付いてなかった・・・。


まあ、DB名でこういうことをやるのは、あまりよろしくないのかもしれない。
とはいえ、Key-Value store型でDBを複数持てるのであれば、cursorでDBを串刺しでの検索をやりたくなる状況は多いだろう。


ルールはそう多くないのだが、ちょっと気を抜くと牙をむいてくるところが難しいですな。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。