def delete(self, queue, message_id, project=None, claim=None): claim_ctrl = self.driver.claim_controller if not self._queue_ctrl.exists(queue, project): return # NOTE(kgriffs): The message does not exist, so # it is essentially "already" deleted. if not self._exists(message_id): return # TODO(kgriffs): Create decorator for validating claim and message # IDs, since those are not checked at the transport layer. This # decorator should be applied to all relevant methods. if claim is not None: try: uuid.UUID(claim) except ValueError: raise errors.ClaimDoesNotExist(claim, queue, project) msg_claim = self._get_claim(message_id) is_claimed = (msg_claim is not None) # Authorize the request based on having the correct claim ID if claim is None: if is_claimed: raise errors.MessageIsClaimed(message_id) elif not is_claimed: raise errors.MessageNotClaimed(message_id) elif msg_claim['id'] != claim: if not claim_ctrl._exists(queue, claim, project): raise errors.ClaimDoesNotExist(claim, queue, project) raise errors.MessageNotClaimedBy(message_id, claim) msgset_key = utils.msgset_key(queue, project) with self._client.pipeline() as pipe: pipe.delete(message_id) pipe.zrem(msgset_key, message_id) if is_claimed: claim_ctrl._del_message(queue, project, msg_claim['id'], message_id, pipe) pipe.execute()
def delete(self, queue, message_id, project=None, claim=None): claim_ctrl = self.driver.claim_controller try: msg = self._get(queue, message_id, project) except (errors.QueueDoesNotExist, errors.MessageDoesNotExist): return if claim is None: if msg['claim_id']: claim_obj = claim_ctrl._get(queue, msg['claim_id'], project) if claim_obj is not None and claim_obj['ttl'] > 0: raise errors.MessageIsClaimed(message_id) else: # Check if the claim does exist claim_ctrl._exists(queue, claim, project) if not msg['claim_id']: raise errors.MessageNotClaimed(message_id) elif msg['claim_id'] != claim: raise errors.MessageNotClaimedBy(message_id, claim) self._delete(queue, message_id, project)
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: if not self._exists(queue, message_id, project): 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: raise errors.ClaimDoesNotExist(queue, project, claim) and_stmt.append(tables.Messages.c.cid == cid) statement = statement.where(sa.and_(*and_stmt)) res = trans.execute(statement) if res.rowcount == 0: # NOTE(kgriffs): Either the message is not claimed, # or if it is, the specified claim does not exist. cid = self._get_cid(mid) if cid is None: raise errors.MessageNotClaimed(mid) # NOTE(kgriffs): The message exists, but the claim # must have expired or something, since it # was not associated with the message. raise errors.MessageNotClaimedBy(mid, claim)