summaryrefslogtreecommitdiffstats
path: root/melib
diff options
context:
space:
mode:
authorManos Pitsidianakis <el13635@mail.ntua.gr>2020-10-18 17:41:06 +0300
committerManos Pitsidianakis <el13635@mail.ntua.gr>2020-10-18 17:41:06 +0300
commitb9f4d718c74685360bb8066250a4ff6a8e1aa245 (patch)
tree2757111fe644155db50171fdc728db6b170b1e7c /melib
parent54cb4ea623d5a3289e495034e4255e2d3b826329 (diff)
melib/sqlite3: reset db on version mismatch
Diffstat (limited to 'melib')
-rw-r--r--melib/src/backends/imap.rs2
-rw-r--r--melib/src/sqlite3.rs97
2 files changed, 57 insertions, 42 deletions
diff --git a/melib/src/backends/imap.rs b/melib/src/backends/imap.rs
index f5851430..c7da227c 100644
--- a/melib/src/backends/imap.rs
+++ b/melib/src/backends/imap.rs
@@ -321,7 +321,7 @@ impl MailBackend for ImapType {
None
};
let mut state = FetchState {
- stage: if self.uid_store.keep_offline_cache {
+ stage: if self.uid_store.keep_offline_cache && cache_handle.is_some() {
FetchStage::InitialCache
} else {
FetchStage::InitialFresh
diff --git a/melib/src/sqlite3.rs b/melib/src/sqlite3.rs
index 79ab77f2..ec87dd16 100644
--- a/melib/src/sqlite3.rs
+++ b/melib/src/sqlite3.rs
@@ -50,50 +50,65 @@ pub fn open_or_create_db(
description: &DatabaseDescription,
identifier: Option<&str>,
) -> Result<Connection> {
- let db_path = if let Some(id) = identifier {
- db_path(&format!("{}_{}", id, description.name))
- } else {
- db_path(description.name)
- }?;
- let mut set_mode = false;
- if !db_path.exists() {
- log(
- format!(
- "Creating {} database in {}",
- description.name,
- db_path.display()
- ),
- crate::INFO,
- );
- set_mode = true;
- }
- let conn = Connection::open(&db_path).map_err(|e| MeliError::new(e.to_string()))?;
- if set_mode {
- use std::os::unix::fs::PermissionsExt;
- let file = std::fs::File::open(&db_path)?;
- let metadata = file.metadata()?;
- let mut permissions = metadata.permissions();
+ let mut second_try: bool = false;
+ loop {
+ let db_path = if let Some(id) = identifier {
+ db_path(&format!("{}_{}", id, description.name))
+ } else {
+ db_path(description.name)
+ }?;
+ let mut set_mode = false;
+ if !db_path.exists() {
+ log(
+ format!(
+ "Creating {} database in {}",
+ description.name,
+ db_path.display()
+ ),
+ crate::INFO,
+ );
+ set_mode = true;
+ }
+ let conn = Connection::open(&db_path).map_err(|e| MeliError::new(e.to_string()))?;
+ if set_mode {
+ use std::os::unix::fs::PermissionsExt;
+ let file = std::fs::File::open(&db_path)?;
+ let metadata = file.metadata()?;
+ let mut permissions = metadata.permissions();
- permissions.set_mode(0o600); // Read/write for owner only.
- file.set_permissions(permissions)?;
- }
- let version: i32 = conn.pragma_query_value(None, "user_version", |row| row.get(0))?;
- if version != 0_i32 && version as u32 != description.version {
- return Err(MeliError::new(format!(
- "Database version mismatch, is {} but expected {}",
- version, description.version
- )));
- }
+ permissions.set_mode(0o600); // Read/write for owner only.
+ file.set_permissions(permissions)?;
+ }
+ let version: i32 = conn.pragma_query_value(None, "user_version", |row| row.get(0))?;
+ if version != 0_i32 && version as u32 != description.version {
+ log(
+ format!(
+ "Database version mismatch, is {} but expected {}",
+ version, description.version
+ ),
+ crate::INFO,
+ );
+ if second_try {
+ return Err(MeliError::new(format!(
+ "Database version mismatch, is {} but expected {}. Could not recreate database.",
+ version, description.version
+ )));
+ }
+ reset_db(description, identifier)?;
+ second_try = true;
+ continue;
+ }
- if version == 0 {
- conn.pragma_update(None, "user_version", &description.version)?;
- }
- if let Some(s) = description.init_script {
- conn.execute_batch(s)
- .map_err(|e| MeliError::new(e.to_string()))?;
- }
+ if version == 0 {
+ conn.pragma_update(None, "user_version", &description.version)?;
+ }
+ if let Some(s) = description.init_script {
+ conn.execute_batch(s)
+ .map_err(|e| MeliError::new(e.to_string()))?;
+ }
- Ok(conn)
+ return Ok(conn);
+ }
}
/// Return database to a clean slate.