def get_g_metadata(crispin_client, db_session, log, folder_name, uids, syncmanager_lock): assert folder_name == crispin_client.selected_folder_name, \ "crispin selected folder isn't as expected" account_id = crispin_client.account_id remote_g_metadata = None update_uid_count = 0 saved_folder_info = account.get_folder_info(account_id, db_session, folder_name) if saved_folder_info is not None: # If there's no cached validity we probably haven't run before. sync_type = 'resumed' remote_g_metadata, update_uid_count = retrieve_saved_g_metadata( crispin_client, db_session, log, folder_name, uids, saved_folder_info, syncmanager_lock) if remote_g_metadata is None: sync_type = 'new' remote_g_metadata = crispin_client.g_metadata( crispin_client.all_uids()) set_cache(remote_g_metadata_cache_file(account_id, folder_name), remote_g_metadata) # Save highestmodseq that corresponds to the saved g_metadata. account.update_folder_info(account_id, db_session, folder_name, crispin_client.selected_uidvalidity, crispin_client.selected_highestmodseq) db_session.commit() return remote_g_metadata, (sync_type, update_uid_count)
def condstore_imap_initial_sync(crispin_client, log, folder_name, shared_state, local_uids, uid_download_stack, msg_create_fn): with session_scope(ignore_soft_deletes=False) as db_session: saved_folder_info = account.get_folder_info(crispin_client.account_id, db_session, folder_name) if saved_folder_info is None: assert (crispin_client.selected_uidvalidity is not None and crispin_client.selected_highestmodseq is not None) account.update_folder_info(crispin_client.account_id, db_session, folder_name, crispin_client.selected_uidvalidity, crispin_client.selected_highestmodseq) check_flags(crispin_client, db_session, log, folder_name, local_uids, shared_state['syncmanager_lock']) return imap_initial_sync(crispin_client, log, folder_name, shared_state, local_uids, uid_download_stack, msg_create_fn, spawn_flags_refresh_poller=False)
def get_g_metadata(crispin_client, log, folder_name, uids, syncmanager_lock): assert folder_name == crispin_client.selected_folder_name, \ "crispin selected folder isn't as expected" account_id = crispin_client.account_id remote_g_metadata = None update_uid_count = 0 with session_scope(ignore_soft_deletes=False) as db_session: saved_folder_info = account.get_folder_info( account_id, db_session, folder_name) saved_highestmodseq = or_none(saved_folder_info, lambda i: i.highestmodseq) if saved_highestmodseq is not None: # If there's no cached validity we probably haven't run before. remote_g_metadata, update_uid_count = retrieve_saved_g_metadata( crispin_client, log, folder_name, uids, saved_highestmodseq, syncmanager_lock) if remote_g_metadata is None: remote_g_metadata = crispin_client.g_metadata( crispin_client.all_uids()) set_cache(remote_g_metadata_cache_file(account_id, folder_name), remote_g_metadata) # Save highestmodseq that corresponds to the saved g_metadata. with session_scope(ignore_soft_deletes=False) as db_session: account.update_folder_info(account_id, db_session, folder_name, crispin_client.selected_uidvalidity, crispin_client.selected_highestmodseq) db_session.commit() return remote_g_metadata, update_uid_count
def highestmodseq_update(crispin_client, log, folder_name, last_highestmodseq, highestmodseq_fn, syncmanager_lock): account_id = crispin_client.account_id new_highestmodseq = crispin_client.selected_highestmodseq new_uidvalidity = crispin_client.selected_uidvalidity log.info('starting highestmodseq update', current_highestmodseq=new_highestmodseq) changed_uids = crispin_client.new_and_updated_uids(last_highestmodseq) remote_uids = crispin_client.all_uids() local_uids = None if changed_uids: with session_scope(ignore_soft_deletes=False) as db_session: local_uids = account.all_uids(account_id, db_session, folder_name) new, updated = new_or_updated(changed_uids, local_uids) log.info(new_uid_count=len(new), updated_uid_count=len(updated)) local_uids += new with syncmanager_lock: log.debug("highestmodseq_update acquired syncmanager_lock") with session_scope(ignore_soft_deletes=False) as db_session: deleted_uids = remove_deleted_uids(account_id, db_session, log, folder_name, local_uids, remote_uids) local_uids = set(local_uids) - deleted_uids update_metadata(crispin_client, log, folder_name, updated, syncmanager_lock) with session_scope(ignore_soft_deletes=False) as db_session: update_uid_counts(db_session, log, account_id, folder_name, remote_uid_count=len(remote_uids), download_uid_count=len(new), update_uid_count=len(updated), delete_uid_count=len(deleted_uids)) highestmodseq_fn(crispin_client, log, folder_name, new, updated, syncmanager_lock) else: log.info("No new or updated messages") with session_scope(ignore_soft_deletes=False) as db_session: with syncmanager_lock: log.debug("highestmodseq_update acquired syncmanager_lock") if local_uids is None: local_uids = account.all_uids( account_id, db_session, folder_name) deleted_uids = remove_deleted_uids(crispin_client.account_id, db_session, log, folder_name, local_uids, remote_uids) update_uid_counts(db_session, log, account_id, folder_name, remote_uid_count=len(remote_uids), delete_uid_count=len(deleted_uids)) account.update_folder_info(account_id, db_session, folder_name, new_uidvalidity, new_highestmodseq) db_session.commit()
def highestmodseq_update(crispin_client, db_session, log, folder_name, last_highestmodseq, highestmodseq_fn, syncmanager_lock): account_id = crispin_client.account_id new_highestmodseq = crispin_client.selected_highestmodseq new_uidvalidity = crispin_client.selected_uidvalidity log.info("Starting highestmodseq update on {} (current HIGHESTMODSEQ: {})" .format(folder_name, new_highestmodseq)) local_uids = account.all_uids(account_id, db_session, folder_name) changed_uids = crispin_client.new_and_updated_uids(last_highestmodseq) remote_uids = crispin_client.all_uids() if changed_uids: new, updated = new_or_updated(changed_uids, local_uids) log.info("{0} new and {1} updated UIDs".format(len(new), len(updated))) local_uids += new with syncmanager_lock: log.debug("highestmodseq_update acquired syncmanager_lock") deleted_uids = remove_deleted_uids(account_id, db_session, log, folder_name, local_uids, remote_uids) local_uids = set(local_uids) - deleted_uids update_metadata(crispin_client, db_session, log, folder_name, updated, syncmanager_lock) update_uid_counts(db_session, log, account_id, folder_name, remote_uid_count=len(remote_uids), download_uid_count=len(new), update_uid_count=len(updated), delete_uid_count=len(deleted_uids)) highestmodseq_fn(crispin_client, db_session, log, folder_name, changed_uids, local_uids, syncmanager_lock) else: log.info("No new or updated messages") with syncmanager_lock: log.debug("highestmodseq_update acquired syncmanager_lock") remove_deleted_uids(crispin_client.account_id, db_session, log, folder_name, local_uids, remote_uids) account.update_folder_info(account_id, db_session, folder_name, new_uidvalidity, new_highestmodseq) db_session.commit()
def highestmodseq_update(crispin_client, log, folder_name, last_highestmodseq, highestmodseq_fn, syncmanager_lock): account_id = crispin_client.account_id new_highestmodseq = crispin_client.selected_highestmodseq new_uidvalidity = crispin_client.selected_uidvalidity log.info('starting highestmodseq update', current_highestmodseq=new_highestmodseq) changed_uids = crispin_client.new_and_updated_uids(last_highestmodseq) remote_uids = crispin_client.all_uids() local_uids = None if changed_uids: with session_scope(ignore_soft_deletes=False) as db_session: local_uids = account.all_uids(account_id, db_session, folder_name) new, updated = new_or_updated(changed_uids, local_uids) log.info(new_uid_count=len(new), updated_uid_count=len(updated)) local_uids += new with syncmanager_lock: log.debug("highestmodseq_update acquired syncmanager_lock") with session_scope(ignore_soft_deletes=False) as db_session: deleted_uids = remove_deleted_uids(account_id, db_session, log, folder_name, local_uids, remote_uids) local_uids = set(local_uids) - deleted_uids update_metadata(crispin_client, log, folder_name, updated, syncmanager_lock) with session_scope(ignore_soft_deletes=False) as db_session: update_uid_counts(db_session, log, account_id, folder_name, remote_uid_count=len(remote_uids), download_uid_count=len(new), update_uid_count=len(updated), delete_uid_count=len(deleted_uids)) highestmodseq_fn(crispin_client, log, folder_name, new, updated, syncmanager_lock) else: log.info("No new or updated messages") with session_scope(ignore_soft_deletes=False) as db_session: with syncmanager_lock: log.debug("highestmodseq_update acquired syncmanager_lock") if local_uids is None: local_uids = account.all_uids(account_id, db_session, folder_name) deleted_uids = remove_deleted_uids(crispin_client.account_id, db_session, log, folder_name, local_uids, remote_uids) update_uid_counts(db_session, log, account_id, folder_name, remote_uid_count=len(remote_uids), delete_uid_count=len(deleted_uids)) account.update_folder_info(account_id, db_session, folder_name, new_uidvalidity, new_highestmodseq) db_session.commit()