ui: make search cache rebuild account-specific
ReIndex command is supposed to be account specific yet the account argument was ignoredmaster
parent
2b6f6ab42c
commit
bb18ddc944
|
@ -269,32 +269,30 @@ pub fn remove(env_hash: EnvelopeHash) -> Result<()> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn index(context: &mut crate::state::Context) -> Result<()> {
|
pub fn index(context: &mut crate::state::Context, account_name: &str) -> Result<()> {
|
||||||
|
let account = if let Some(a) = context.accounts.iter().find(|acc| acc.name() == account_name) {
|
||||||
|
a} else {
|
||||||
|
return Err(MeliError::new(format!("Account {} was not found.", account_name)));
|
||||||
|
};
|
||||||
|
|
||||||
|
let (acc_name, acc_mutex, backend_mutex):( String, Arc<RwLock<_>>, Arc<_>) = if *account.settings.conf.cache_type() != crate::conf::CacheType::Sqlite3 {
|
||||||
|
return Err(MeliError::new(format!("Account {} doesn't have an sqlite3 search backend.", account_name)));
|
||||||
|
} else {
|
||||||
|
(
|
||||||
|
account.name().to_string(),
|
||||||
|
account.collection.envelopes.clone(),
|
||||||
|
account.backend.clone(),
|
||||||
|
)};
|
||||||
let conn = open_or_create_db()?;
|
let conn = open_or_create_db()?;
|
||||||
let work_context = context.work_controller().get_context();
|
let work_context = context.work_controller().get_context();
|
||||||
let mutexes = context
|
let env_hashes =
|
||||||
.accounts
|
acc_mutex.read().unwrap().keys().cloned().collect::<Vec<_>>();
|
||||||
.iter()
|
|
||||||
.filter(|acc| *acc.settings.conf.cache_type() == crate::conf::CacheType::Sqlite3)
|
|
||||||
.map(|acc| {
|
|
||||||
(
|
|
||||||
acc.name().to_string(),
|
|
||||||
acc.collection.envelopes.clone(),
|
|
||||||
acc.backend.clone(),
|
|
||||||
)
|
|
||||||
})
|
|
||||||
.collect::<Vec<(String, Arc<RwLock<_>>, Arc<_>)>>();
|
|
||||||
let env_hashes = mutexes
|
|
||||||
.iter()
|
|
||||||
.map(|m| m.1.read().unwrap().keys().cloned().collect::<Vec<_>>())
|
|
||||||
.collect::<Vec<Vec<_>>>();
|
|
||||||
|
|
||||||
/* Sleep, index and repeat in order not to block the main process */
|
/* Sleep, index and repeat in order not to block the main process */
|
||||||
let handle = std::thread::Builder::new().name(String::from("rebuilding index")).spawn(move || {
|
let handle = std::thread::Builder::new().name(String::from("rebuilding index")).spawn(move || {
|
||||||
let thread_id = std::thread::current().id();
|
let thread_id = std::thread::current().id();
|
||||||
|
|
||||||
let sleep_dur = std::time::Duration::from_millis(20);
|
let sleep_dur = std::time::Duration::from_millis(20);
|
||||||
for ((acc_name, acc_mutex, backend_mutex), env_hashes) in mutexes.into_iter().zip(env_hashes.into_iter()) {
|
|
||||||
if let Err(err) = conn.execute(
|
if let Err(err) = conn.execute(
|
||||||
"INSERT OR REPLACE INTO accounts (name) VALUES (?1)", params![acc_name.as_str(),],).map_err(|e| MeliError::new(e.to_string())) {
|
"INSERT OR REPLACE INTO accounts (name) VALUES (?1)", params![acc_name.as_str(),],).map_err(|e| MeliError::new(e.to_string())) {
|
||||||
debug!("{}",
|
debug!("{}",
|
||||||
|
@ -377,7 +375,6 @@ pub fn index(context: &mut crate::state::Context) -> Result<()> {
|
||||||
.send((thread_id, format!("Rebuilding {} index. {}/{}", acc_name, ctr, env_hashes.len())))
|
.send((thread_id, format!("Rebuilding {} index. {}/{}", acc_name, ctr, env_hashes.len())))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
std::thread::sleep(sleep_dur);
|
std::thread::sleep(sleep_dur);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
work_context.finished.send(thread_id).unwrap();
|
work_context.finished.send(thread_id).unwrap();
|
||||||
})?;
|
})?;
|
||||||
|
|
|
@ -584,22 +584,24 @@ impl State {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AccountAction(_, ReIndex) => match crate::sqlite3::index(&mut self.context) {
|
AccountAction(ref account_name, ReIndex) => {
|
||||||
Ok(()) => {
|
match crate::sqlite3::index(&mut self.context, account_name) {
|
||||||
self.context.replies.push_back(UIEvent::Notification(
|
Ok(()) => {
|
||||||
None,
|
self.context.replies.push_back(UIEvent::Notification(
|
||||||
"Message index rebuild started.".to_string(),
|
None,
|
||||||
Some(NotificationType::INFO),
|
"Message index rebuild started.".to_string(),
|
||||||
));
|
Some(NotificationType::INFO),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
self.context.replies.push_back(UIEvent::Notification(
|
||||||
|
None,
|
||||||
|
format!("Message index rebuild failed: {}.", e),
|
||||||
|
Some(NotificationType::ERROR),
|
||||||
|
));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Err(e) => {
|
}
|
||||||
self.context.replies.push_back(UIEvent::Notification(
|
|
||||||
None,
|
|
||||||
format!("Message index rebuild failed: {}.", e),
|
|
||||||
Some(NotificationType::ERROR),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
v => {
|
v => {
|
||||||
self.rcv_event(UIEvent::Action(v));
|
self.rcv_event(UIEvent::Action(v));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue