sqlite_fsr/models/dbfile/dbtable/
table.rs

1use 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}