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章までなんとか実装できたのでメモしておく。
1番の難所はbufferの扱いだが、bytebufferという神Crateのおかげで乗り越えられた。
set_rpos
やset_wpos
をサポートしているので、直感的に思った位置に書き込める。
欲を言えばその位置もデバッグ出来れば楽だが、get_rpos
、get_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はVSCodeのHex Editorを使えばデバッグしやすい。
CIはQuickstart CI workflowをそのまま使った。
手応え的に4章も実装できそうな気がしている。