def list(self, project=None, marker=None, limit=storage.DEFAULT_QUEUES_PER_PAGE, detailed=False): query = utils.scoped_query(marker, project) fields = {'p_q': 1, '_id': 0} if detailed: fields['m'] = 1 cursor = self._collection.find(query, fields=fields) cursor = cursor.limit(limit).sort('p_q') marker_name = {} def normalizer(record): queue = {'name': utils.descope_queue_name(record['p_q'])} marker_name['next'] = queue['name'] if detailed: queue['metadata'] = record['m'] return queue yield utils.HookedCursor(cursor, normalizer) yield marker_name and marker_name['next']
def list(self, queue_name, project=None, marker=None, limit=storage.DEFAULT_MESSAGES_PER_PAGE, echo=False, client_uuid=None, include_claimed=False): if marker is not None: try: marker = int(marker) except ValueError: yield iter([]) messages = self._list(queue_name, project=project, marker=marker, client_uuid=client_uuid, echo=echo, include_claimed=include_claimed, limit=limit) marker_id = {} now = timeutils.utcnow_ts() # NOTE (kgriffs) @utils.raises_conn_error not needed on this # function, since utils.HookedCursor already has it. def denormalizer(msg): marker_id['next'] = msg['k'] return _basic_message(msg, now) yield utils.HookedCursor(messages, denormalizer) yield str(marker_id['next'])
def _claimed(self, queue_name, claim_id, expires=None, limit=None, project=None): if claim_id is None: claim_id = {'$ne': None} query = { PROJ_QUEUE: utils.scope_queue_name(queue_name, project), 'c.id': claim_id, 'c.e': {'$gt': expires or timeutils.utcnow_ts()}, } # NOTE(kgriffs): Claimed messages bust be queried from # the primary to avoid a race condition caused by the # multi-phased "create claim" algorithm. preference = pymongo.read_preferences.ReadPreference.PRIMARY collection = self._collection(queue_name, project) msgs = collection.find(query, sort=[('k', 1)], read_preference=preference).hint( CLAIMED_INDEX_FIELDS) if limit is not None: msgs = msgs.limit(limit) now = timeutils.utcnow_ts() def denormalizer(msg): doc = _basic_message(msg, now) doc['claim'] = msg['c'] return doc return utils.HookedCursor(msgs, denormalizer)
def bulk_get(self, queue_name, message_ids, project=None): message_ids = [mid for mid in map(utils.to_oid, message_ids) if mid] if not message_ids: return iter([]) now = timeutils.utcnow_ts() # Base query, always check expire time query = { '_id': { '$in': message_ids }, PROJ_QUEUE: utils.scope_queue_name(queue_name, project), } collection = self._collection(queue_name, project) # NOTE(flaper87): Should this query # be sorted? messages = collection.find(query).hint(ID_INDEX_FIELDS) def denormalizer(msg): return _basic_message(msg, now) return utils.HookedCursor(messages, denormalizer)
def _list_by_pool(self, pool, limit=10, detailed=False): query = {'s': pool} cursor = self._col.find(query, fields=_field_spec(detailed), limit=limit).sort('n', 1) normalizer = functools.partial(_normalize, detailed=detailed) return utils.HookedCursor(cursor, normalizer)
def list(self, marker=None, limit=10, detailed=False): query = {} if marker is not None: query['n'] = {'$gt': marker} cursor = self._col.find(query, fields=_field_spec(detailed), limit=limit) normalizer = functools.partial(_normalize, detailed=detailed) return utils.HookedCursor(cursor, normalizer)
def list(self, marker=None, limit=10, detailed=False): query = {} if marker is not None: query['n'] = {'$gt': marker} cursor = self._col.find(query, fields=_field_spec(detailed), limit=limit).sort('n') marker_name = {} def normalizer(pool): marker_name['next'] = pool['n'] return _normalize(pool, detailed=detailed) yield utils.HookedCursor(cursor, normalizer) yield marker_name and marker_name['next']
def get_group(self, group=None, detailed=False): cursor = self._col.find({'g': group}, fields=_field_spec(detailed)) normalizer = functools.partial(_normalize, detailed=detailed) return utils.HookedCursor(cursor, normalizer)
def list(self, project): fields = {'_id': 0} query = utils.scoped_query(None, project) return utils.HookedCursor(self._col.find(query, fields), _normalize)