def _load_state(self): with mailsync_session_scope() as db_session: try: state = ImapFolderSyncStatus.state saved_folder_status = db_session.query(ImapFolderSyncStatus)\ .filter_by(account_id=self.account_id, folder_id=self.folder_id).options( load_only(state)).one() except NoResultFound: saved_folder_status = ImapFolderSyncStatus( account_id=self.account_id, folder_id=self.folder_id) db_session.add(saved_folder_status) saved_folder_status.start_sync() db_session.commit() self.state = saved_folder_status.state return saved_folder_status
def _load_state(self): with session_scope(self.namespace_id) as db_session: try: state = ImapFolderSyncStatus.state saved_folder_status = db_session.query(ImapFolderSyncStatus)\ .filter_by(account_id=self.account_id, folder_id=self.folder_id).options( load_only(state)).one() except NoResultFound: saved_folder_status = ImapFolderSyncStatus( account_id=self.account_id, folder_id=self.folder_id) db_session.add(saved_folder_status) saved_folder_status.start_sync() db_session.commit() self.state = saved_folder_status.state return saved_folder_status
def _run_impl(self): # We do NOT ignore soft deletes in the mail sync because it gets real # complicated handling e.g. when backends reuse imapids. ImapUid # objects are the only objects deleted by the mail sync backends # anyway. with session_scope(ignore_soft_deletes=False) as db_session: try: state = ImapFolderSyncStatus.state saved_folder_status = db_session.query(ImapFolderSyncStatus)\ .filter_by(account_id=self.account_id, folder_id=self.folder_id).options( load_only(state)).one() except NoResultFound: saved_folder_status = ImapFolderSyncStatus( account_id=self.account_id, folder_id=self.folder_id) db_session.add(saved_folder_status) saved_folder_status.start_sync() db_session.commit() self.state = saved_folder_status.state # NOTE: The parent ImapSyncMonitor handler could kill us at any # time if it receives a shutdown command. The shutdown command is # equivalent to ctrl-c. while True: old_state = self.state try: self.state = self.state_handlers[old_state](self.conn_pool, self.log, self.folder_name, self.shared_state) except UidInvalid: self.state = self.state + ' uidinvalid' # State handlers are idempotent, so it's okay if we're # killed between the end of the handler and the commit. if self.state != old_state: # Don't need to re-query, will auto refresh on re-associate. with session_scope(ignore_soft_deletes=False) as db_session: db_session.add(saved_folder_status) saved_folder_status.state = self.state db_session.commit() if self.state == 'finish': return
def _run_impl(self): # We do NOT ignore soft deletes in the mail sync because it gets real # complicated handling e.g. when backends reuse imapids. ImapUid # objects are the only objects deleted by the mail sync backends # anyway. with session_scope(ignore_soft_deletes=False) as db_session: try: state = ImapFolderSyncStatus.state saved_folder_status = db_session.query(ImapFolderSyncStatus)\ .filter_by(account_id=self.account_id, folder_id=self.folder_id).options( load_only(state)).one() except NoResultFound: saved_folder_status = ImapFolderSyncStatus( account_id=self.account_id, folder_id=self.folder_id) db_session.add(saved_folder_status) saved_folder_status.start_sync() db_session.commit() self.state = saved_folder_status.state # NOTE: The parent ImapSyncMonitor handler could kill us at any # time if it receives a shutdown command. The shutdown command is # equivalent to ctrl-c. while True: old_state = self.state try: self.state = self.state_handlers[old_state]( self.conn_pool, self.log, self.folder_name, self.shared_state) except UidInvalid: self.state = self.state + ' uidinvalid' # State handlers are idempotent, so it's okay if we're # killed between the end of the handler and the commit. if self.state != old_state: # Don't need to re-query, will auto refresh on re-associate. with session_scope(ignore_soft_deletes=False) as db_session: db_session.add(saved_folder_status) saved_folder_status.state = self.state db_session.commit() if self.state == 'finish': return