sqlite_rs/header/
freelist_pages.rs

1use crate::traits::ParseBytes;
2use crate::{impl_name, result::SqliteResult};
3use core::ops::Deref;
4
5/// # Free page list (8 Bytes) => First(4 Bytes) + TotalPages (4 Bytes)
6///  Unused pages in the database file are stored on a freelist.
7#[derive(Debug, Default)]
8pub struct FreeListPages {
9  /// Page number of the first freelist trunk page. (4 Bytes)
10  first: FreeListPagesFirstTrunkPage,
11  /// Total number of freelist pages. (4 Bytes)
12  total: FreeListPagesTotalPages,
13}
14
15impl FreeListPages {
16  pub fn first(&self) -> &FreeListPagesFirstTrunkPage {
17    &self.first
18  }
19
20  pub fn total(&self) -> &FreeListPagesTotalPages {
21    &self.total
22  }
23}
24impl_name! {FreeListPages}
25
26impl ParseBytes for FreeListPages {
27  const LENGTH_BYTES: usize = 8;
28
29  fn parsing_handler(bytes: &[u8]) -> SqliteResult<Self> {
30    let first = FreeListPagesFirstTrunkPage::parse_bytes(&bytes[0..=3])?;
31    let total = FreeListPagesTotalPages::parse_bytes(&bytes[4..=7])?;
32
33    Ok(Self { first, total })
34  }
35}
36
37///  FreeListPagesFirstTrunkPage: The 4-byte big-endian integer at offset 32
38/// stores the page number of the first page of the freelist, or zero if the
39/// freelist is empty.
40#[derive(Debug, Default)]
41pub struct FreeListPagesFirstTrunkPage(u32);
42impl Deref for FreeListPagesFirstTrunkPage {
43  type Target = u32;
44
45  fn deref(&self) -> &Self::Target {
46    &self.0
47  }
48}
49
50impl_name! {FreeListPagesFirstTrunkPage}
51
52impl ParseBytes for FreeListPagesFirstTrunkPage {
53  const LENGTH_BYTES: usize = 4;
54
55  fn parsing_handler(bytes: &[u8]) -> SqliteResult<Self> {
56    let buf: [u8; Self::LENGTH_BYTES] = bytes.try_into()?;
57    let first_page_trunk = u32::from_be_bytes(buf);
58    Ok(Self(first_page_trunk))
59  }
60}
61
62///  FreeListPagesTotalPages: The 4-byte big-endian integer at offset 36
63/// stores the total number of pages on the freelist.
64#[derive(Debug, Default)]
65pub struct FreeListPagesTotalPages(u32);
66impl Deref for FreeListPagesTotalPages {
67  type Target = u32;
68
69  fn deref(&self) -> &Self::Target {
70    &self.0
71  }
72}
73
74impl_name! {FreeListPagesTotalPages}
75
76impl ParseBytes for FreeListPagesTotalPages {
77  const LENGTH_BYTES: usize = 4;
78
79  fn parsing_handler(bytes: &[u8]) -> SqliteResult<Self> {
80    let buf: [u8; Self::LENGTH_BYTES] = bytes.try_into()?;
81    let total_pages = u32::from_be_bytes(buf);
82    Ok(Self(total_pages))
83  }
84}