Arbitrary byte strings, and version 1.3.1
Dependencies
- [2]
YDHYZA77Adding the RootPage trait to access the raw bytes of a root page (needed in libpijul) - [3]
XOXTGNPZAdding a contiguous memory allocator (for large blocks) - [4]
OHUZ73MKVersions - [5]
SYURNHHLAdding the `put_mut` and `set_left_child` methods - [6]
PUOGOIJ3Debugging, impls and version bump - [7]
BPR2HVMRVersion bump - [8]
VRAQTH26Fixing two crashes on corrupted files - [9]
OHG5NX6KRefactoring, drop and the Check trait - [10]
GPP7KJSFVersion bump - [11]
4Z4GEJTFVersion bump - [12]
FQ567GAXVersion bumps - [13]
5LSYTRQ6More docs, example, and fixing the free page diagnostic function for mutable transactions - [14]
TJ2R4HAZAccessing the root pages (unsafely, of course) - [15]
P5NWMJ2HVersion bump - [16]
M6PHQUGLfallocate only when necessary - [17]
YXKP4AIWNew file locks, with multiple sets of free pages - [18]
IIIOKJTEVersion bump - [19]
GGEFV4YYSome page splits were not properly handled in deletions - [20]
DASFQGORDebugging - [21]
2ZRCQBXPVersion bump - [22]
77TAHKV4Fixing a logical error (again) in del - [23]
7T2CCH3PFixing a segfault (wrong offset in page_unsized::del) - [24]
J7LJZBMESetting reverse cursor to last by default - [25]
E4MD6T3LProofreading and commenting of this crate (massive bug fixes included) - [26]
DEKK3RUIFixing a bug when splitting unsized pages - [27]
SO25TWFLA few features for integrating it into Pijul - [28]
OP6SVMODResetting history - [29]
RLVQDUPYFixing a double-free error introduced in 1.2.13 - [30]
W2MIZD5BSingle file databases + CRC for the root pages (checking the other pages makes everything very slow) - [31]
WTXLZDYIFixing bus errors on a full disk - [32]
Z33OHFPAVersion bump - [33]
PRDUE4YACleanup + published on crates.io - [*]
QYDGYIZRSplit trait Representable into its mandatory part and an optional part - [*]
CCNPHVQCCleanup, comments, renaming
Change contents
- edit in sanakirja-core/src/lib.rs at line 164
}#[derive(Debug, Clone, Copy)]#[repr(C)]struct Ref {p: u64,len: u64,}pub union Slice<'b> {len: u16,page: Ref,mem: Mem<'b>,}#[derive(Clone, Copy)]#[repr(C)]struct Mem<'b> {_len: u16,m: &'b [u8],}impl<'a> core::fmt::Debug for Slice<'a> {fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result {write!(fmt, "Slice({:?})", unsafe { self.len })}}impl<'a> core::convert::From<&'a [u8]> for Slice<'a> {fn from(m: &'a [u8]) -> Slice<'a> {let s = Slice {mem: Mem { _len: 513, m },};s}}impl<'a> Slice<'a> {pub fn as_bytes<T: LoadPage>(&self, txn: &T) -> Result<&[u8], T::Error> {Ok(unsafe {let len = u16::from_le(self.len) & 0xfff;if len == 512 {// Stored externallylet p = txn.load_page(u64::from_le(self.page.p) & !0xfff)?;core::slice::from_raw_parts(p.data, u64::from_le(self.page.len) as usize)} else if len == 513 {// Stored in memory, not on any pageself.mem.m} else {core::slice::from_raw_parts((&self.len as *const u16 as *const u8).add(2),len as usize,)}})}}impl<'a> Storable for Slice<'a> {type PageReferences = Pages;fn page_references(&self) -> Self::PageReferences {unsafe {let len = u16::from_le(self.len);if len == 512 {let plen = u64::from_le(self.page.len);let len_up = ((plen + PAGE_SIZE as u64 - 1) / PAGE_SIZE as u64)* PAGE_SIZE as u64;let offset = u64::from_le(self.page.p) & !0xfff;Pages {offset,limit: offset + len_up,}} else {Pages {offset: 0,limit: 0,}}}}fn compare<T: LoadPage>(&self, t: &T, b: &Self) -> core::cmp::Ordering {self.as_bytes(t).unwrap().cmp(b.as_bytes(t).unwrap())}}pub struct Pages {offset: u64,limit: u64,}impl Iterator for Pages {type Item = u64;fn next(&mut self) -> Option<Self::Item> {if self.offset >= self.limit {None} else {let o = self.offset;self.offset += PAGE_SIZE as u64;Some(o)}} - edit in sanakirja-core/src/lib.rs at line 267
impl<'b> UnsizedStorable for Slice<'b> {const ALIGN: usize = 8;fn size(&self) -> usize {let s = unsafe {if u16::from_le(self.len) == 512 {// Stored externally16} else if u16::from_le(self.len) == 513 {// Stored in memory, not on any pageif self.mem.m.len() > 510 {16} else {2 + self.mem.m.len()}} else {u16::from_le(self.len) as usize}};s}unsafe fn from_raw_ptr<'a, T>(_: &T, p: *const u8) -> &'a Self {&*(p as *const Self)}unsafe fn onpage_size(p: *const u8) -> usize {let p = &*(p as *const Self);if u16::from_le(p.len) == 512 {// Stored externally16} else if u16::from_le(p.len) == 513 {// Stored in memory, not on any page2 + p.mem.m.len()} else {u16::from_le(p.len) as usize}}unsafe fn write_to_page<T: AllocPage>(&self, t: &mut T, p: *mut u8) {if self.len == 512 {// Stored externallycore::ptr::copy(&self.page as *const Ref as *const u8, p, 16)} else if self.len == 513 {// Alloc ?if self.mem.m.len() > 510 {let len = self.mem.m.len();let page = if len > 4096 {t.alloc_contiguous((((len + PAGE_SIZE - 1) / PAGE_SIZE) * PAGE_SIZE)as u64).unwrap()} else {t.alloc_page().unwrap()};core::ptr::copy_nonoverlapping(self.mem.m.as_ptr(), page.0.data, len);let p = &mut *(p as *mut Ref);p.len = (self.mem.m.len() as u64).to_le();p.p = (page.0.offset | 512).to_le();} else {let len = self.mem.m.len();*(p as *mut u16) = (len as u16).to_le();core::ptr::copy_nonoverlapping(self.mem.m.as_ptr(), p.add(2), len)}} else {core::ptr::copy(&self.len as *const u16 as *const u8, p, 2 + u16::from_le(self.len) as usize)}}} - edit in sanakirja-core/src/lib.rs at line 503[4.3229][36.2799]
/// Allocate many contiguous pages, return the first onefn alloc_contiguous(&mut self, length: u64) -> Result<MutPage, Self::Error>; - replacement in sanakirja-core/Cargo.toml at line 3
version = "1.3.0"version = "1.3.2" - replacement in sanakirja/src/lib.rs at line 108
pub use sanakirja_core::{btree, direct_repr, LoadPage, AllocPage, Storable, UnsizedStorable, MutPage, CowPage, Page};pub use sanakirja_core::{btree, direct_repr, LoadPage, AllocPage, Storable, UnsizedStorable, MutPage, CowPage, Page, Slice}; - replacement in sanakirja/Cargo.toml at line 3
version = "1.3.0"version = "1.3.1" - replacement in sanakirja/Cargo.toml at line 32
sanakirja-core = { path = "../sanakirja-core", version = "1.3.0" }sanakirja-core = { path = "../sanakirja-core", version = "1.3.1" }