Fetches client data from the relational db.

  Args:
    recency_window: An rdfvalue.Duration specifying a window of last-ping
      timestamps to consider. Clients that haven't communicated with GRR servers
      longer than the given period will be skipped. If recency_window is None,
      all clients will be iterated.

  Yields:
    Batches (lists) of ClientFullInfo objects.

def _IterateAllClients(recency_window=None):
  """Fetches client data from the relational db.

  Args:
    recency_window: An rdfvalue.Duration specifying a window of last-ping
      timestamps to consider. Clients that haven't communicated with GRR servers
      longer than the given period will be skipped. If recency_window is None,
      all clients will be iterated.

  Yields:
    Batches (lists) of ClientFullInfo objects.
  """
  if recency_window is None:
    min_last_ping = None
  else:
    min_last_ping = rdfvalue.RDFDatetime.Now() - recency_window
  client_ids = data_store.REL_DB.ReadAllClientIDs(min_last_ping=min_last_ping)
  for client_id_batch in collection.Batch(client_ids, CLIENT_READ_BATCH_SIZE):
    client_info_dict = data_store.REL_DB.MultiReadClientFullInfo(
        client_id_batch)
    yield list(itervalues(client_info_dict))