docs: def MultiReadClientFullInfo(self, client_ids, min_last_ping=None,
                                cursor=None):
      """Reads full client information for a list of clients."""
      if not client_ids:
        return {}
  
      query = (
          "SELECT "
          "c.client_id, c.fleetspeak_enabled, c.certificate, "
          "UNIX_TIMESTAMP(c.last_ping), UNIX_TIMESTAMP(c.last_clock), "
          "c.last_ip, UNIX_TIMESTAMP(c.last_foreman), "
          "UNIX_TIMESTAMP(c.first_seen), "
          "UNIX_TIMESTAMP(c.last_snapshot_timestamp), "
          "UNIX_TIMESTAMP(c.last_crash_timestamp), "
          "UNIX_TIMESTAMP(c.last_startup_timestamp), "
          "h.client_snapshot, s.startup_info, s_last.startup_info, "
          "l.owner_username, l.label "
          "FROM clients as c "
          "FORCE INDEX (PRIMARY) "
          "LEFT JOIN client_snapshot_history as h FORCE INDEX (PRIMARY) ON ( "
          "c.client_id = h.client_id AND "
          "h.timestamp = c.last_snapshot_timestamp) "
          "LEFT JOIN client_startup_history as s FORCE INDEX (PRIMARY) ON ( "
          "c.client_id = s.client_id AND "
          "s.timestamp = c.last_snapshot_timestamp) "
          "LEFT JOIN client_startup_history as s_last FORCE INDEX (PRIMARY) ON ( "
          "c.client_id = s_last.client_id "
          "AND s_last.timestamp = c.last_startup_timestamp) "
          "LEFT JOIN client_labels AS l FORCE INDEX (PRIMARY) "
          "ON (c.client_id = l.client_id) ")
  
      query += "WHERE c.client_id IN (%s) " % ", ".join(["%s"] * len(client_ids))
  
      values = [db_utils.ClientIDToInt(cid) for cid in client_ids]
      if min_last_ping is not None:
        query += "AND c.last_ping >= FROM_UNIXTIME(%s)"
        values.append(mysql_utils.RDFDatetimeToTimestamp(min_last_ping))
  
      cursor.execute(query, values)
      return dict(self._ResponseToClientsFullInfo(cursor.fetchall()))