o
    FDi                     @   s   d dl Z d dlmZ d dlmZmZ d dlmZ er"d dlm	Z	m
Z
 ded fdd	Zded
 fddZG dd dZG dd
 d
Zdd ZdS )    N)TYPE_CHECKING)ChecksumDoesntMatchErrorUnknownCompressionMethod)CompressionMethodByte)BufferedReaderBufferedWriterreturnBaseCompressorc                 C   s8   zt d|  t}|jW S  ty   td|  dw )N.zUnknown compression method: '')	importlibimport_module__name__
CompressorImportErrorr   )algmodule r   Z/var/www/Datamplify/venv/lib/python3.10/site-packages/asynch/proto/compression/__init__.pyget_compressor_cls   s   r   BaseDecompressorc                 C   s>   | t jkrtdt}|jS | t jkrtdt}|jS t )Nz.lz4z.zstd)r   LZ4r   r   r   ZSTDr   Decompressor)method_typer   r   r   r   get_decompressor_cls   s   

r   c                   @   sF   e Zd ZdZdZdZdddZdd Zd	efd
dZ	de
fddZdS )r	   z5
    Partial file-like object with write method.
    Nwriterr   c                 C   s
   || _ d S N)r   )selfr   r   r   r   __init__)   s   
zBaseCompressor.__init__c                 C      t r   NotImplementedErrorr   datar   r   r   compress_data,      zBaseCompressor.compress_datar$   c                    s   | j |I d H  d S r   )r   write_bytesr#   r   r   r   write/   s   zBaseCompressor.writeextra_header_sizec                    s   | j j}t | j _| |}|d d }| j |t| I d H  | j t|I d H  | j |I d H  | j j}t | j _|S )N   )r   buffer	bytearrayr%   write_uint32lenr'   )r   r)   r$   
compressedheader_sizeresultr   r   r   get_compressed_data2   s   


z"BaseCompressor.get_compressed_data)r   r   )r   
__module____qualname____doc__methodmethod_byter   r%   r,   r(   intr2   r   r   r   r   r	   !   s    
c                   @   s.   e Zd ZdZdZdddZdd	 Zd
d ZdS )r   Nreaderr   r   r   c                 C   s   || _ || _d S r   )r9   r   )r   r9   r   r   r   r   r   C   s   
zBaseDecompressor.__init__c                 C   r    r   r!   )r   r$   uncompressed_sizer   r   r   decompress_dataG   r&   z BaseDecompressor.decompress_datac           
         s   t  }| j I d H }|| d }| j|I d H }| j|I d H  | j|I d H  | j|I d H  || jj|krAt	 | jj
| jjd}||_t||_| I d H }	|d| }| ||	S )Nr*   )r9   )import_cityhashr9   read_uint32
read_bytesr   write_uint8r-   r'   r+   r   	__class__r.   current_buffer_sizer;   )
r   r7   compressed_hashr)   CityHash128size_with_headercompressed_sizer/   r9   r:   r   r   r   get_decompressed_dataJ   s    
z&BaseDecompressor.get_decompressed_data)r9   r   r   r   )r   r3   r4   r6   r7   r   r;   rF   r   r   r   r   r   ?   s    
c               
   C   s6   z	ddl m}  W | S  ty } ztd|d }~ww )Nr   )rC   z8Please install clickhouse-cityhash to enable compression)clickhouse_cityhash.cityhashrC   r   )rC   er   r   r   r<   _   s   
r<   )r   typingr   asynch.errorsr   r   asynch.proto.protocolr   asynch.proto.streams.bufferedr   r   typer   r   r	   r   r<   r   r   r   r   <module>   s    	 