fix defragment

This commit is contained in:
Pere Diaz Bou
2025-02-13 22:21:40 +01:00
parent c65dce6cfd
commit 7e55f46b26
2 changed files with 7 additions and 11 deletions

View File

@@ -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.

View File

@@ -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 => {