docs: def _read_all(self, **keys):
          """
          Read all data in the HDU.
  
          parameters
          ----------
          vstorage: string, optional
              Over-ride the default method to store variable length columns.  Can
              be 'fixed' or 'object'.  See docs on fitsio.FITS for details.
          lower: bool, optional
              If True, force all columns names to lower case in output. Will over
              ride the lower= keyword from construction.
          upper: bool, optional
              If True, force all columns names to upper case in output. Will over
              ride the lower= keyword from construction.
          """
  
          dtype, offsets, isvar = self.get_rec_dtype(**keys)
  
          w, = numpy.where(isvar == True)  # noqa
          has_tbit = self._check_tbit()
  
          if w.size > 0:
              vstorage = keys.get('vstorage', self._vstorage)
              colnums = self._extract_colnums()
              rows = None
              array = self._read_rec_with_var(colnums, rows, dtype,
                                              offsets, isvar, vstorage)
          elif has_tbit:
              # drop down to read_columns since we can't stuff into a
              # contiguous array
              colnums = self._extract_colnums()
              array = self.read_columns(colnums, **keys)
          else:
  
              firstrow = 1  # noqa - not used?
              nrows = self._info['nrows']
              array = numpy.zeros(nrows, dtype=dtype)
  
              self._FITS.read_as_rec(self._ext+1, 1, nrows, array)
  
              array = self._maybe_decode_fits_ascii_strings_to_unicode_py3(array)
  
              for colnum, name in enumerate(array.dtype.names):
                  self._rescale_and_convert_field_inplace(
                      array,
                      name,
                      self._info['colinfo'][colnum]['tscale'],
                      self._info['colinfo'][colnum]['tzero'])
          lower = keys.get('lower', False)
          upper = keys.get('upper', False)
          if self.lower or lower:
              _names_to_lower_if_recarray(array)
          elif self.upper or upper:
              _names_to_upper_if_recarray(array)
  
          self._maybe_trim_strings(array, **keys)
          return array