11use super :: index:: RIndex ;
22use super :: pagerange:: { PageRange , PageRangeMetadata } ;
3- use super :: record:: Record ;
3+ use super :: record:: { Record , RecordMetadata } ;
44use bincode;
55use pyo3:: prelude:: * ;
66use serde:: { Deserialize , Serialize } ;
77use std:: collections:: HashMap ;
88use std:: fs:: File ;
99use std:: io:: { BufReader , BufWriter , Write } ;
1010
11+ #[ derive( Default , Clone , Serialize , Deserialize ) ]
12+ pub struct PageDirectoryMetadata {
13+ pub directory : HashMap < i64 , RecordMetadata > ,
14+ }
15+
1116#[ derive( Default , Clone ) ]
1217pub struct PageDirectory {
1318 pub directory : HashMap < i64 , Record > ,
@@ -21,10 +26,47 @@ impl PageDirectory {
2126 }
2227
2328 fn load_state ( ) -> PageDirectory {
24- PageDirectory :: default ( )
29+ let hardcoded_filename = "./redoxdata/page_directory.data" ;
30+
31+ let file = BufReader :: new ( File :: open ( hardcoded_filename) . expect ( "Should open file." ) ) ;
32+ let page_meta: PageDirectoryMetadata =
33+ bincode:: deserialize_from ( file) . expect ( "Should deserialize." ) ;
34+
35+ let mut pd: PageDirectory = PageDirectory {
36+ directory : HashMap :: new ( ) ,
37+ } ;
38+
39+ // TODO: We need to somehow load all of the physical pages, wrap them
40+ // in an Arc Mutex, and assign those references to the record addresses
41+ // that need them
42+ //
43+ // We could store the id for where the the physical page it stored on disk
44+ // in the physical, and then we can load all of them up here, assuming we
45+ // have something storing the max page index
46+
47+ for ( rid, record_meta) in page_meta. directory {
48+ pd. directory . insert ( rid, record_meta. load_state ( ) ) ;
49+ }
50+
51+ return pd;
2552 }
2653
2754 fn save_state ( & self ) {
55+ let hardcoded_filename = "./redoxdata/page_directory.data" ;
56+
57+ let mut pd_meta = PageDirectoryMetadata {
58+ directory : HashMap :: new ( ) ,
59+ } ;
60+
61+ for ( rid, record) in & self . directory {
62+ let r: RecordMetadata = record. get_metadata ( ) ;
63+ pd_meta. directory . insert ( * rid, r) ;
64+ }
65+
66+ let table_bytes: Vec < u8 > = bincode:: serialize ( & pd_meta) . expect ( "Should serialize." ) ;
67+
68+ let mut file = BufWriter :: new ( File :: create ( hardcoded_filename) . expect ( "Should open file." ) ) ;
69+ file. write_all ( & table_bytes) . expect ( "Should serialize." ) ;
2870 }
2971}
3072
@@ -236,6 +278,8 @@ impl RTable {
236278 // Save the state of the page range
237279 self . page_range . save_state ( ) ;
238280
281+ self . page_directory . save_state ( ) ;
282+
239283 let table_meta = self . get_metadata ( ) ;
240284
241285 let table_bytes: Vec < u8 > = bincode:: serialize ( & table_meta) . expect ( "Should serialize." ) ;
0 commit comments