1use std::cell::RefCell;
4use std::fs::File;
5use std::io::{BufRead, BufReader, Read};
6use std::rc::Rc;
7
8use crate::page::HeaderPage;
9use crate::Error;
10use crate::Table;
11
12pub struct Database {
14 pub header: HeaderPage,
15 buffer: Rc<RefCell<BufReader<File>>>,
16}
17
18impl Database {
19 pub fn open(buffer: Rc<RefCell<BufReader<File>>>) -> Result<Database, Error> {
21 let header = {
22 let mut tag = [0 as u8; 1024];
23 buffer.borrow_mut().read_exact(&mut tag)?;
24
25 HeaderPage::from_bytes(tag)?
26 };
27
28 buffer
29 .borrow_mut()
30 .consume((header.page_size - 1024).into());
31
32 Ok(Self { header, buffer })
33 }
34
35 pub fn open_file(fpath: &str) -> Result<Database, Error> {
37 let f = File::open(fpath).map_err(|e| e.to_string())?;
38 let bfr = BufReader::new(f);
39
40 Database::open(Rc::new(RefCell::new(bfr)))
41 }
42
43 pub fn tables(&mut self) -> Result<Vec<Table>, Error> {
44 Table::load(self.header, &mut self.buffer.borrow_mut())
45 }
46}