diff --git a/bindings/javascript/src/lib.rs b/bindings/javascript/src/lib.rs index 0d50c6a8f..26af16cc4 100644 --- a/bindings/javascript/src/lib.rs +++ b/bindings/javascript/src/lib.rs @@ -473,6 +473,15 @@ impl DatabaseFile { } impl turso_core::DatabaseStorage for DatabaseFile { + fn read_header(&self, c: turso_core::Completion) -> turso_core::Result { + let r = c.as_read(); + let size = r.buf().len(); + assert!( + size == 100, + "the size of the database header must be 100 bytes, got {size}" + ); + self.file.pread(0, c) + } fn read_page( &self, page_idx: usize, diff --git a/core/storage/database.rs b/core/storage/database.rs index 1e82b1028..8e99bca56 100644 --- a/core/storage/database.rs +++ b/core/storage/database.rs @@ -9,6 +9,7 @@ use tracing::{instrument, Level}; /// the storage medium. A database can either be a file on disk, like in SQLite, /// or something like a remote page server service. pub trait DatabaseStorage: Send + Sync { + fn read_header(&self, c: Completion) -> Result; fn read_page(&self, page_idx: usize, c: Completion) -> Result; fn write_page(&self, page_idx: usize, buffer: Arc, c: Completion) -> Result; @@ -37,6 +38,16 @@ unsafe impl Sync for DatabaseFile {} #[cfg(feature = "fs")] impl DatabaseStorage for DatabaseFile { + #[instrument(skip_all, level = Level::DEBUG)] + fn read_header(&self, c: Completion) -> Result { + let r = c.as_read(); + let size = r.buf().len(); + assert!( + size == 100, + "the size of the database header must be 100 bytes, got {size}" + ); + self.file.pread(0, c) + } #[instrument(skip_all, level = Level::DEBUG)] fn read_page(&self, page_idx: usize, c: Completion) -> Result { let r = c.as_read();