1- use serde:: { de:: DeserializeOwned , Serialize } ;
21use std:: {
32 fs:: { self , File , OpenOptions } ,
43 io:: { self , Read , Seek , Write } ,
@@ -10,7 +9,6 @@ use crate::spec::ValueTrait;
109use super :: {
1110 cache:: { Cache , CacheBuilder } ,
1211 layout:: BlockHeader ,
13- pager:: Pager ,
1412 spec:: { PageNumber , BLOCK_HEADER_SIZE , PAGE_SIZE } ,
1513 Page ,
1614} ;
@@ -30,13 +28,13 @@ use super::{
3028/// | Page 04 |
3129/// +--------------+
3230/// ```
33- pub struct BlockIO {
31+ pub struct Block {
3432 pub header : BlockHeader ,
3533 file : File ,
3634 cache : Cache ,
3735}
3836
39- impl BlockIO {
37+ impl Block {
4038 pub fn new < P > ( path : P ) -> io:: Result < Self >
4139 where
4240 P : AsRef < Path > ,
@@ -56,14 +54,11 @@ impl BlockIO {
5654 let header = if is_empty ( & file) ? {
5755 let header = BlockHeader :: new ( ) ;
5856
59- let header_bytes = header. to_vec ( ) ;
60-
61- file. seek ( io:: SeekFrom :: Start ( 0 ) ) ?;
62- file. write_all ( & header_bytes) ?;
57+ Self :: write_header ( & mut file, & header) ?;
6358
6459 header
6560 } else {
66- let header = read_block_header ( & mut file) ?;
61+ let header = Self :: read_header ( & mut file) ?;
6762
6863 if !header. is_valid ( ) {
6964 return Err ( io:: Error :: new (
@@ -107,7 +102,7 @@ impl BlockIO {
107102 Self :: from_file ( new_file)
108103 }
109104
110- pub fn write_new_page ( & mut self , page : & Page ) -> io:: Result < u64 > {
105+ pub fn write_new_page ( & mut self , page : & Page ) -> io:: Result < u32 > {
111106 let new_index = self . len ( ) ?;
112107
113108 self . write_page ( new_index. into ( ) , page) ?;
@@ -146,35 +141,27 @@ impl BlockIO {
146141 Ok ( page)
147142 }
148143
149- pub fn page < T > ( & mut self , page_index : u64 ) -> io:: Result < Pager < T > >
144+ pub fn page < T > ( & mut self , page_index : u64 ) -> io:: Result < Page >
150145 where
151146 T : ValueTrait ,
152147 {
153148 let page = self . read_page ( page_index) ?;
154149
155- Ok ( Pager :: new ( self , page, page_index as u32 ) )
156- }
157-
158- pub fn write_header ( & mut self ) -> io:: Result < ( ) > {
159- self . file . seek ( io:: SeekFrom :: Start ( 0 ) ) ?;
160-
161- self . file . write_all ( & self . header . to_vec ( ) ) ?;
162-
163- Ok ( ( ) )
150+ Ok ( page)
164151 }
165152
166- pub fn len ( & self ) -> io:: Result < u64 > {
153+ pub fn len ( & self ) -> io:: Result < u32 > {
167154 let file_size = self . size ( ) ?;
168155
169- Ok ( file_size - BLOCK_HEADER_SIZE as u64 / PAGE_SIZE as u64 )
156+ Ok ( ( file_size as u32 - BLOCK_HEADER_SIZE as u32 ) / PAGE_SIZE as u32 )
170157 }
171158
172159 pub fn is_empty ( & self ) -> io:: Result < bool > {
173160 Ok ( self . len ( ) ? == 0 )
174161 }
175162
176163 pub fn exists ( & self , page_index : PageNumber ) -> io:: Result < bool > {
177- Ok ( self . len ( ) ? > page_index as u64 )
164+ Ok ( self . len ( ) ? > page_index)
178165 }
179166
180167 pub fn index_to_offset ( & self , page_index : u64 ) -> u64 {
@@ -190,6 +177,30 @@ impl BlockIO {
190177 pub fn sync ( & self ) -> io:: Result < ( ) > {
191178 self . file . sync_data ( )
192179 }
180+
181+ pub fn persist_header ( & mut self ) -> io:: Result < ( ) > {
182+ Self :: write_header ( & mut self . file , & self . header ) ?;
183+
184+ Ok ( ( ) )
185+ }
186+
187+ fn write_header ( file : & mut File , header : & BlockHeader ) -> io:: Result < ( ) > {
188+ file. seek ( io:: SeekFrom :: Start ( 0 ) ) ?;
189+
190+ file. write_all ( & header. to_vec ( ) ) ?;
191+
192+ Ok ( ( ) )
193+ }
194+
195+ fn read_header ( file : & mut File ) -> io:: Result < BlockHeader > {
196+ let mut buffer = [ 0 ; BLOCK_HEADER_SIZE ] ;
197+
198+ file. seek ( io:: SeekFrom :: Start ( 0 ) ) ?;
199+
200+ file. read_exact ( & mut buffer) ?;
201+
202+ Ok ( BlockHeader :: from_slice ( & buffer) )
203+ }
193204}
194205
195206pub fn open_file ( path : & Path ) -> io:: Result < File > {
@@ -208,13 +219,3 @@ pub fn is_empty(file: &File) -> io::Result<bool> {
208219
209220 Ok ( metadata. is_file ( ) && metadata. len ( ) == 0 )
210221}
211-
212- pub fn read_block_header ( file : & mut File ) -> io:: Result < BlockHeader > {
213- let mut buffer = [ 0 ; BLOCK_HEADER_SIZE ] ;
214-
215- file. seek ( io:: SeekFrom :: Start ( 0 ) ) ?;
216-
217- file. read_exact ( & mut buffer) ?;
218-
219- Ok ( BlockHeader :: from_slice ( & buffer) )
220- }
0 commit comments