Mercurial > lbo > hg > leveldb-rs
changeset 82:5e09bc13104c
Add TableReader
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Sat, 20 Aug 2016 09:11:43 +0200 |
parents | 3e4f2805ab57 |
children | 61ddfaefc367 |
files | src/table_reader.rs |
diffstat | 1 files changed, 66 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/table_reader.rs Sat Aug 20 09:11:43 2016 +0200 @@ -0,0 +1,66 @@ +use std::io::{Read, Seek, SeekFrom, Result}; +use options::Options; +use types::Comparator; +use blockhandle::BlockHandle; +use filter_block::FilterBlockReader; +use filter::FilterPolicy; + +use table_builder; + +struct TableFooter { + metaindex: BlockHandle, + index: BlockHandle, +} + +impl TableFooter { + fn parse(footer: &[u8]) -> TableFooter { + assert_eq!(footer.len(), table_builder::FULL_FOOTER_LENGTH); + assert_eq!(&footer[footer.len() - 8..], + table_builder::MAGIC_FOOTER_ENCODED); + + let (mi, n1) = BlockHandle::decode(footer); + let (ix, _) = BlockHandle::decode(&footer[n1..]); + + TableFooter { + metaindex: mi, + index: ix, + } + } +} + +pub struct Table<R: Read + Seek, C: Comparator, FP: FilterPolicy> { + file: R, + file_size: usize, + opt: Options, + c: C, + filters: FilterBlockReader<FP>, +} + +impl<R: Read + Seek, C: Comparator, FP: FilterPolicy> Table<R, C, FP> { + pub fn new(mut file: R, size: usize, cmp: C, fp: FP, opt: Options) -> Table<R, C, FP> { + let indexblock = Table::<R, C, FP>::read_index_block(&mut file, size); + let fblockreader = FilterBlockReader::new(fp, indexblock); + Table { + file: file, + file_size: size, + c: cmp, + opt: opt, + filters: fblockreader, + } + } + + fn read_footer(f: &mut R, size: usize) -> Result<TableFooter> { + try!(f.seek(SeekFrom::Start((size - table_builder::FULL_FOOTER_LENGTH) as u64))); + let mut buf = [0; table_builder::FULL_FOOTER_LENGTH]; + try!(f.read_exact(&mut buf)); + Ok(TableFooter::parse(&buf)) + } + + fn read_index_block(f: &mut R, size: usize) -> Vec<u8> { + unimplemented!() + } + + pub fn approx_offset_of(&self, key: &[u8]) -> usize { + unimplemented!() + } +}