def __load_record()

in oss2/resumable.py [0:0]


    def __load_record(self):
        record = self._get_record()
        logger.debug("Load record return {0}".format(record))

        if record and not self.__is_record_sane(record):
            logger.warn("The content of record is invalid, delete the record")
            self._del_record()
            record = None

        if record and self.__file_changed(record):
            logger.warn("File: {0} has been changed, delete the record".format(self.filename))
            self._del_record()
            record = None

        if record and not self.__upload_exists(record['upload_id']):
            logger.warn('Multipart upload: {0} does not exist, delete the record'.format(record['upload_id']))
            self._del_record()
            record = None

        if not record:
            params = _populate_valid_params(self.__params, [Bucket.SEQUENTIAL])
            part_size = determine_part_size(self.size, self.__part_size)
            logger.debug("Upload File size: {0}, User-specify part_size: {1}, Calculated part_size: {2}".format(
                self.size, self.__part_size, part_size))
            if self.__encryption:
                upload_context = models.MultipartUploadCryptoContext(self.size, part_size)
                upload_id = self.bucket.init_multipart_upload(self.key, self.__headers, params,
                                                              upload_context).upload_id
                if self.__record_upload_context:
                    material = upload_context.content_crypto_material
                    material_record = {'wrap_alg': material.wrap_alg, 'cek_alg': material.cek_alg,
                                       'encrypted_key': b64encode_as_string(material.encrypted_key),
                                       'encrypted_iv': b64encode_as_string(material.encrypted_iv),
                                       'mat_desc': material.mat_desc}
            else:
                upload_id = self.bucket.init_multipart_upload(self.key, self.__headers, params).upload_id

            record = {'op_type': self.__op, 'upload_id': upload_id, 'file_path': self._abspath, 'size': self.size,
                      'mtime': self.__mtime, 'bucket': self.bucket.bucket_name, 'key': self.key, 'part_size': part_size}

            if self.__record_upload_context:
                record['content_crypto_material'] = material_record

            logger.debug('Add new record, bucket: {0}, key: {1}, upload_id: {2}, part_size: {3}'.format(
                self.bucket.bucket_name, self.key, upload_id, part_size))

            self._put_record(record)

        self.__record = record
        self.__part_size = self.__record['part_size']
        self.__upload_id = self.__record['upload_id']
        if self.__record_upload_context:
            if 'content_crypto_material' in self.__record:
                material_record = self.__record['content_crypto_material']
                wrap_alg = material_record['wrap_alg']
                cek_alg = material_record['cek_alg']
                if cek_alg != self.bucket.crypto_provider.cipher.alg or wrap_alg != self.bucket.crypto_provider.wrap_alg:
                    err_msg = 'Envelope or data encryption/decryption algorithm is inconsistent'
                    raise exceptions.InconsistentError(err_msg, self)
                content_crypto_material = models.ContentCryptoMaterial(self.bucket.crypto_provider.cipher,
                                                                       material_record['wrap_alg'],
                                                                       b64decode_from_string(
                                                                           material_record['encrypted_key']),
                                                                       b64decode_from_string(
                                                                           material_record['encrypted_iv']),
                                                                       material_record['mat_desc'])
                self.__upload_context = models.MultipartUploadCryptoContext(self.size, self.__part_size,
                                                                            content_crypto_material)

            else:
                err_msg = 'If record_upload_context flag is true, content_crypto_material must in the the record'
                raise exceptions.InconsistentError(err_msg, self)

        else:
            if 'content_crypto_material' in self.__record:
                err_msg = 'content_crypto_material must in the the record, but record_upload_context flat is false'
                raise exceptions.InvalidEncryptionRequest(err_msg, self)

        self.__finished_parts = self.__get_finished_parts()
        self.__finished_size = sum(p.size for p in self.__finished_parts)