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>>;