]> git.proxmox.com Git - proxmox-backup.git/blame - src/backup/chunk_store.rs
depend on rust-crypto
[proxmox-backup.git] / src / backup / chunk_store.rs
CommitLineData
35cf5daa
DM
1use failure::*;
2use std::path::{Path, PathBuf};
3
4pub struct ChunkStore {
5 base: PathBuf,
6 chunk_dir: PathBuf,
7}
8
9// see RFC4648 for base32hex definition
10const BASE32HEX_ALPHABET: &'static [u8; 32] = b"0123456789ABCDEFGHIJKLMNOPQRSTUV";
11
12fn 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
18impl 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]
60fn 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}