rfirebird/
database.rs

1//! Firebird database representation
2
3use 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
12/// The Firebird database
13pub struct Database {
14    pub header: HeaderPage,
15    buffer: Rc<RefCell<BufReader<File>>>,
16}
17
18impl Database {
19    /// Read the database from a buffer
20    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    /// Read the database from a file with RO mode
36    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}