def get(self, queue, claim_id, project=None): if project is None: project = '' cid = utils.cid_decode(claim_id) if cid is None: raise errors.ClaimDoesNotExist(claim_id, queue, project) with self.driver.trans() as trans: sel = sa.sql.select([ tables.Claims.c.id, tables.Claims.c.ttl, tables.Claims.c.created ], sa.and_( tables.Claims.c.ttl > utils.get_age( tables.Claims.c.created), tables.Claims.c.id == cid, tables.Queues.c.project == project, tables.Queues.c.name == queue), from_obj=[tables.Queues.join(tables.Claims)]) res = trans.execute(sel).fetchone() if res is None: raise errors.ClaimDoesNotExist(claim_id, queue, project) cid, ttl, created = res return ({ 'id': claim_id, 'ttl': ttl, 'age': (timeutils.utcnow() - created).seconds }, self.__get(cid))
def delete(self, queue, message_id, project, claim=None): if project is None: project = '' mid = utils.msgid_decode(message_id) if mid is None: return with self.driver.trans() as trans: try: self.get(queue, message_id, project, count=True) except errors.MessageDoesNotExist: return statement = tables.Messages.delete() and_stmt = [tables.Messages.c.id == mid] exists = sa.sql.select([tables.Messages.c.id], sa.and_(*and_stmt)) if not trans.execute(exists).first(): return cid = claim and utils.cid_decode(claim) or None if claim and cid is None: return and_stmt.append(tables.Messages.c.cid == cid) statement = statement.where(sa.and_(*and_stmt)) res = trans.execute(statement) if res.rowcount == 0: raise errors.MessageIsClaimed(mid)
def update(self, queue, claim_id, metadata, project=None): if project is None: project = '' cid = utils.cid_decode(claim_id) if cid is None: raise errors.ClaimDoesNotExist(claim_id, queue, project) age = utils.get_age(tables.Claims.c.created) with self.driver.trans() as trans: qid = utils.get_qid(self.driver, queue, project) update = tables.Claims.update().where(sa.and_( tables.Claims.c.ttl > age, tables.Claims.c.id == cid, tables.Claims.c.id == qid)).\ values(ttl=metadata['ttl']) res = trans.execute(update) if res.rowcount != 1: raise errors.ClaimDoesNotExist(claim_id, queue, project) update = (tables.Messages.update().values( ttl=metadata['ttl']).where( sa.and_(tables.Messages.c.ttl < metadata['ttl'], tables.Messages.c.cid == cid))) trans.execute(update)
def get(self, queue, claim_id, project=None): if project is None: project = '' cid = utils.cid_decode(claim_id) if cid is None: raise errors.ClaimDoesNotExist(claim_id, queue, project) with self.driver.trans() as trans: sel = sa.sql.select([tables.Claims.c.id, tables.Claims.c.ttl, tables.Claims.c.created], sa.and_(tables.Claims.c.ttl > utils.get_age(tables.Claims.c.created), tables.Claims.c.id == cid, tables.Queues.c.project == project, tables.Queues.c.name == queue), from_obj=[tables.Queues.join(tables.Claims)]) res = trans.execute(sel).fetchone() if res is None: raise errors.ClaimDoesNotExist(claim_id, queue, project) cid, ttl, created = res return ( {'id': claim_id, 'ttl': ttl, 'age': (timeutils.utcnow() - created).seconds}, self.__get(cid) )
def update(self, queue, claim_id, metadata, project=None): if project is None: project = '' cid = utils.cid_decode(claim_id) if cid is None: raise errors.ClaimDoesNotExist(claim_id, queue, project) age = utils.get_age(tables.Claims.c.created) with self.driver.trans() as trans: qid = utils.get_qid(self.driver, queue, project) update = tables.Claims.update().where(sa.and_( tables.Claims.c.ttl > age, tables.Claims.c.id == cid, tables.Claims.c.id == qid)).\ values(ttl=metadata['ttl']) res = trans.execute(update) if res.rowcount != 1: raise errors.ClaimDoesNotExist(claim_id, queue, project) update = (tables.Messages.update(). values(ttl=metadata['ttl']). where(sa.and_( tables.Messages.c.ttl < metadata['ttl'], tables.Messages.c.cid == cid))) trans.execute(update)
def delete(self, queue, claim_id, project=None): if project is None: project = '' cid = utils.cid_decode(claim_id) if cid is None: return with self.driver.trans() as trans: try: # NOTE(flaper87): This could probably use some # joins and be just 1 query. qid = utils.get_qid(self.driver, queue, project) except errors.QueueDoesNotExist: return and_stmt = sa.and_(tables.Claims.c.id == cid, tables.Claims.c.qid == qid) dlt = tables.Claims.delete().where(and_stmt) trans.execute(dlt) update = (tables.Messages.update().values(cid=None). where(tables.Messages.c.cid == cid)) trans.execute(update)
def delete(self, queue, claim_id, project=None): if project is None: project = '' cid = utils.cid_decode(claim_id) if cid is None: return with self.driver.trans() as trans: qid = utils.get_qid(self.driver, queue, project) and_stmt = sa.and_(tables.Claims.c.id == cid, tables.Claims.c.qid == qid) dlt = tables.Claims.delete().where(and_stmt) trans.execute(dlt) update = (tables.Messages.update().values(cid=None).where( tables.Messages.c.cid == cid)) trans.execute(update)
def delete(self, queue, claim_id, project=None): if project is None: project = '' cid = utils.cid_decode(claim_id) if cid is None: return with self.driver.trans() as trans: qid = utils.get_qid(self.driver, queue, project) and_stmt = sa.and_(tables.Claims.c.id == cid, tables.Claims.c.qid == qid) dlt = tables.Claims.delete().where(and_stmt) trans.execute(dlt) update = (tables.Messages.update().values(cid=None). where(tables.Messages.c.cid == cid)) trans.execute(update)