docs: def ReadPathInfo(self,
                     client_id,
                     path_type,
                     components,
                     timestamp=None,
                     cursor=None):
      """Retrieves a path info record for a given path."""
      if timestamp is None:
        path_infos = self.ReadPathInfos(client_id, path_type, [components])
  
        path_info = path_infos[components]
        if path_info is None:
          raise db.UnknownPathError(
              client_id=client_id, path_type=path_type, components=components)
  
        return path_info
  
      query = """
      SELECT directory, UNIX_TIMESTAMP(p.timestamp),
             stat_entry, UNIX_TIMESTAMP(last_stat_entry_timestamp),
             hash_entry, UNIX_TIMESTAMP(last_hash_entry_timestamp)
        FROM client_paths as p
   LEFT JOIN (SELECT client_id, path_type, path_id, stat_entry
                FROM client_path_stat_entries
               WHERE client_id = %(client_id)s
                 AND path_type = %(path_type)s
                 AND path_id = %(path_id)s
                 AND UNIX_TIMESTAMP(timestamp) <= %(timestamp)s
            ORDER BY timestamp DESC
               LIMIT 1) AS s
          ON p.client_id = s.client_id
         AND p.path_type = s.path_type
         AND p.path_id = s.path_id
   LEFT JOIN (SELECT client_id, path_type, path_id, hash_entry
                FROM client_path_hash_entries
               WHERE client_id = %(client_id)s
                 AND path_type = %(path_type)s
                 AND path_id = %(path_id)s
                 AND UNIX_TIMESTAMP(timestamp) <= %(timestamp)s
            ORDER BY timestamp DESC
               LIMIT 1) AS h
          ON p.client_id = h.client_id
         AND p.path_type = h.path_type
         AND p.path_id = h.path_id
       WHERE p.client_id = %(client_id)s
         AND p.path_type = %(path_type)s
         AND p.path_id = %(path_id)s
      """
      values = {
          "client_id": db_utils.ClientIDToInt(client_id),
          "path_type": int(path_type),
          "path_id": rdf_objects.PathID.FromComponents(components).AsBytes(),
          "timestamp": mysql_utils.RDFDatetimeToTimestamp(timestamp),
      }
  
      cursor.execute(query, values)
      row = cursor.fetchone()
      if row is None:
        raise db.UnknownPathError(
            client_id=client_id, path_type=path_type, components=components)
  
      # pyformat: disable
      (directory, timestamp,
       stat_entry_bytes, last_stat_entry_timestamp,
       hash_entry_bytes, last_hash_entry_timestamp) = row
      # pyformat: enable
  
      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
      return 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)