'Actual execution of the import
:param fields: import mapping: maps each column to a field,
``False`` for the columns to ignore
:type fields: list(str|bool)
:param dict options:
:param bool dryrun: performs all import operations (and
validations) but rollbacks writes, allows
getting as much errors as possible without
the risk of clobbering the database.
:returns: A list of errors. If the list is empty the import
executed fully and correctly. If the list is
non-empty it contains dicts with 3 keys ``type`` the
type of error (``error|warning``); ``message`` the
error message associated with the error (a string)
and ``record`` the data which failed to import (or
``false`` if that data isn\'t available or provided)
:rtype: list({type, message, record})'

@api.multi
def do(self, fields, options, dryrun=False):

    self.ensure_one()
    self._cr.execute('SAVEPOINT    import')
    try:
        (data, import_fields) = self._convert_import_data(fields, options)
        data = self._parse_import_data(data, import_fields, options)
    except ValueError as error:
        return [{'type': 'error', 'message': unicode(error), 'record': False}]
    _logger.info('importing    %d    rows...', len(data))
    import_result = self.env[self.res_model].with_context(import_file=True).load(import_fields, data)
    _logger.info('done')
    try:
        if dryrun:
            self._cr.execute('ROLLBACK    TO    SAVEPOINT    import')
        else:
            self._cr.execute('RELEASE    SAVEPOINT    import')
    except psycopg2.InternalError:
        pass
    return import_result['messages']
