3
]ð]2  ã               @   s   d dl Z yd dlZdZW n ek
r0   dZY nX yd dlZdZW n ek
rZ   dZY nX yd dlmZmZ dZ	W n ek
rŒ   dZ	Y nX d dl
mZ edddgƒZed	gƒZejeƒ d
d„ Zdd„ ZG dd„ deƒZdd„ ZG dd„ deƒZG dd„ deƒZG dd„ deƒZdd„ ZdS )é    NTF)ÚZstdCompressorÚZstdDecompressor)Ú_SENSITIVE_COMMANDSÚsnappyÚzlibÚzstdZismasterc             C   sÔ   y|j dƒ}W n tk
r*   t|ƒ}Y nX x¢|d d … D ]’}|tkrb|j|ƒ tjd|f ƒ q:|dkr†t r†|j|ƒ tjdƒ q:|dkrªt rª|j|ƒ tjdƒ q:|dkr:t	 r:|j|ƒ tjdƒ q:W |S )	Nú,zUnsupported compressor: %sr   zuWire protocol compression with snappy is not available. You must install the python-snappy module for snappy support.r   zWWire protocol compression with zlib is not available. The zlib module is not available.r   zwWire protocol compression with zstandard is not available. You must install the zstandard module for zstandard support.)
ÚsplitÚAttributeErrorÚlistÚ_SUPPORTED_COMPRESSORSÚremoveÚwarningsÚwarnÚ_HAVE_SNAPPYÚ
_HAVE_ZLIBÚ
_HAVE_ZSTD)ÚdummyÚvalueÚcompressorsZ
compressor© r   ú>/tmp/pip-build-20mum3z4/pymongo/pymongo/compression_support.pyÚvalidate_compressors,   s*    




r   c          
   C   sN   yt |ƒ}W n   td| |f ƒ‚Y nX |dk s:|dkrJtd| |f ƒ‚|S )Nz%s must be an integer, not %r.é   é	   z$%s must be between -1 and 9, not %d.éÿÿÿÿ)ÚintÚ	TypeErrorÚ
ValueError)Úoptionr   Úlevelr   r   r   Úvalidate_zlib_compression_levelJ   s    r!   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚCompressionSettingsc             C   s   || _ || _d S )N)r   Úzlib_compression_level)Úselfr   r#   r   r   r   Ú__init__V   s    zCompressionSettings.__init__c             C   s>   |r:|d }|dkrt ƒ S |dkr,t| jƒS |dkr:tƒ S d S )Nr   r   r   r   )ÚSnappyContextÚZlibContextr#   ÚZstdContext)r$   r   Zchosenr   r   r   Úget_compression_contextZ   s    
z+CompressionSettings.get_compression_contextN)Ú__name__Ú
__module__Ú__qualname__r%   r)   r   r   r   r   r"   U   s   r"   c             C   s"   t jdƒ}dj|j| ƒ|jƒ gƒS )z Compress data with zlib level 0.r   ó    )r   ÚcompressobjÚjoinÚcompressÚflush)ÚdataZcobjr   r   r   Ú_zlib_no_compresse   s    
r3   c               @   s   e Zd ZdZedd„ ƒZdS )r&   r   c             C   s
   t j| ƒS )N)r   r0   )r2   r   r   r   r0   n   s    zSnappyContext.compressN)r*   r+   r,   Úcompressor_idÚstaticmethodr0   r   r   r   r   r&   k   s   r&   c               @   s   e Zd ZdZdd„ ZdS )r'   é   c                s4   ˆ dkrt j| _nˆ dkr"t| _n‡ fdd„| _d S )Nr   r   c                s   t j| ˆ ƒS )N)r   r0   )r2   )r    r   r   Ú<lambda>~   s    z&ZlibContext.__init__.<locals>.<lambda>r   )r   r0   r3   )r$   r    r   )r    r   r%   v   s
    
zZlibContext.__init__N)r*   r+   r,   r4   r%   r   r   r   r   r'   s   s   r'   c               @   s   e Zd ZdZedd„ ƒZdS )r(   é   c             C   s   t ƒ j| ƒS )N)r   r0   )r2   r   r   r   r0   „   s    zZstdContext.compressN)r*   r+   r,   r4   r5   r0   r   r   r   r   r(   �   s   r(   c             C   sT   |t jkrtjt| ƒƒS |tjkr,tj| ƒS |tjkrBt	ƒ j| ƒS t
d|f ƒ‚d S )NzUnknown compressorId %d)r&   r4   r   Ú
uncompressÚbytesr'   r   Ú
decompressr(   r   r   )r2   r4   r   r   r   r;   ‹   s    
	


r;   )r   r   r   ÚImportErrorr   r   Z	zstandardr   r   r   Zpymongo.monitoringr   Úsetr   Z_NO_COMPRESSIONÚupdater   r!   Úobjectr"   r3   r&   r'   r(   r;   r   r   r   r   Ú<module>   s6   





