mirror of
https://github.com/tursodatabase/limbo.git
synced 2025-08-04 18:18:03 +00:00
core(refactor): Add CreateBTreeFlags
Passing 1s and 0s with comments is not rustacean, and since we already follow the pattern of struct flags in other sections of the codebase it's better use it here too.
This commit is contained in:
parent
da484b33aa
commit
51eb2af06a
6 changed files with 45 additions and 15 deletions
|
@ -206,14 +206,11 @@ impl Pager {
|
|||
})
|
||||
}
|
||||
|
||||
pub fn btree_create(&self, flags: usize) -> u32 {
|
||||
pub fn btree_create(&self, flags: &CreateBTreeFlags) -> u32 {
|
||||
let page_type = match flags {
|
||||
1 => PageType::TableLeaf,
|
||||
2 => PageType::IndexLeaf,
|
||||
_ => unreachable!(
|
||||
"wrong create table flags, should be 1 for table and 2 for index, got {}",
|
||||
flags,
|
||||
),
|
||||
_ if flags.is_table() => PageType::TableLeaf,
|
||||
_ if flags.is_index() => PageType::IndexLeaf,
|
||||
_ => unreachable!("Invalid flags state"),
|
||||
};
|
||||
let page = self.do_allocate_page(page_type, 0);
|
||||
let id = page.get().id;
|
||||
|
@ -642,6 +639,33 @@ pub fn allocate_page(page_id: usize, buffer_pool: &Rc<BufferPool>, offset: usize
|
|||
page
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct CreateBTreeFlags(pub u8);
|
||||
impl CreateBTreeFlags {
|
||||
pub const TABLE: u8 = 0b0001;
|
||||
pub const INDEX: u8 = 0b0010;
|
||||
|
||||
pub fn new_table() -> Self {
|
||||
Self(CreateBTreeFlags::TABLE)
|
||||
}
|
||||
|
||||
pub fn new_index() -> Self {
|
||||
Self(CreateBTreeFlags::INDEX)
|
||||
}
|
||||
|
||||
pub fn is_table(&self) -> bool {
|
||||
(self.0 & CreateBTreeFlags::TABLE) != 0
|
||||
}
|
||||
|
||||
pub fn is_index(&self) -> bool {
|
||||
(self.0 & CreateBTreeFlags::INDEX) != 0
|
||||
}
|
||||
|
||||
pub fn get_flags(&self) -> u8 {
|
||||
self.0
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use std::sync::Arc;
|
||||
|
|
|
@ -2,6 +2,7 @@ use std::sync::Arc;
|
|||
|
||||
use crate::{
|
||||
schema::{BTreeTable, Column, Index, IndexColumn, PseudoTable, Schema},
|
||||
storage::pager::CreateBTreeFlags,
|
||||
types::Record,
|
||||
util::normalize_ident,
|
||||
vdbe::{
|
||||
|
@ -91,7 +92,7 @@ pub fn translate_create_index(
|
|||
program.emit_insn(Insn::CreateBtree {
|
||||
db: 0,
|
||||
root: root_page_reg,
|
||||
flags: 2, // index leaf
|
||||
flags: CreateBTreeFlags::new_index(),
|
||||
});
|
||||
|
||||
// open the sqlite schema table for writing and create a new entry for the index
|
||||
|
|
|
@ -2,6 +2,7 @@ use std::fmt::Display;
|
|||
|
||||
use crate::ast;
|
||||
use crate::schema::Schema;
|
||||
use crate::storage::pager::CreateBTreeFlags;
|
||||
use crate::translate::ProgramBuilder;
|
||||
use crate::translate::ProgramBuilderOpts;
|
||||
use crate::translate::QueryMode;
|
||||
|
@ -60,7 +61,7 @@ pub fn translate_create_table(
|
|||
program.emit_insn(Insn::CreateBtree {
|
||||
db: 0,
|
||||
root: table_root_reg,
|
||||
flags: 1, // Table leaf page
|
||||
flags: CreateBTreeFlags::new_table(),
|
||||
});
|
||||
|
||||
// Create an automatic index B-tree if needed
|
||||
|
@ -92,7 +93,7 @@ pub fn translate_create_table(
|
|||
program.emit_insn(Insn::CreateBtree {
|
||||
db: 0,
|
||||
root: index_root_reg,
|
||||
flags: 2, // Index leaf page
|
||||
flags: CreateBTreeFlags::new_index(),
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -4171,7 +4171,7 @@ pub fn op_create_btree(
|
|||
// TODO: implement temp databases
|
||||
todo!("temp databases not implemented yet");
|
||||
}
|
||||
let root_page = pager.btree_create(*flags);
|
||||
let root_page = pager.btree_create(flags);
|
||||
state.registers[*root] = Register::OwnedValue(OwnedValue::Integer(root_page as i64));
|
||||
state.pc += 1;
|
||||
Ok(InsnFunctionStepResult::Step)
|
||||
|
|
|
@ -1177,10 +1177,10 @@ pub fn insn_to_str(
|
|||
"CreateBtree",
|
||||
*db as i32,
|
||||
*root as i32,
|
||||
*flags as i32,
|
||||
flags.get_flags() as i32,
|
||||
OwnedValue::build_text(""),
|
||||
0,
|
||||
format!("r[{}]=root iDb={} flags={}", root, db, flags),
|
||||
format!("r[{}]=root iDb={} flags={}", root, db, flags.get_flags()),
|
||||
),
|
||||
Insn::Destroy {
|
||||
root,
|
||||
|
|
|
@ -1,7 +1,11 @@
|
|||
use std::{num::NonZero, rc::Rc};
|
||||
|
||||
use super::{execute, AggFunc, BranchOffset, CursorID, FuncCtx, InsnFunction, PageIdx};
|
||||
use crate::{schema::BTreeTable, storage::wal::CheckpointMode, types::Record};
|
||||
use crate::{
|
||||
schema::BTreeTable,
|
||||
storage::{pager::CreateBTreeFlags, wal::CheckpointMode},
|
||||
types::Record,
|
||||
};
|
||||
use limbo_macros::Description;
|
||||
|
||||
/// Flags provided to comparison instructions (e.g. Eq, Ne) which determine behavior related to NULL values.
|
||||
|
@ -703,7 +707,7 @@ pub enum Insn {
|
|||
/// The root page of the new b-tree (P2).
|
||||
root: usize,
|
||||
/// Flags (P3).
|
||||
flags: usize,
|
||||
flags: CreateBTreeFlags,
|
||||
},
|
||||
|
||||
/// Deletes an entire database table or index whose root page in the database file is given by P1.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue