経験は何よりも饒舌

10年後に真価を発揮するかもしれないブログ 

Rustで『Database Design and Implementation』の3章を実装する

約1年前にDenoでチャレンジをしていたが、4章でbufferを扱えきれなくてScalaに乗り換えた。

wafuwafu13.hatenadiary.com
github.com

scala-simpledbのログによると12章まで進んでいたようだが、CIが落ちているので、どこかしらで進めなくなったらしい。
また、Scalaでも結局import java.***していたのでほとんど元のSimpleDBの写経になっていたような記憶がある。
というわけで、心機一転Rustで挑戦してみた結果、3章までなんとか実装できたのでメモしておく。

github.com

1番の難所はbufferの扱いだが、bytebufferという神Crateのおかげで乗り越えられた。
set_rposset_wposをサポートしているので、直感的に思った位置に書き込める。
欲を言えばその位置もデバッグ出来れば楽だが、get_rposget_wposで取得できるので問題ない。

github.com
追記: 素早くマージしてくださった。感謝。


注意点として、set_wposの説明にSets the writing cursor to min(newPosition, self.len()) to prevent overflowとあるように、書き込みで指定するoffsetがbufferの長さを超えているとき、自動で確保されるのではなく切り詰められるので、事前にresizeで確保しておく必要がある。

pub fn set_i32(&mut self, offset: usize, n: i32) {
    if self.buffer.len() < offset {
        self.buffer.resize(offset + n.to_be_bytes().len())
    }
    self.buffer.set_wpos(offset);
    self.buffer.write_i32(n);
}

ファイルに書き込んだbufferはVSCodeHex Editorを使えばデバッグしやすい。

abcdefghijklmと345(=101011001=(00000001, 01011001=(Y)))

CIはQuickstart CI workflowをそのまま使った。

手応え的に4章も実装できそうな気がしている。