o
    NDi                     @   s   d dl Z d dlmZ d dlmZ d dlmZmZ dZdZ	dZ
dZe d	ZG d
d deZdd Zdd ZG dd deZG dd deZG dd deZdS )    N)DriverException)
int32_pack)write_uint_leread_uint_lei`P iO      s   -Uc                   @   s   e Zd ZdZdS )CrcExceptionz
    CRC mismatch error.

    TODO: here to avoid import cycles with cassandra.connection. In the next
          major, the exceptions should be declared in a separated exceptions.py
          file.
    N)__name__
__module____qualname____doc__ r   r   J/var/www/Datamplify/venv/lib/python3.10/site-packages/cassandra/segment.pyr      s    r   c                 C   sX   t }t|D ]#}|| d@ d> N }| dL } tdD ]}|dK }|d@ dkr(|tN }qq|S )N            i   r   )
CRC24_INITrange
CRC24_POLY)datalengthcrc_ir   r   r   compute_crc24'   s   r   c                 C   s   t | |}|S N)zlibcrc32)r   valuer   r   r   r   compute_crc326   s   r    c                   @   s,   e Zd ZdZdZdZdd Zedd ZdS )SegmentHeaderNc                 C   s   || _ || _|| _d S r   )payload_lengthuncompressed_payload_lengthis_self_contained)selfr"   r#   r$   r   r   r   __init__A   s   
zSegmentHeader.__init__c                 C   s(   | j dk rtjntj}|t | j t S )zL
        Return the total length of the segment, including the CRC.
        r   )r#   SegmentCodecUNCOMPRESSED_HEADER_LENGTHCOMPRESSED_HEADER_LENGTHCRC24_LENGTHr"   CRC32_LENGTH)r%   hlr   r   r   segment_lengthF   s   zSegmentHeader.segment_length)	r	   r
   r   r"   r#   r$   r&   propertyr-   r   r   r   r   r!   ;   s    r!   c                   @   s    e Zd ZdZdZdZdd ZdS )Segmenti Nc                 C      || _ || _d S r   )payloadr$   )r%   r1   r$   r   r   r   r&   W      
zSegment.__init__)r	   r
   r   MAX_PAYLOAD_LENGTHr1   r$   r&   r   r   r   r   r/   P   s
    r/   c                   @   s   e Zd ZdZdZdZdZdZdddZe	dd Z
e	d	d
 Ze	dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )r'      r      Nc                 C   r0   r   
compressordecompressor)r%   r7   r8   r   r   r   r&   e   r2   zSegmentCodec.__init__c                 C   s   | j r| jS | jS r   )compressionr)   r(   r%   r   r   r   header_lengthi   s   zSegmentCodec.header_lengthc                 C   s   | j r| jt S | jt S r   )r9   r)   r(   r*   r:   r   r   r   header_length_with_crcn   s
   
z#SegmentCodec.header_length_with_crcc                 C   s   | j o| jS r   r6   r:   r   r   r   r9   s   s   zSegmentCodec.compressionc                 C   s   |  |dd  S )Nr   )r7   )r%   r   r   r   r   compressw   s   zSegmentCodec.compressc                 C   s   |  t|| S r   )r8   r   )r%   encoded_datauncompressed_lengthr   r   r   
decompress|   s   zSegmentCodec.decompressc                 C   st   |t jkr	td|}| j}| jr|||> O }|d7 }|r#|d|> O }t||| jd t|| j}t||td d S )Nz0Payload length exceed Segment.MAX_PAYLOAD_LENGTHr5   r   )size)	r/   r3   r   FLAG_OFFSETr9   r   r;   r   r*   )r%   bufferr"   r?   r$   header_dataflag_offset
header_crcr   r   r   encode_header   s   
zSegmentCodec.encode_headerc           
      C   sv   |}t |}| jr| |}t ||kr|}d}n|}n|}t |}| |||| t|t}	|| t||	 dS )z7
        Encode a message to a single segment.
        r   N)lenr9   r=   rG   r    CRC32_INITIALwriter   )
r%   rC   r1   r$   uncompressed_payloadr#   compressed_payloadencoded_payloadr"   payload_crcr   r   r   _encode_segment   s   


zSegmentCodec._encode_segmentc                 C   sr   t |}|tjkr"g }td|tjD ]}||||tj   qn|g}t |dk}|D ]	}| ||| q-dS )z;
        Encode a message to one of more segments.
        r   r   N)rH   r/   r3   r   appendrO   )r%   rC   msg
msg_lengthpayloadsr   r$   r1   r   r   r   encode   s   
zSegmentCodec.encodec                 C   s   t || j}t |t}t|| j}||krtd||||tj@ }|dL }| jr4|tj@ }|dL }nd}|d@ dk}t	|||S )Nz;CRC mismatch on header {:x}. Received {:x}", computed {:x}.r5   r   )
r   r;   r*   r   r   formatr/   r3   r9   r!   )r%   rC   rD   expected_header_crcactual_header_crcr"   r#   r$   r   r   r   decode_header   s   



zSegmentCodec.decode_headerc                 C   sd   | |j}t|}t|t}||krtd|||}| jr,|jdkr,| 	||j}t
||jS )Nz7CRC mismatch on payload. Received {:x}", computed {:x}.r   )readr"   r   r    rI   r   rV   r9   r#   r@   r/   r$   )r%   rC   headerrM   expected_payload_crcactual_payload_crcr1   r   r   r   decode   s   
zSegmentCodec.decode)NN)r	   r
   r   r)   r(   rB   r7   r8   r&   r.   r;   r<   r9   r=   r@   rG   rO   rT   rY   r^   r   r   r   r   r'   \   s(    



r'   )r   	cassandrar   cassandra.marshalr   cassandra.protocolr   r   r   r   r*   r+   r   rI   	Exceptionr   r   r    objectr!   r/   r'   r   r   r   r   <module>   s   
