///|
// Format v1 uses shortlex: compare lengths before lexical byte order.
fn lookup_leaf(page : Bytes, key : Bytes) -> Bytes? raise DbError {
guard page.length() == page_size && page[0] == kind_leaf else {
raise DbError::Corrupt
}
let count = read_u16(page, 1)
let mut cursor = 7
let mut previous : BytesView? = None
let mut found : BytesView? = None
for _ in 0..= 0 {
raise DbError::Corrupt
}
previous = Some(stored_key)
if stored_key == key[:] {
found = Some(page[cursor + 4 + key_len:cursor + 4 + key_len + value_len])
}
cursor = cursor + 4 + key_len + value_len
}
found.map(view => view.to_owned())
}
///|
fn lookup_child(page : Bytes, key : Bytes) -> Int raise DbError {
guard page.length() == page_size && page[0] == kind_branch else {
raise DbError::Corrupt
}
let count = read_u16(page, 1)
guard count <= (page_size - 7) / 4 else { raise DbError::Corrupt }
let mut cursor = 3 + (count + 1) * 4
let mut previous : BytesView? = None
let mut child = 0
for i in 0..= 0 {
raise DbError::Corrupt
}
previous = Some(separator)
if key[:].compare(separator) >= 0 {
child = i + 1
}
cursor = cursor + 2 + len
}
read_u32(page, 3 + child * 4).reinterpret_as_int()
}
///|
fn append_leaf_keys(page : Bytes, keys : Array[Bytes]) -> Unit raise DbError {
guard page.length() == page_size && page[0] == kind_leaf else {
raise DbError::Corrupt
}
let mut cursor = 7
for _ in 0..= 0 {
raise DbError::Corrupt
}
keys.push(key)
cursor = cursor + 4 + key_len + value_len
}
}