Skip to content

Commit 89cb0d8

Browse files
authored
Merge pull request #1 from samuelorji/c1
chapter 1 done
2 parents 18a991a + c6b6ac0 commit 89cb0d8

File tree

3 files changed

+81
-1
lines changed

3 files changed

+81
-1
lines changed

giraffe.db

8 KB
Binary file not shown.

src/dal.rs

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
use std::fs::File;
2+
use std::os::unix::fs::{FileExt, OpenOptionsExt};
3+
4+
pub const PageSize : u32 = 4096;
5+
pub struct Dal {
6+
file : File,
7+
pageSize : u32
8+
}
9+
10+
impl Dal{
11+
pub fn new(path : &str, pageSize : u32) -> Self {
12+
let file = std::fs::OpenOptions::new()
13+
.create(true)
14+
.write(true)
15+
.append(true)
16+
.mode(0o666)
17+
.open(path)
18+
.unwrap();
19+
20+
Dal {
21+
file,
22+
pageSize
23+
}
24+
}
25+
26+
pub fn allocateEmptyPage(&self, pageNumber : Option<u64>) -> Page {
27+
Page::new(pageNumber)
28+
}
29+
30+
fn readPage(&self, pageNumber : u64) -> Page {
31+
let mut page = self.allocateEmptyPage(Some(pageNumber));
32+
let offset = pageNumber * self.pageSize as u64;
33+
self.file.read_at(&mut page.data, offset).unwrap();
34+
page
35+
}
36+
37+
pub fn writePage(&mut self, page : &mut Page) {
38+
let offset = page.pageNumber * self.pageSize as u64;
39+
self.file.write_at(&page.data, offset).unwrap();
40+
}
41+
42+
}
43+
44+
pub struct Page {
45+
pub pageNumber : u64,
46+
pub data : Vec<u8>
47+
}
48+
49+
impl Page {
50+
pub fn new(pageNumber : Option<u64>) -> Self {
51+
Page {
52+
pageNumber: pageNumber.unwrap_or(0), // if no page number, set to 0
53+
data: vec![0_u8; PageSize as usize] // create a 4kB zero filled vector
54+
}
55+
}
56+
}

src/main.rs

+25-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,27 @@
1+
use crate::dal::Dal;
2+
3+
mod dal;
4+
15
fn main() {
2-
println!("Hello, world!");
6+
// initialize Dal
7+
let mut dal = Dal::new("giraffe.db", dal::PageSize);
8+
9+
let mut page_0 = dal.allocateEmptyPage(Some(0));
10+
11+
writeToPage(&mut page_0.data, "Page 0, hello", 0);
12+
13+
dal.writePage(&mut page_0);
14+
15+
let mut page_1 = dal.allocateEmptyPage(Some(1));
16+
17+
writeToPage(&mut page_1.data, "Page 1, hello", 0);
18+
19+
// commit page
20+
dal.writePage(&mut page_1);
21+
22+
}
23+
24+
fn writeToPage(buffer: &mut[u8],msg : &str, startAt: usize) {
25+
// write to buffer from position `startAt`
26+
buffer[startAt .. msg.len()].copy_from_slice(msg.as_bytes());
327
}

0 commit comments

Comments
 (0)