sqlite_fsr/models/dbfile/dbtable/
table.rs1use crate::{command::sql::parser::sql_statement::{SelectStatement}, models::dbfile::dbtable::tablepage::Record, models::dbfile::schema::SchemaRow, DBFile};
2use crate::models::dbfile::dbtable::tablepage::*;
3use crate::models::dbfile::dbtable::tablepage::Table;
4use std::io::{Seek, SeekFrom, Read};
5
6pub struct DBTable <'a>{
7 pub description: SchemaRow,
8 dbfile: &'a mut DBFile
9}
10
11
12impl DBTable <'_> {
13 pub fn new(description: SchemaRow, dbfile: &mut DBFile) -> DBTable {
14 DBTable { description, dbfile }
15 }
16
17 pub fn to_table_rows(&mut self, statement: &SelectStatement) -> Vec<Record> {
18
19 let table_rootpage_offset = self.dbfile.schema.page_size as u64 * (self.description.rootpage-1) as u64;
20 self.dbfile.seek(SeekFrom::Start(table_rootpage_offset)).expect("seek failed");
21
22 let mut table_page_buffer = vec![0; self.dbfile.schema.page_size as usize];
23 self.dbfile.read_exact(&mut table_page_buffer).expect("failed to read table page into buffer");
24
25 let mut table_page: TablePage = match table_page_buffer[0] {
26 0x0D => TablePage::Leaf(LeafTablePage::from_bytes(&table_page_buffer)),
27 0x05 => TablePage::Interior(InteriorTablePage::from_bytes(&table_page_buffer, self.dbfile)),
28 _ => panic!("unsupported page type"),
29 };
30
31
32 let records: Vec<Record> = table_page.to_table_records(&statement, &self.description.sql);
33
34 return records;
35 }
36}