1
0
Fork 0

Added support for .tables

This commit is contained in:
Ishan Jain 2022-07-05 01:52:40 +05:30
parent ba9c8568d3
commit 1bb35948a7
2 changed files with 35 additions and 3 deletions

View File

@ -53,6 +53,38 @@ fn main() -> Result<()> {
// Uncomment this block to pass the first stage
// println!("number of tables: {}", schemas.len());
}
".tables" => {
// Parse page header from database
let page_header = PageHeader::parse(&database[100..108])?;
// Obtain all cell pointers
let cell_pointers = database[108..]
.chunks_exact(2)
.take(page_header.number_of_cells.into())
.map(|bytes| u16::from_be_bytes(bytes.try_into().unwrap()));
// Obtain all records from column 5
#[allow(unused_variables)]
let schemas = cell_pointers
.into_iter()
.map(|cell_pointer| {
let stream = &database[cell_pointer as usize..];
let (_, offset) = parse_varint(stream);
let (_rowid, read_bytes) = parse_varint(&stream[offset..]);
parse_record(&stream[offset + read_bytes..], 5)
.map(|record| Schema::parse(record).expect("Invalid record"))
})
.collect::<Result<Vec<_>>>()?;
for schema in schemas
.into_iter()
.filter(|schema| !schema.table_name.starts_with("sqlite"))
.filter(|schema| schema.kind == "table")
{
print!("{} ", schema.name);
}
}
_ => bail!("Missing or invalid command passed: {}", command),
}

View File

@ -1,8 +1,8 @@
#[derive(Debug)]
pub struct Schema {
kind: String,
name: String,
table_name: String,
pub kind: String,
pub name: String,
pub table_name: String,
root_page: u8,
sql: String,
}