Skip to main content

quill_sql/storage/
record.rs

1use std::fmt::{Display, Formatter};
2
3use crate::transaction::{CommandId, TransactionId, INVALID_COMMAND_ID};
4
5pub type PageId = u32;
6pub const INVALID_PAGE_ID: PageId = 0;
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq)]
9pub struct TupleMeta {
10    pub insert_txn_id: TransactionId,
11    pub insert_cid: CommandId,
12    pub delete_txn_id: TransactionId,
13    pub delete_cid: CommandId,
14    pub is_deleted: bool,
15    pub next_version: Option<RecordId>,
16    pub prev_version: Option<RecordId>,
17}
18
19impl TupleMeta {
20    pub fn new(insert_txn_id: TransactionId, insert_cid: CommandId) -> Self {
21        Self {
22            insert_txn_id,
23            insert_cid,
24            delete_txn_id: 0,
25            delete_cid: INVALID_COMMAND_ID,
26            is_deleted: false,
27            next_version: None,
28            prev_version: None,
29        }
30    }
31
32    pub fn mark_deleted(&mut self, txn_id: TransactionId, delete_cid: CommandId) {
33        self.is_deleted = true;
34        self.delete_txn_id = txn_id;
35        self.delete_cid = delete_cid;
36    }
37
38    pub fn clear_delete(&mut self) {
39        self.is_deleted = false;
40        self.delete_txn_id = 0;
41        self.delete_cid = INVALID_COMMAND_ID;
42    }
43
44    pub fn set_next_version(&mut self, next: Option<RecordId>) {
45        self.next_version = next;
46    }
47
48    pub fn set_prev_version(&mut self, prev: Option<RecordId>) {
49        self.prev_version = prev;
50    }
51
52    pub fn clear_chain(&mut self) {
53        self.next_version = None;
54        self.prev_version = None;
55    }
56}
57
58pub const EMPTY_TUPLE_META: TupleMeta = TupleMeta {
59    insert_txn_id: 0,
60    insert_cid: 0,
61    delete_txn_id: 0,
62    delete_cid: INVALID_COMMAND_ID,
63    is_deleted: false,
64    next_version: None,
65    prev_version: None,
66};
67
68pub const INVALID_RID: RecordId = RecordId {
69    page_id: INVALID_PAGE_ID,
70    slot_num: 0,
71};
72
73#[derive(derive_new::new, Debug, Clone, Copy, PartialEq, Eq, Hash)]
74pub struct RecordId {
75    pub page_id: PageId,
76    pub slot_num: u32,
77}
78
79impl Display for RecordId {
80    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
81        write!(f, "{}-{}", self.page_id, self.slot_num)
82    }
83}