From d1ff654deda325d42ddfef8e9dc6b5954cffec67 Mon Sep 17 00:00:00 2001 From: Paul Masurel Date: Thu, 21 Jan 2016 09:45:31 +0900 Subject: [PATCH] added json meta writing --- Cargo.toml | 1 + src/core/directory.rs | 40 ++++++++++++++++++++++++++++++++++------ src/core/mod.rs | 1 - src/lib.rs | 3 +++ 4 files changed, 38 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index cf3dab3a3..b12e04f41 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,3 +13,4 @@ fst = "0.1.26" rand = "0.3.13" atomicwrites = "0.0.14" tempfile = "2.0.0" +rustc-serialize = "0.3.16" diff --git a/src/core/directory.rs b/src/core/directory.rs index 2d94e9841..f2962389f 100644 --- a/src/core/directory.rs +++ b/src/core/directory.rs @@ -15,7 +15,8 @@ use std::cell::RefCell; use core::error::*; use rand::{thread_rng, Rng}; use fst::raw::MmapReadOnly; -// use sys::fs as fs_imp; +use rustc_serialize::json; +use atomicwrites; #[derive(Clone, Debug)] pub struct SegmentId(pub String); @@ -28,12 +29,25 @@ pub fn generate_segment_name() -> SegmentId { SegmentId( String::from("_") + &random_name) } +// #[derive()] +#[derive(Clone,Debug,RustcDecodable, RustcEncodable)] +pub struct DirectoryMeta { + segments: Vec +} + +impl DirectoryMeta { + fn new() -> DirectoryMeta { + DirectoryMeta { + segments: Vec::new() + } + } +} #[derive(Clone)] pub struct Directory { index_path: PathBuf, mmap_cache: Arc>>, - segments: Vec, + metas: DirectoryMeta, } impl fmt::Debug for Directory { @@ -70,7 +84,7 @@ impl Directory { // TODO find a rusty way to hide that, while keeping // it visible for IndexWriters. pub fn publish_segment(&mut self, segment: Segment) { - self.segments.push(segment.clone()); + self.metas.segments.push(segment.segment_id.0.clone()); self.save_metas(); } @@ -79,7 +93,7 @@ impl Directory { let mut directory = Directory { index_path: PathBuf::from(filepath), mmap_cache: Arc::new(Mutex::new(HashMap::new())), - segments: Vec::new() + metas: DirectoryMeta::new() }; try!(directory.load_metas()); //< does the directory already exists? Ok(directory) @@ -90,9 +104,21 @@ impl Directory { Ok(()) } + fn meta_filepath(&self,) -> PathBuf { + self.resolve_path(&PathBuf::from("meta.json")) + } + pub fn save_metas(&self,) -> Result<()> { - // TODO - Ok(()) + let encoded = json::encode(&self.metas).unwrap(); + let meta_filepath = self.meta_filepath(); + let meta_file = atomicwrites::AtomicFile::new(meta_filepath, atomicwrites::AllowOverwrite); + let write_result = meta_file.write(|f| { + f.write_all(encoded.as_bytes()) + }); + match write_result { + Ok(_) => Ok(()), + Err(ioerr) => Err(Error::IOError(ioerr.kind(), format!("Failed to write meta file : {:?}", ioerr))), + } } @@ -169,6 +195,8 @@ pub struct Segment { segment_id: SegmentId, } + + impl Segment { fn path_suffix(component: &SegmentComponent)-> &'static str { match *component { diff --git a/src/core/mod.rs b/src/core/mod.rs index f5cd4fa11..59260d8c1 100644 --- a/src/core/mod.rs +++ b/src/core/mod.rs @@ -9,5 +9,4 @@ pub mod serial; pub mod reader; pub mod codec; pub mod error; - pub use core::global::DocId; diff --git a/src/lib.rs b/src/lib.rs index 267ebd555..d9bb16e2d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,5 +7,8 @@ extern crate byteorder; extern crate memmap; extern crate rand; extern crate regex; +extern crate rustc_serialize; +extern crate atomicwrites; + pub mod core;