summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2021-01-01 16:36:22 +0200
committerLars Wirzenius <liw@liw.fi>2021-01-01 17:45:50 +0200
commit3eefe4180855f1dd144545fd50eb71d96d798487 (patch)
tree9e8c82dc41555bfc5aea145ad6d2aca7a74d3866
parentb5c4df5d31a4624d24171ba70db567327f3aae67 (diff)
downloadobnam2-3eefe4180855f1dd144545fd50eb71d96d798487.tar.gz
feat! use signed 64 bit integers as file numbers, file counts
-rw-r--r--src/cmd/backup.rs4
-rw-r--r--src/cmd/restore.rs10
-rw-r--r--src/generation.rs32
3 files changed, 22 insertions, 24 deletions
diff --git a/src/cmd/backup.rs b/src/cmd/backup.rs
index 2a8e086..4d13fe7 100644
--- a/src/cmd/backup.rs
+++ b/src/cmd/backup.rs
@@ -51,7 +51,7 @@ pub fn backup(config: &ClientConfig, buffer_size: usize) -> anyhow::Result<()> {
Some(old) => {
info!("incremental backup based on {}", old);
let old = client.fetch_generation(&old, &oldname)?;
- progress.set_length(old.file_count()?.into());
+ progress.set_length(old.file_count()? as u64);
new.insert_iter(iter.map(|entry| {
progress.inc(1);
match entry {
@@ -76,7 +76,7 @@ pub fn backup(config: &ClientConfig, buffer_size: usize) -> anyhow::Result<()> {
}))?;
}
}
- progress.set_length(new.file_count());
+ progress.set_length(new.file_count() as u64);
progress.finish();
}
diff --git a/src/cmd/restore.rs b/src/cmd/restore.rs
index a3594ea..53e168a 100644
--- a/src/cmd/restore.rs
+++ b/src/cmd/restore.rs
@@ -34,7 +34,7 @@ pub fn restore(config: &ClientConfig, gen_ref: &str, to: &Path) -> anyhow::Resul
let gen = client.fetch_generation(&gen_id, &dbname)?;
info!("restore file count: {}", gen.file_count()?);
- let progress = create_progress_bar(gen.file_count()?.into(), true);
+ let progress = create_progress_bar(gen.file_count()?, true);
for (fileid, entry) in gen.files()? {
restore_generation(&client, &gen, fileid, &entry, &to, &progress)?;
}
@@ -70,7 +70,7 @@ struct Opt {
fn restore_generation(
client: &BackupClient,
gen: &LocalGeneration,
- fileid: u64,
+ fileid: i64,
entry: &FilesystemEntry,
to: &Path,
progress: &ProgressBar,
@@ -120,7 +120,7 @@ fn restore_regular(
client: &BackupClient,
gen: &LocalGeneration,
path: &Path,
- fileid: u64,
+ fileid: i64,
entry: &FilesystemEntry,
) -> anyhow::Result<()> {
debug!("restoring regular {}", path.display());
@@ -191,9 +191,9 @@ fn restore_metadata(path: &Path, entry: &FilesystemEntry) -> anyhow::Result<()>
Ok(())
}
-fn create_progress_bar(file_count: u64, verbose: bool) -> ProgressBar {
+fn create_progress_bar(file_count: i64, verbose: bool) -> ProgressBar {
let progress = if verbose {
- ProgressBar::new(file_count)
+ ProgressBar::new(file_count as u64)
} else {
ProgressBar::hidden()
};
diff --git a/src/generation.rs b/src/generation.rs
index 5dc5f97..e67d659 100644
--- a/src/generation.rs
+++ b/src/generation.rs
@@ -10,7 +10,7 @@ use std::path::Path;
/// of its generation chunk.
pub struct NascentGeneration {
conn: Connection,
- fileno: u64,
+ fileno: i64,
}
impl NascentGeneration {
@@ -22,7 +22,7 @@ impl NascentGeneration {
Ok(Self { conn, fileno: 0 })
}
- pub fn file_count(&self) -> u64 {
+ pub fn file_count(&self) -> i64 {
self.fileno
}
@@ -110,15 +110,15 @@ impl LocalGeneration {
Ok(Self { conn })
}
- pub fn file_count(&self) -> anyhow::Result<u32> {
+ pub fn file_count(&self) -> anyhow::Result<i64> {
Ok(sql::file_count(&self.conn)?)
}
- pub fn files(&self) -> anyhow::Result<Vec<(u64, FilesystemEntry)>> {
+ pub fn files(&self) -> anyhow::Result<Vec<(i64, FilesystemEntry)>> {
Ok(sql::files(&self.conn)?)
}
- pub fn chunkids(&self, fileno: u64) -> anyhow::Result<Vec<ChunkId>> {
+ pub fn chunkids(&self, fileno: i64) -> anyhow::Result<Vec<ChunkId>> {
Ok(sql::chunkids(&self.conn, fileno)?)
}
@@ -126,7 +126,7 @@ impl LocalGeneration {
Ok(sql::get_file(&self.conn, filename)?)
}
- pub fn get_fileno(&self, filename: &Path) -> anyhow::Result<Option<u64>> {
+ pub fn get_fileno(&self, filename: &Path) -> anyhow::Result<Option<i64>> {
Ok(sql::get_fileno(&self.conn, filename)?)
}
}
@@ -163,10 +163,9 @@ mod sql {
pub fn insert_one(
t: &Transaction,
e: FilesystemEntry,
- fileno: u64,
+ fileno: i64,
ids: &[ChunkId],
) -> anyhow::Result<()> {
- let fileno = fileno as i64;
let json = serde_json::to_string(&e)?;
t.execute(
"INSERT INTO files (fileno, json) VALUES (?1, ?2)",
@@ -181,14 +180,13 @@ mod sql {
Ok(())
}
- pub fn row_to_entry(row: &Row) -> rusqlite::Result<(u64, String)> {
+ pub fn row_to_entry(row: &Row) -> rusqlite::Result<(i64, String)> {
let fileno: i64 = row.get(row.column_index("fileno")?)?;
- let fileno = fileno as u64;
let json: String = row.get(row.column_index("json")?)?;
Ok((fileno, json))
}
- pub fn file_count(conn: &Connection) -> anyhow::Result<u32> {
+ pub fn file_count(conn: &Connection) -> anyhow::Result<i64> {
let mut stmt = conn.prepare("SELECT count(*) FROM files")?;
let mut iter = stmt.query_map(params![], |row| row.get(0))?;
let count = iter.next().expect("SQL count result");
@@ -196,10 +194,10 @@ mod sql {
Ok(count)
}
- pub fn files(conn: &Connection) -> anyhow::Result<Vec<(u64, FilesystemEntry)>> {
+ pub fn files(conn: &Connection) -> anyhow::Result<Vec<(i64, FilesystemEntry)>> {
let mut stmt = conn.prepare("SELECT * FROM files")?;
let iter = stmt.query_map(params![], |row| row_to_entry(row))?;
- let mut files: Vec<(u64, FilesystemEntry)> = vec![];
+ let mut files: Vec<(i64, FilesystemEntry)> = vec![];
for x in iter {
let (fileno, json) = x?;
let entry = serde_json::from_str(&json)?;
@@ -208,7 +206,7 @@ mod sql {
Ok(files)
}
- pub fn chunkids(conn: &Connection, fileno: u64) -> anyhow::Result<Vec<ChunkId>> {
+ pub fn chunkids(conn: &Connection, fileno: i64) -> anyhow::Result<Vec<ChunkId>> {
let fileno = fileno as i64;
let mut stmt = conn.prepare("SELECT chunkid FROM chunks WHERE fileno = ?1")?;
let iter = stmt.query_map(params![fileno], |row| Ok(row.get(0)?))?;
@@ -227,7 +225,7 @@ mod sql {
}
}
- pub fn get_fileno(conn: &Connection, filename: &Path) -> anyhow::Result<Option<u64>> {
+ pub fn get_fileno(conn: &Connection, filename: &Path) -> anyhow::Result<Option<i64>> {
match get_file_and_fileno(conn, filename)? {
None => Ok(None),
Some((id, _)) => Ok(Some(id)),
@@ -237,9 +235,9 @@ mod sql {
fn get_file_and_fileno(
conn: &Connection,
filename: &Path,
- ) -> anyhow::Result<Option<(u64, FilesystemEntry)>> {
+ ) -> anyhow::Result<Option<(i64, FilesystemEntry)>> {
let files = files(conn)?;
- let files: Vec<(u64, FilesystemEntry)> = files
+ let files: Vec<(i64, FilesystemEntry)> = files
.iter()
.filter(|(_, e)| e.pathbuf() == filename)
.map(|(id, e)| (*id, e.clone()))