Skip to content

Commit

Permalink
Fix page selection
Browse files Browse the repository at this point in the history
hernangonzalez committed Jan 9, 2024

Verified

This commit was signed with the committer’s verified signature.
hernangonzalez Hernan Gonzalez
1 parent 5ab1b6c commit a88ae21
Showing 3 changed files with 14 additions and 11 deletions.
3 changes: 2 additions & 1 deletion src/db.rs
Original file line number Diff line number Diff line change
@@ -37,14 +37,15 @@ impl SQL for SQLiteFile {
}

fn page_at(&self, idx: i64) -> Result<Page> {
let idx = idx - 1;
let offset = idx * self.head.page_size() as i64;
decode::read_page(self, offset.into(), 0)
}

fn table(&self, name: &str) -> Result<Table> {
let schema = self.schema()?;
let desc = schema.table_named(name)?.clone();
let root = self.page_at(desc.root - 1)?;
let root = self.page_at(desc.root)?;
Ok(Table::new(self, desc, root))
}
}
16 changes: 7 additions & 9 deletions src/db/table.rs
Original file line number Diff line number Diff line change
@@ -56,26 +56,24 @@ impl<'a> Table<'a> {
match kind {
page::Kind::TableLeaf => {
let leave = self.root.into_leaf().unwrap();
Box::new(vec![leave].into_iter())
let iter = std::iter::once(leave);
Box::new(iter)
}
page::Kind::TableInterior => {
let interior = self.root.into_interior().unwrap();
let rhs = std::iter::once(interior.rhs())
.flatten()
.flat_map(|i| self.db.page_at(i as i64));
let iter = interior
.cells()
.into_iter()
.flat_map(|c| self.db.page_at(c.lhs as i64))
.chain(rhs)
.flat_map(|p| p.into_leaf());
Box::new(iter)
}
_ => Box::new(Vec::new().into_iter()),
_ => Box::new(std::iter::empty()),
}
// if let Ok(leave) = self.root.into_leaf() {
// return vec![leave].into_iter();
// }

// let Ok(interior) = self.root.into_interior() else {
// return vec![].into_iter();
// };
}

pub fn select(
6 changes: 5 additions & 1 deletion src/page.rs
Original file line number Diff line number Diff line change
@@ -5,7 +5,7 @@ mod kind;
use crate::offset::{self, Offset};
pub use crate::page::kind::Kind;
use crate::Result;
use anyhow::{bail, ensure};
use anyhow::{bail, ensure, Context};
pub use cell::{Column, TableInteriorCell, TableLeafCell};
pub use header::Header;

@@ -54,6 +54,10 @@ impl TableInteriorPage {
.map(|r| r.1)
.collect()
}

pub fn rhs(&self) -> Result<u32> {
self.0.head.right_leave.context("Missing right leave")
}
}

pub mod decode {

0 comments on commit a88ae21

Please sign in to comment.