mod page_bytes;
pub use page_bytes::PageBytes;
pub const HEAD_FENCE_MISMATCH_GROUP: &str = "depot";
pub const HEAD_FENCE_MISMATCH_CODE: &str = "head_fence_mismatch";
pub fn is_head_fence_mismatch(group: &str, code: &str) -> bool {
group == HEAD_FENCE_MISMATCH_GROUP && code == HEAD_FENCE_MISMATCH_CODE
}
pub const TRANSACTION_TOO_LARGE_GROUP: &str = "sqlite";
pub const TRANSACTION_TOO_LARGE_CODE: &str = "transaction_too_large";
pub fn is_transaction_too_large(group: &str, code: &str) -> bool {
group == TRANSACTION_TOO_LARGE_GROUP && code == TRANSACTION_TOO_LARGE_CODE
}
pub const SHARD_SIZE: u32 = 64;
pub const COMMIT_SEGMENT_MAX_SHARDS: u32 = 5;
pub const MAX_COMMIT_DIRTY_PAGES: usize = 32_768;
pub fn segment_start_for_page(pgno: u32) -> u32 {
pgno / SHARD_SIZE * SHARD_SIZE
}
pub fn cut_page_segments<T>(pages: &[T], pgno_of: impl Fn(&T) -> u32) -> Vec<(u32, &[T])> {
let mut segments = Vec::new();
let mut start = 0;
while start < pages.len() {
let first_shard = pgno_of(&pages[start]) / SHARD_SIZE;
let shard_limit = first_shard.saturating_add(COMMIT_SEGMENT_MAX_SHARDS);
let end = pages[start..]
.iter()
.position(|page| pgno_of(page) / SHARD_SIZE >= shard_limit)
.map_or(pages.len(), |offset| start + offset);
segments.push((first_shard * SHARD_SIZE, &pages[start..end]));
start = end;
}
segments
}
#[derive(Clone, Debug, PartialEq)]
pub enum BindParam {
Null,
Integer(i64),
Float(f64),
Text(String),
Blob(Vec<u8>),
}
#[derive(Clone, Debug, PartialEq)]
pub struct ExecResult {
pub changes: i64,
}
#[derive(Clone, Debug, PartialEq)]
pub struct QueryResult {
pub columns: Vec<String>,
pub rows: Vec<Vec<ColumnValue>>,
}
#[derive(Clone, Debug, PartialEq)]
pub struct ExecuteResult {
pub columns: Vec<String>,
pub rows: Vec<Vec<ColumnValue>>,
pub changes: i64,
pub last_insert_row_id: Option<i64>,
}
impl ExecuteResult {
pub fn into_query_result(self) -> QueryResult {
QueryResult {
columns: self.columns,
rows: self.rows,
}
}
pub fn into_exec_result(self) -> ExecResult {
ExecResult {
changes: self.changes,
}
}
}
#[derive(Clone, Debug, PartialEq)]
pub enum ColumnValue {
Null,
Integer(i64),
Float(f64),
Text(String),
Blob(Vec<u8>),
}