diff --git a/core/storage/btree.rs b/core/storage/btree.rs index e66f70510..c27510890 100644 --- a/core/storage/btree.rs +++ b/core/storage/btree.rs @@ -2422,10 +2422,10 @@ fn defragment_page(page: &PageContent, usable_space: u16) { let write_buf = page.as_ptr(); for i in 0..cloned_page.cell_count() { - let cell_offset = page.offset + 8; - let cell_idx = cell_offset + i * 2; + let (cell_offset, _) = page.cell_pointer_array_offset_and_size(); + let cell_idx = cell_offset + (i * 2); - let pc = u16::from_be_bytes([read_buf[cell_idx], read_buf[cell_idx + 1]]) as u64; + let pc = cloned_page.read_u16_no_offset(cell_idx) as u64; if pc > last_cell { unimplemented!("corrupted page"); } @@ -2467,7 +2467,7 @@ fn defragment_page(page: &PageContent, usable_space: u16) { } assert!(cbrk + size <= usable_space && cbrk >= first_cell); // set new pointer - write_buf[cell_idx..cell_idx + 2].copy_from_slice(&(cbrk as u16).to_be_bytes()); + page.write_u16_no_offset(cell_idx, cbrk as u16); // copy payload write_buf[cbrk as usize..cbrk as usize + size as usize] .copy_from_slice(&read_buf[pc as usize..pc as usize + size as usize]); @@ -2479,16 +2479,12 @@ fn defragment_page(page: &PageContent, usable_space: u16) { // return SQLITE_CORRUPT_PAGE(pPage); // } assert!(cbrk >= first_cell); - let write_buf = page.as_ptr(); // set new first byte of cell content page.write_u16(PAGE_HEADER_OFFSET_CELL_CONTENT_AREA, cbrk as u16); // set free block to 0, unused spaced can be retrieved from gap between cell pointer end and content start page.write_u16(PAGE_HEADER_OFFSET_FIRST_FREEBLOCK, 0); - page.write_u16(PAGE_HEADER_OFFSET_FRAGMENTED_BYTES_COUNT, 0); - // set unused space to 0 - dbg!(cbrk, first_cell); - write_buf[first_cell as usize..cbrk as usize].fill(0); + page.write_u8(PAGE_HEADER_OFFSET_FRAGMENTED_BYTES_COUNT, 0); } /// Insert a record into a cell. diff --git a/core/storage/sqlite3_ondisk.rs b/core/storage/sqlite3_ondisk.rs index ee84ccee4..21c6da4a3 100644 --- a/core/storage/sqlite3_ondisk.rs +++ b/core/storage/sqlite3_ondisk.rs @@ -600,10 +600,10 @@ impl PageContent { ) -> (usize, usize) { let buf = self.as_ptr(); let ncells = self.cell_count(); - let cell_pointer_array_start = self.header_size(); + let (cell_pointer_array_start, _) = self.cell_pointer_array_offset_and_size(); assert!(idx < ncells, "cell_get: idx out of bounds"); let cell_pointer = cell_pointer_array_start + (idx * 2); // pointers are 2 bytes each - let cell_pointer = self.read_u16(cell_pointer) as usize; + let cell_pointer = self.read_u16_no_offset(cell_pointer) as usize; let start = cell_pointer; let len = match self.page_type() { PageType::IndexInterior => {