added rootpage stuff
This commit is contained in:
parent
2a39ce160b
commit
686a7b9ebb
4 changed files with 77 additions and 21 deletions
|
|
@ -0,0 +1,59 @@
|
||||||
|
use crate::page::Page;
|
||||||
|
|
||||||
|
|
||||||
|
fn write_header(mut rootpage: Page, n_pages: u32) {
|
||||||
|
rootpage.put_u8a(&MAGIC_HEADER);
|
||||||
|
rootpage.put_u16(DEFAULT_PAGE_SIZE);
|
||||||
|
rootpage.put_u8(FILE_FORMAT_WRITE_VERSION);
|
||||||
|
rootpage.put_u8(FILE_FORMAT_READ_VERSION);
|
||||||
|
rootpage.put_u8(RESERVED_SIZE);
|
||||||
|
rootpage.put_u8(MAX_EMBED_PAYLOAD_FRACTION);
|
||||||
|
rootpage.put_u8(MIN_EMBED_PAYLOAD_FRACTION);
|
||||||
|
rootpage.put_u8(LEAF_PAYLOAD_FRACTION);
|
||||||
|
rootpage.put_u32(FILECHANGE_COUNTER);
|
||||||
|
rootpage.put_u32(n_pages);// file size in pages
|
||||||
|
rootpage.put_u32(FREELIST_TRUNK_PAGE_HUMBER);// Page number of the first freelist trunk page.
|
||||||
|
rootpage.put_u32(TOTAL_N_FREELIST_PAGES);
|
||||||
|
rootpage.put_u32(SCHEMA_COOKIE);
|
||||||
|
rootpage.put_u32(SQLITE_SCHEMAVERSION);
|
||||||
|
rootpage.put_u32(SUGGESTED_CACHESIZE);
|
||||||
|
rootpage.put_u32(LARGEST_ROOT_BTREE_PAGE);
|
||||||
|
rootpage.put_u32(ENCODING_UTF8);
|
||||||
|
rootpage.put_u32(USER_VERSION);
|
||||||
|
rootpage.put_u32(VACUUM_MODE_OFF);// True (non-zero) for incremental-vacuum mode. False (zero) otherwise.
|
||||||
|
rootpage.put_u32(APP_ID);// Application ID
|
||||||
|
rootpage.put_u8a(&FILLER);// Reserved for expansion. Must be zero.
|
||||||
|
rootpage.put_u8a(&VERSION_VALID_FOR);// The version-valid-for number
|
||||||
|
rootpage.put_u8a(&SQLITE_VERSION);// SQLITE_VERSION_NUMBER
|
||||||
|
rootpage.put_u8(TABLE_LEAF_PAGE); // leaf table b-tree page for schema
|
||||||
|
rootpage.put_u16(NO_FREE_BLOCKS); // zero if there are no freeblocks
|
||||||
|
rootpage.put_u16(1); // the number of cells on this page
|
||||||
|
}
|
||||||
|
|
||||||
|
const MAGIC_HEADER: [u8; 16] = [0x53, 0x51, 0x4c, 0x69, 0x74, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x33, 0x00];
|
||||||
|
pub const DEFAULT_PAGE_SIZE: u16 = 4096;
|
||||||
|
const FILE_FORMAT_WRITE_VERSION: u8 = 1;
|
||||||
|
const FILE_FORMAT_READ_VERSION: u8 = 1;
|
||||||
|
const RESERVED_SIZE: u8 = 0;
|
||||||
|
const MAX_EMBED_PAYLOAD_FRACTION: u8 = 0x40;
|
||||||
|
const MIN_EMBED_PAYLOAD_FRACTION: u8 = 0x20;
|
||||||
|
const LEAF_PAYLOAD_FRACTION: u8 = 0x20;
|
||||||
|
const FILECHANGE_COUNTER: u32 = 1;
|
||||||
|
const FREELIST_TRUNK_PAGE_HUMBER: u32 = 0;
|
||||||
|
const TOTAL_N_FREELIST_PAGES: u32 = 0;
|
||||||
|
const SCHEMA_COOKIE: u32 = 1;
|
||||||
|
const SQLITE_SCHEMAVERSION: u32 = 4;
|
||||||
|
const SUGGESTED_CACHESIZE: u32 = 0;
|
||||||
|
const LARGEST_ROOT_BTREE_PAGE: u32 = 0;
|
||||||
|
const ENCODING_UTF8: u32 = 1;
|
||||||
|
const USER_VERSION: u32 = 0;
|
||||||
|
const VACUUM_MODE_OFF: u32 = 0;
|
||||||
|
const APP_ID: u32 = 0;
|
||||||
|
const FILLER: [u8; 20] = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
|
||||||
|
const VERSION_VALID_FOR: [u8; 4] = [0, 0, 0x03, 250];
|
||||||
|
const SQLITE_VERSION: [u8; 4] = [0x00, 0x2e, 0x5F, 0x1A];
|
||||||
|
const NO_FREE_BLOCKS: u16 = 0;
|
||||||
|
pub const TABLE_LEAF_PAGE: u8 = 0x0d;
|
||||||
|
pub const TABLE_INTERIOR_PAGE: u8 = 0x05;
|
||||||
|
const INDEX_LEAF_PAGE: u8 = 0x0a;
|
||||||
|
const INDEX_INTERIOR_PAGE: u8 = 0x02;
|
||||||
|
|
@ -5,9 +5,7 @@ mod values;
|
||||||
mod varint;
|
mod varint;
|
||||||
mod record;
|
mod record;
|
||||||
|
|
||||||
const DEFAULT_PAGE_SIZE: usize = 4096;
|
|
||||||
const TABLE_INTERIOR_PAGE: u8 = 0x05;
|
|
||||||
const TABLE_LEAF_PAGE: u8 = 0x0D;
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
|
|
||||||
33
src/page.rs
33
src/page.rs
|
|
@ -1,6 +1,5 @@
|
||||||
use crate::{DEFAULT_PAGE_SIZE, TABLE_LEAF_PAGE};
|
|
||||||
use crate::bytebuffer::ByteBuffer;
|
use crate::bytebuffer::ByteBuffer;
|
||||||
|
use crate::database;
|
||||||
const POSITION_CELL_COUNT: u32 = 3;
|
const POSITION_CELL_COUNT: u32 = 3;
|
||||||
const START_OF_CONTENT_AREA: u32 = 5;
|
const START_OF_CONTENT_AREA: u32 = 5;
|
||||||
|
|
||||||
|
|
@ -10,7 +9,7 @@ pub enum PageType {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Represents an SQLite page
|
/// Represents an SQLite page
|
||||||
struct Page {
|
pub struct Page {
|
||||||
data: ByteBuffer,
|
data: ByteBuffer,
|
||||||
key: i64,
|
key: i64,
|
||||||
children: Vec<Page>,
|
children: Vec<Page>,
|
||||||
|
|
@ -19,9 +18,9 @@ struct Page {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Page {
|
impl Page {
|
||||||
fn with_capacity(size: usize, page_type: PageType) -> Self {
|
fn with_capacity(size: u16, page_type: PageType) -> Self {
|
||||||
Self {
|
Self {
|
||||||
data: ByteBuffer::new(size),
|
data: ByteBuffer::new(size as usize),
|
||||||
key: 0,
|
key: 0,
|
||||||
children: Vec::new(),
|
children: Vec::new(),
|
||||||
number: 0,
|
number: 0,
|
||||||
|
|
@ -30,47 +29,47 @@ impl Page {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn new_leaf() -> Self {
|
fn new_leaf() -> Self {
|
||||||
let mut page = Page::with_capacity(DEFAULT_PAGE_SIZE, PageType::Leaf);
|
let mut page = Page::with_capacity(database::DEFAULT_PAGE_SIZE, PageType::Leaf);
|
||||||
page.put_u8(TABLE_LEAF_PAGE);
|
page.put_u8(database::TABLE_LEAF_PAGE);
|
||||||
page
|
page
|
||||||
}
|
}
|
||||||
|
|
||||||
fn new_interior() -> Self {
|
fn new_interior() -> Self {
|
||||||
let mut page = Page::with_capacity(DEFAULT_PAGE_SIZE, PageType::Interior);
|
let mut page = Page::with_capacity(database::DEFAULT_PAGE_SIZE, PageType::Interior);
|
||||||
page.put_u8(TABLE_LEAF_PAGE);
|
page.put_u8(database::TABLE_LEAF_PAGE);
|
||||||
page
|
page
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_child(&mut self, child: Self) {
|
pub fn add_child(&mut self, child: Self) {
|
||||||
self.children.push(child);
|
self.children.push(child);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fw_position(&mut self, new_position: usize) {
|
pub fn fw_position(&mut self, new_position: usize) {
|
||||||
self.data.fw_position = new_position;
|
self.data.fw_position = new_position;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn bw_position(&mut self, new_position: usize) {
|
pub fn bw_position(&mut self, new_position: usize) {
|
||||||
self.data.bw_position = new_position;
|
self.data.bw_position = new_position;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn put_u8a(&mut self, value: &[u8]) {
|
pub fn put_u8a(&mut self, value: &[u8]) {
|
||||||
self.data.put_u8a(value);
|
self.data.put_u8a(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn put_u8(&mut self, value: u8) {
|
pub fn put_u8(&mut self, value: u8) {
|
||||||
self.data.put_u8(value);
|
self.data.put_u8(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn put_u16(&mut self, value: u16) {
|
pub fn put_u16(&mut self, value: u16) {
|
||||||
self.data.put_u16(value);
|
self.data.put_u16(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn put_u32(&mut self, value: u32) {
|
pub fn put_u32(&mut self, value: u32) {
|
||||||
self.data.put_u32(value);
|
self.data.put_u32(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
// may panic
|
// may panic
|
||||||
fn get_page_nr_last_child(self) -> u32 {
|
pub fn get_page_nr_last_child(self) -> u32 {
|
||||||
self.children[self.children.len()-1].number
|
self.children[self.children.len()-1].number
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -42,7 +42,7 @@ fn sqlite_integer_to_bytes(value: i64) -> Vec<u8> {
|
||||||
if value == 0 || value == 1 {
|
if value == 0 || value == 1 {
|
||||||
vec![]
|
vec![]
|
||||||
} else {
|
} else {
|
||||||
return long_to_bytes(value, get_length_of_byte_encoding(value));
|
return i64_to_bytes(value, get_length_of_byte_encoding(value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue