Mercurial > lbo > hg > sstable
changeset 45:088c7924e3f0
Make Files usable as table source/destination.
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Sun, 11 Mar 2018 16:54:53 +0100 |
parents | d0d878a8cbcc |
children | 3dac643ee26a |
files | src/block.rs src/lib.rs src/table_builder.rs src/table_reader.rs src/types.rs |
diffstat | 5 files changed, 28 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/src/block.rs Sun Mar 11 16:27:37 2018 +0100 +++ b/src/block.rs Sun Mar 11 16:54:53 2018 +0100 @@ -304,7 +304,6 @@ mod tests { use super::*; use block_builder::BlockBuilder; - use options; use test_util::{test_iterator_properties, SSIteratorIter}; use types::{current_key_val, SSIterator};
--- a/src/lib.rs Sun Mar 11 16:27:37 2018 +0100 +++ b/src/lib.rs Sun Mar 11 16:54:53 2018 +0100 @@ -21,6 +21,7 @@ mod table_reader; pub use cmp::{Cmp, DefaultCmp}; +pub use error::{Result, Status, StatusCode}; pub use options::Options; pub use types::{current_key_val, SSIterator}; pub use table_builder::TableBuilder;
--- a/src/table_builder.rs Sun Mar 11 16:27:37 2018 +0100 +++ b/src/table_builder.rs Sun Mar 11 16:54:53 2018 +0100 @@ -265,7 +265,6 @@ mod tests { use super::*; use blockhandle::BlockHandle; - use options; #[test] fn test_footer() {
--- a/src/table_reader.rs Sun Mar 11 16:27:37 2018 +0100 +++ b/src/table_reader.rs Sun Mar 11 16:54:53 2018 +0100 @@ -9,6 +9,8 @@ use types::{current_key_val, RandomAccess, SSIterator}; use std::cmp::Ordering; +use std::fs; +use std::path; use std::rc::Rc; use integer_encoding::FixedIntWriter; @@ -34,26 +36,32 @@ } impl Table { - /// Creates a new table reader operating on unformatted keys (i.e., UserKey). - fn new(opt: Options, file: Rc<Box<RandomAccess>>, size: usize) -> Result<Table> { - let footer = try!(read_footer(file.as_ref().as_ref(), size)); + /// Creates a new table reader from a file at `path`. + pub fn new_from_file(opt: Options, path: &path::Path) -> Result<Table> { + let f = fs::OpenOptions::new().read(true).open(path)?; + let size = f.metadata()?.len() as usize; + Table::new(opt, Box::new(f), size) + } + + /// Creates a new table reader. + pub fn new(opt: Options, file: Box<RandomAccess>, size: usize) -> Result<Table> { + let footer = try!(read_footer(file.as_ref(), size)); let indexblock = try!(table_block::read_table_block( opt.clone(), - file.as_ref().as_ref(), + file.as_ref(), &footer.index )); let metaindexblock = try!(table_block::read_table_block( opt.clone(), - file.as_ref().as_ref(), + file.as_ref(), &footer.meta_index )); - let filter_block_reader = - Table::read_filter_block(&metaindexblock, file.as_ref().as_ref(), &opt)?; + let filter_block_reader = Table::read_filter_block(&metaindexblock, file.as_ref(), &opt)?; let cache_id = opt.block_cache.borrow_mut().new_cache_id(); Ok(Table { - file: file, + file: Rc::new(file), file_size: size, cache_id: cache_id, opt: opt, @@ -346,7 +354,7 @@ #[cfg(test)] mod tests { - use options::{self, CompressionType}; + use options::CompressionType; use table_builder::TableBuilder; use test_util::{test_iterator_properties, SSIteratorIter}; use types::{current_key_val, SSIterator}; @@ -392,8 +400,8 @@ (d, size) } - fn wrap_buffer(src: Vec<u8>) -> Rc<Box<RandomAccess>> { - Rc::new(Box::new(src)) + fn wrap_buffer(src: Vec<u8>) -> Box<RandomAccess> { + Box::new(src) } #[test]
--- a/src/types.rs Sun Mar 11 16:27:37 2018 +0100 +++ b/src/types.rs Sun Mar 11 16:54:53 2018 +0100 @@ -2,7 +2,9 @@ use error::Result; +use std::fs::File; use std::cell::RefCell; +use std::os::unix::fs::FileExt; use std::rc::Rc; pub trait RandomAccess { @@ -29,6 +31,12 @@ } } +impl RandomAccess for File { + fn read_at(&self, off: usize, dst: &mut [u8]) -> Result<usize> { + Ok((self as &FileExt).read_at(dst, off as u64)?) + } +} + /// A shared thingy with interior mutability. pub type Shared<T> = Rc<RefCell<T>>;