code: def _ParseQuery(self, parser_mediator, database, query, callback, cache):
      
      row_cache = cache.GetRowCache(query)
  
      try:
        rows = database.Query(query)
  
      except sqlite3.DatabaseError as exception:
        parser_mediator.ProduceExtractionWarning(
            'unable to run query: {0:s} on database with error: {1!s}'.format(
                query, exception))
        return
  
      for index, row in enumerate(rows):
        if parser_mediator.abort:
          break
  
        row_hash = self._HashRow(row)
        if row_hash in row_cache:
          continue
  
        try:
          callback(parser_mediator, query, row, cache=cache, database=database)
  
        except Exception as exception:  # pylint: disable=broad-except
          parser_mediator.ProduceExtractionWarning((
              'unable to parse row: {0:d} with callback: {1:s} on database '
              'with error: {2!s}').format(
                  index, callback.__name__, exception))
          # TODO: consider removing return.
          return
  
        row_cache.add(row_hash)
docs: Queries a database and parses the results.
  
      Args:
        parser_mediator (ParserMediator): parser mediator.
        database (SQLiteDatabase): database.
        query (str): query.
        callback (function): function to invoke to parse an individual row.
        cache (SQLiteCache): cache.