docs: def ReadApprovalRequest(self, requestor_username, approval_id, cursor=None):
      """Reads an approval request object with a given id."""
  
      query = ("""
          SELECT
              ar.approval_id,
              UNIX_TIMESTAMP(ar.timestamp),
              ar.approval_request,
              u.username,
              UNIX_TIMESTAMP(ag.timestamp)
          FROM approval_request ar
          LEFT JOIN approval_grant ag USING (username_hash, approval_id)
          LEFT JOIN grr_users u ON u.username_hash = ag.grantor_username_hash
          WHERE ar.approval_id = %s AND ar.username_hash = %s
          """)
  
      cursor.execute(
          query,
          [_ApprovalIDToInt(approval_id),
           mysql_utils.Hash(requestor_username)])
      res = cursor.fetchall()
      if not res:
        raise db.UnknownApprovalRequestError("Approval '%s' not found." %
                                             approval_id)
  
      approval_id_int, timestamp, approval_request_bytes, _, _ = res[0]
  
      approval_request = mysql_utils.StringToRDFProto(rdf_objects.ApprovalRequest,
                                                      approval_request_bytes)
      approval_request.approval_id = _IntToApprovalID(approval_id_int)
      approval_request.timestamp = mysql_utils.TimestampToRDFDatetime(timestamp)
  
      for _, _, _, grantor_username, timestamp in res:
        if not grantor_username:
          continue
  
        # Note: serialized approval_request objects are guaranteed to not
        # have any grants.
        approval_request.grants.append(
            rdf_objects.ApprovalGrant(
                grantor_username=grantor_username,
                timestamp=mysql_utils.TimestampToRDFDatetime(timestamp)))
  
      return approval_request