def ping(self): """ Notify the queue that this task is still active. """ if self.finished is not None: raise AlreadyFinished() with self.storage.cursor() as cursor: affected_row = apsw_helpers.get(cursor, ''' SELECT * from %s WHERE id = :task_id AND execution_id = :execution_id AND last_contact > datetime(:now, 'unixepoch', '-%s second') ''' % (self._queue.table_name, self._queue.execution_ttl), now=unix_timestamp(datetime.utcnow()), task_id=self.task_id, execution_id=self.execution_id) if not affected_row: raise TaskDoesNotExist() with self.storage.transaction() as cursor: apsw_helpers.query(cursor, ''' UPDATE %s SET last_contact=datetime(:now, 'unixepoch'), update_count=update_count + 1 WHERE id = :task_id AND execution_id = :execution_id AND last_contact > datetime(:now, 'unixepoch', '-%s second') ''' % (self._queue.table_name, self._queue.execution_ttl), now=unix_timestamp(datetime.utcnow()), task_id=self.task_id, execution_id=self.execution_id)
def _refresh(self): with self.storage.cursor() as cursor: row = apsw_helpers.get(cursor, ''' SELECT * FROM %s WHERE id = :task_id AND execution_id = :execution_id AND last_contact > datetime(:now, 'unixepoch', '-%s second') ''' % (self._queue.table_name, self._queue.execution_ttl), now=unix_timestamp(datetime.utcnow()), task_id=self.task_id, execution_id=self.execution_id) if not row: raise TaskDoesNotExist() self.task_id = row.id self.data = json.loads(row.data) self.result = row.result self.job_id = row.job_id self.file_id = row.file_id self.md5 = row.md5 self.bytes_total = row.bytes_total self.bytes_downloaded = row.bytes_downloaded self.download_rate = row.download_rate self.steps = self._load_steps(json.loads(row.steps)) self.started = row.started self.finished = row.finished
def get(self, job_id): with self.storage.transaction() as cursor: job = apsw_helpers.get( cursor, 'SELECT id, spec FROM jobs WHERE id = ?', job_id) if job is not None: job['spec'] = json.loads(job.spec) return Job(job.spec, job.id)
def _save(self, finished=None, steps=None, result=None, data=None): finished = finished if finished is not None else self.finished with self.storage.transaction() as cursor: apsw_helpers.query(cursor, ''' UPDATE %s SET last_contact=datetime(:now, 'unixepoch'), update_count=update_count + 1, steps=:steps, finished=datetime(:finished, 'unixepoch'), result=:result, bytes_downloaded=:bytes_downloaded, download_rate=:download_rate, data=:data WHERE id = :task_id AND execution_id = :execution_id AND last_contact > datetime(:now, 'unixepoch', '-%s second') ''' % (self._queue.table_name, self._queue.execution_ttl), now=unix_timestamp(datetime.utcnow()), task_id=self.task_id, execution_id=self.execution_id, steps=json.dumps(steps if steps is not None else self.steps), finished=unix_timestamp(finished) if finished else None, result=result if result is not None else self.result, bytes_downloaded=self.bytes_downloaded, download_rate=self.download_rate, data=json.dumps(data if data is not None else self.data)) affected_row = apsw_helpers.get(cursor, ''' SELECT * from %s WHERE id = :task_id AND execution_id = :execution_id AND last_contact > datetime(:now, 'unixepoch', '-%s second') ''' % (self._queue.table_name, self._queue.execution_ttl), now=unix_timestamp(datetime.utcnow()), task_id=self.task_id, execution_id=self.execution_id) if not affected_row: raise TaskDoesNotExist() else: if steps is not None: self.steps = steps if finished is not None: self.finished = finished if result is not None: self.result = result if data is not None: self.data = data
def requeue(self): if self._running_steps() != 0: raise StepRunning() if self.finished is not None: raise AlreadyFinished() data = copy.deepcopy(self.data) self.bytes_downloaded = None self.download_rate = None data.pop('time_left', None) with self._queue.storage.transaction() as cursor: affected_row = apsw_helpers.get(cursor, ''' SELECT * from %s WHERE id = :task_id AND execution_id = :execution_id AND last_contact > datetime(:now, 'unixepoch', '-%s second') ''' % (self._queue.table_name, self._queue.execution_ttl), now=unix_timestamp(datetime.utcnow()), task_id=self.task_id, execution_id=self.execution_id) if not affected_row: raise TaskDoesNotExist() apsw_helpers.query(cursor, ''' UPDATE %s SET last_contact=NULL, update_count=update_count + 1, started=NULL, steps=NULL, execution_id=NULL, finished=NULL, data=:data, result=NULL WHERE id = :task_id AND execution_id = :execution_id AND last_contact > datetime(:now, 'unixepoch', '-%s second') ''' % (self._queue.table_name, self._queue.execution_ttl), data=json.dumps(data), now=unix_timestamp(datetime.utcnow()), task_id=self.task_id, execution_id=self.execution_id)
def valid(self): """ Check to see if we are still active. """ if self.finished is not None: return False with self.storage.cursor() as cursor: row = apsw_helpers.get(cursor, ''' SELECT (last_contact > datetime(:now, 'unixepoch', '-%s second')) AS valid FROM %s WHERE id = :task_id AND execution_id = :execution_id ''' % (self._queue.execution_ttl, self._queue.table_name), now=unix_timestamp(datetime.utcnow()), task_id=self.task_id, execution_id=self.execution_id) return bool(row is not None and row.valid)
def requeue(self): if self._running_steps() != 0: raise StepRunning() if self.finished is not None: raise AlreadyFinished() with self.storage.cursor() as cursor: affected_row = apsw_helpers.get(cursor, ''' SELECT * from %s WHERE id = :task_id AND execution_id = :execution_id AND last_contact > datetime(:now, 'unixepoch', '-%s second') ''' % (self._queue.table_name, self._queue.execution_ttl), now=unix_timestamp(datetime.utcnow()), task_id=self.task_id, execution_id=self.execution_id) if affected_row is None: raise TaskDoesNotExist() with self.storage.transaction() as cursor: apsw_helpers.query(cursor, ''' UPDATE %s SET last_contact=NULL, update_count=update_count + 1, started=NULL, steps=NULL, execution_id=NULL, finished=NULL, result=NULL WHERE id = :task_id ''' % self._queue.table_name, task_id=self.task_id)
def _db_get(self, *args, **kwargs): return self.__db_caller(lambda c: apsw_helpers.get(c, *args, **kwargs))