docs: def ReadPathInfos(self, client_id, path_type, components_list, cursor=None):
      """Retrieves path info records for given paths."""
  
      if not components_list:
        return {}
  
      path_ids = list(map(rdf_objects.PathID.FromComponents, components_list))
  
      path_infos = {components: None for components in components_list}
  
      query = """
      SELECT path, directory, UNIX_TIMESTAMP(client_paths.timestamp),
             stat_entry, UNIX_TIMESTAMP(last_stat_entry_timestamp),
             hash_entry, UNIX_TIMESTAMP(last_hash_entry_timestamp)
        FROM client_paths
   LEFT JOIN client_path_stat_entries ON
             (client_paths.client_id = client_path_stat_entries.client_id AND
              client_paths.path_type = client_path_stat_entries.path_type AND
              client_paths.path_id = client_path_stat_entries.path_id AND
              client_paths.last_stat_entry_timestamp = client_path_stat_entries.timestamp)
   LEFT JOIN client_path_hash_entries ON
             (client_paths.client_id = client_path_hash_entries.client_id AND
              client_paths.path_type = client_path_hash_entries.path_type AND
              client_paths.path_id = client_path_hash_entries.path_id AND
              client_paths.last_hash_entry_timestamp = client_path_hash_entries.timestamp)
       WHERE client_paths.client_id = %(client_id)s
         AND client_paths.path_type = %(path_type)s
         AND client_paths.path_id IN %(path_ids)s
      """
      values = {
          "client_id": db_utils.ClientIDToInt(client_id),
          "path_type": int(path_type),
          "path_ids": [path_id.AsBytes() for path_id in path_ids]
      }
  
      cursor.execute(query, values)
      for row in cursor.fetchall():
        # pyformat: disable
        (path, directory, timestamp,
         stat_entry_bytes, last_stat_entry_timestamp,
         hash_entry_bytes, last_hash_entry_timestamp) = row
        # pyformat: enable
        components = mysql_utils.PathToComponents(path)
  
        if stat_entry_bytes is not None:
          stat_entry = rdf_client_fs.StatEntry.FromSerializedString(
              stat_entry_bytes)
        else:
          stat_entry = None
  
        if hash_entry_bytes is not None:
          hash_entry = rdf_crypto.Hash.FromSerializedString(hash_entry_bytes)
        else:
          hash_entry = None
  
        datetime = mysql_utils.TimestampToRDFDatetime
        path_info = rdf_objects.PathInfo(
            path_type=path_type,
            components=components,
            timestamp=datetime(timestamp),
            last_stat_entry_timestamp=datetime(last_stat_entry_timestamp),
            last_hash_entry_timestamp=datetime(last_hash_entry_timestamp),
            directory=directory,
            stat_entry=stat_entry,
            hash_entry=hash_entry)
  
        path_infos[components] = path_info
  
      return path_infos