]>
Commit | Line | Data |
---|---|---|
35cf5daa DM |
1 | use failure::*; |
2 | use std::path::{Path, PathBuf}; | |
3 | ||
4 | pub struct ChunkStore { | |
5 | base: PathBuf, | |
6 | chunk_dir: PathBuf, | |
7 | } | |
8 | ||
9 | // see RFC4648 for base32hex definition | |
10 | const BASE32HEX_ALPHABET: &'static [u8; 32] = b"0123456789ABCDEFGHIJKLMNOPQRSTUV"; | |
11 | ||
12 | fn u10_to_base32hex(num: usize) -> String { | |
13 | let lo = num & 0b11111 as usize; | |
14 | let hi = num >> 5 as usize; | |
15 | format!("{}{}", BASE32HEX_ALPHABET[hi] as char, BASE32HEX_ALPHABET[lo] as char) | |
16 | } | |
17 | ||
18 | impl ChunkStore { | |
19 | ||
20 | fn new<P: Into<PathBuf>>(path: P) -> Self { | |
21 | let base = path.into(); | |
22 | let mut chunk_dir = base.clone(); | |
23 | chunk_dir.push(".chunks"); | |
24 | ||
25 | ChunkStore { base, chunk_dir } | |
26 | } | |
27 | ||
28 | pub fn create<P: Into<PathBuf>>(path: P) -> Result<Self, Error> { | |
29 | ||
30 | let me = Self::new(path); | |
31 | ||
32 | std::fs::create_dir(&me.base)?; | |
33 | std::fs::create_dir(&me.chunk_dir)?; | |
34 | ||
35 | // create 1024 subdir | |
36 | for i in 0..1024 { | |
37 | let mut l1path = me.base.clone(); | |
38 | l1path.push(u10_to_base32hex(i)); | |
39 | std::fs::create_dir(&l1path)?; | |
40 | } | |
41 | ||
42 | Ok(me) | |
43 | } | |
44 | ||
45 | pub fn open<P: Into<PathBuf>>(path: P) -> Result<Self, Error> { | |
46 | ||
47 | let me = Self::new(path); | |
48 | ||
49 | let metadata = std::fs::metadata(&me.chunk_dir)?; | |
50 | ||
51 | println!("{:?}", metadata.file_type()); | |
52 | ||
53 | Ok(me) | |
54 | } | |
55 | ||
56 | } | |
57 | ||
58 | ||
59 | #[test] | |
60 | fn test_chunk_store1() { | |
61 | ||
62 | if let Err(_e) = std::fs::remove_dir_all(".testdir") { /* ignore */ } | |
63 | ||
64 | let chunk_store = ChunkStore::open(".testdir"); | |
65 | assert!(chunk_store.is_err()); | |
66 | ||
67 | let chunk_store = ChunkStore::create(".testdir"); | |
68 | assert!(chunk_store.is_ok()); | |
69 | ||
70 | let chunk_store = ChunkStore::create(".testdir"); | |
71 | assert!(chunk_store.is_err()); | |
72 | ||
73 | ||
74 | } |