diff options
author | Alexander Batischev <eual.jp@gmail.com> | 2021-04-26 13:41:58 +0300 |
---|---|---|
committer | Alexander Batischev <eual.jp@gmail.com> | 2021-04-26 22:52:02 +0300 |
commit | 4ae0960619537234d5591b40d05f91b131330618 (patch) | |
tree | 314e48f95e781e0e3b65dab7467e2fed4afafa47 | |
parent | 7176a544757eacc2823f1c0f014861ad2525e6da (diff) | |
download | obnam2-4ae0960619537234d5591b40d05f91b131330618.tar.gz |
Port chunkids() to the iterator API
-rw-r--r-- | src/backup_run.rs | 6 | ||||
-rw-r--r-- | src/cmd/restore.rs | 3 | ||||
-rw-r--r-- | 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<Vec<ChunkId>> { + pub fn chunkids(&self, fileno: FileId) -> LocalGenerationResult<sql::SqlResults<ChunkId>> { sql::chunkids(&self.conn, fileno) } @@ -359,15 +359,22 @@ mod sql { ) } - pub fn chunkids(conn: &Connection, fileno: FileId) -> LocalGenerationResult<Vec<ChunkId>> { - 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<ChunkId> = 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<ChunkId>> { + 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( |