File tree 3 files changed +81
-1
lines changed
3 files changed +81
-1
lines changed Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
1
+ use crate :: dal:: Dal ;
2
+
3
+ mod dal;
4
+
1
5
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 ( ) ) ;
3
27
}
You can’t perform that action at this time.
0 commit comments