From 4ae0960619537234d5591b40d05f91b131330618 Mon Sep 17 00:00:00 2001 From: Alexander Batischev Date: Mon, 26 Apr 2021 13:41:58 +0300 Subject: Port chunkids() to the iterator API --- src/backup_run.rs | 6 +++++- src/cmd/restore.rs | 3 ++- src/generation.rs | 27 +++++++++++++++++---------- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/backup_run.rs b/src/backup_run.rs index e966855..23c97f6 100644 --- a/src/backup_run.rs +++ b/src/backup_run.rs @@ -149,7 +149,11 @@ impl<'a> IncrementalBackup<'a> { Reason::Unchanged | Reason::Skipped | Reason::FileError => { let fileno = old.get_fileno(&entry.pathbuf())?; let ids = if let Some(fileno) = fileno { - old.chunkids(fileno)? + let mut ids = vec![]; + for id in old.chunkids(fileno)?.iter()? { + ids.push(id?); + } + ids } else { vec![] }; diff --git a/src/cmd/restore.rs b/src/cmd/restore.rs index 91045f1..4de0830 100644 --- a/src/cmd/restore.rs +++ b/src/cmd/restore.rs @@ -172,7 +172,8 @@ fn restore_regular( std::fs::create_dir_all(parent)?; { let mut file = std::fs::File::create(path)?; - for chunkid in gen.chunkids(fileid)? { + for chunkid in gen.chunkids(fileid)?.iter()? { + let chunkid = chunkid?; let chunk = client.fetch_chunk(&chunkid)?; file.write_all(chunk.data())?; } diff --git a/src/generation.rs b/src/generation.rs index 54c55a7..0055bfe 100644 --- a/src/generation.rs +++ b/src/generation.rs @@ -200,7 +200,7 @@ impl LocalGeneration { sql::files(&self.conn) } - pub fn chunkids(&self, fileno: FileId) -> LocalGenerationResult> { + pub fn chunkids(&self, fileno: FileId) -> LocalGenerationResult> { sql::chunkids(&self.conn, fileno) } @@ -359,15 +359,22 @@ mod sql { ) } - pub fn chunkids(conn: &Connection, fileno: FileId) -> LocalGenerationResult> { - let mut stmt = conn.prepare("SELECT chunkid FROM chunks WHERE fileno = ?1")?; - let iter = stmt.query_map(params![fileno], |row| row.get(0))?; - let mut ids: Vec = vec![]; - for x in iter { - let fileno: String = x?; - ids.push(ChunkId::from(&fileno)); - } - Ok(ids) + pub fn chunkids( + conn: &Connection, + fileno: FileId, + ) -> LocalGenerationResult> { + SqlResults::new( + conn, + "SELECT chunkid FROM chunks WHERE fileno = ?1", + Box::new(move |stmt| { + let iter = stmt.query_map(params![fileno], |row| row.get(0))?; + let iter = iter.map(|x| { + let fileno: String = x?; + Ok(ChunkId::from(&fileno)) + }); + Ok(Box::new(iter)) + }), + ) } pub fn get_file( -- cgit v1.2.1