o
    Š¨Êhý  ã                   @   sø   d dl Z d dlZd dlZd dlmZmZmZmZmZ ej	j
dkr-ej	jdkr-d dl mZ nd dlmZ ddlmZmZmZ ddlmZ dd	lmZ d
dlmZmZ d
dlmZmZmZmZ eƒ ZG dd„ dedd�ZG dd„ deƒZG dd„ deƒZ dS )é    N)ÚCallableÚListÚOptionalÚ	TypedDictÚUnioné   é   )Útimeouté   )ÚConnectionErrorÚInvalidResponseÚ
RedisError)Ú
EncodableT)ÚHIREDIS_AVAILABLEé   )ÚAsyncBaseParserÚ
BaseParser)Ú#NONBLOCKING_EXCEPTION_ERROR_NUMBERSÚNONBLOCKING_EXCEPTIONSÚSENTINELÚSERVER_CLOSED_CONNECTION_ERRORc                   @   sJ   e Zd ZU eegef ed< eegef ed< ee ed< ee ed< dS )Ú_HiredisReaderArgsÚprotocolErrorÚ
replyErrorÚencodingÚerrorsN)Ú__name__Ú
__module__Ú__qualname__r   ÚstrÚ	ExceptionÚ__annotations__r   © r"   r"   úH/var/www/html/env/lib/python3.10/site-packages/redis/_parsers/hiredis.pyr      s
   
 r   F)Útotalc                   @   sP   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Ze	dfdd„Z
ddd„ZdS )Ú_HiredisParserz*Parser class for connections using Hiredisc                 C   s    t stdƒ‚|| _t|ƒ| _d S )NzHiredis is not installed)r   r   Úsocket_read_sizeÚ	bytearrayÚ_buffer©Úselfr&   r"   r"   r#   Ú__init__&   s   z_HiredisParser.__init__c                 C   s$   z|   ¡  W d S  ty   Y d S w ©N)Úon_disconnectr    ©r*   r"   r"   r#   Ú__del__,   s
   ÿz_HiredisParser.__del__c                 K   s\   dd l }|j| _|j| _t| j|jjtdœ}|jj	r |jj
|d< |jdi |¤Ž| _t| _d S )Nr   )r   r   r   ÚnotEnoughDatar   r"   )ÚhiredisÚ_sockÚsocket_timeoutÚ_socket_timeoutr   Úparse_errorÚencoderÚencoding_errorsÚNOT_ENOUGH_DATAÚdecode_responsesr   ÚReaderÚ_readerÚ_next_response)r*   Ú
connectionÚkwargsr1   r"   r"   r#   Ú
on_connect2   s   ü
z_HiredisParser.on_connectc                 C   s   d | _ d | _t| _d S r,   )r2   r;   r8   r<   r.   r"   r"   r#   r-   C   s   
z_HiredisParser.on_disconnectc                 C   s@   | j sttƒ‚| jtu r| j  ¡ | _| jtu r| j|dd�S dS )NF)r	   Úraise_on_timeoutT)r;   r   r   r<   r8   ÚgetsÚread_from_socket)r*   r	   r"   r"   r#   Úcan_readH   s   

z_HiredisParser.can_readTc              
   C   s  | j }|tu}z}z-|r| |¡ | j  | j¡}|dkrttƒ‚| j | jd|¡ W W |r4| | j	¡ dS dS  t
jyQ   |rCtdƒ‚Y W |rO| | j	¡ dS dS  ty„ } z(t |jd¡}|sx|j|krxW Y d }~W |rv| | j	¡ dS dS td|j› �ƒ‚d }~ww |rŽ| | j	¡ w w )Nr   TzTimeout reading from socketFéÿÿÿÿz!Error while reading from socket: )r2   r   Ú
settimeoutÚ	recv_intor(   r   r   r;   Úfeedr4   Úsocketr	   ÚTimeoutErrorr   r   ÚgetÚ	__class__ÚerrnoÚargs)r*   r	   r@   ÚsockÚcustom_timeoutÚbufflenÚexÚallowedr"   r"   r#   rB   R   sB   
ÿòÿöÿþ€ø
ÿz_HiredisParser.read_from_socketFc                 C   s®   | j sttƒ‚| jtur| j}t| _|S |r| j  d¡}n| j  ¡ }|tu r<|  ¡  |r3| j  d¡}n| j  ¡ }|tu s&t|tƒrC|‚t|tƒrU|rUt|d tƒrU|d ‚|S ©NFr   )	r;   r   r   r<   r8   rA   rB   Ú
isinstanceÚlist©r*   Údisable_decodingÚresponser"   r"   r#   Úread_responsep   s2   


û
	ÿþýz_HiredisParser.read_responseN©F)r   r   r   Ú__doc__r+   r/   r?   r-   rC   r   rB   rY   r"   r"   r"   r#   r%   #   s    
r%   c                       sl   e Zd ZdZdZdef‡ fdd„Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
	ddedeeee f fdd„Z‡  ZS )Ú_AsyncHiredisParserzBAsync implementation of parser class for connections using Hiredis)r;   r&   c                    s$   t stdƒ‚tƒ j|d� d | _d S )NzHiredis is not available.)r&   )r   r   Úsuperr+   r;   r)   ©rK   r"   r#   r+   ˜   s   
z_AsyncHiredisParser.__init__c                 C   sZ   dd l }|j| _t| jtdœ}|jjr|jj|d< |jj	|d< |j
di |¤Ž| _d| _d S )Nr   )r   r   r0   r   r   Tr"   )r1   r;   Ú_streamr   r5   r8   r6   r9   r   r7   r:   Ú
_connected)r*   r=   r1   r>   r"   r"   r#   r?   ž   s   ý
z_AsyncHiredisParser.on_connectc                 C   s
   d| _ d S )NF)r`   r.   r"   r"   r#   r-   ®   s   
z!_AsyncHiredisParser.on_disconnectc              	   Ã   sŒ   �| j sttƒ‚| j ¡ turdS z)tdƒ4 I d H š |  ¡ I d H W  d   ƒI d H  W S 1 I d H s3w   Y  W d S  tj	yE   Y dS w )NTr   F)
r`   r   r   r;   rA   r8   Úasync_timeoutrB   ÚasynciorI   r.   r"   r"   r#   Úcan_read_destructive±   s   €4ÿÿz(_AsyncHiredisParser.can_read_destructivec                 Ã   s>   �| j  | j¡I d H }|rt|tƒsttƒd ‚| j |¡ dS )NT)	r_   ÚreadÚ
_read_sizerT   Úbytesr   r   r;   rG   )r*   Úbufferr"   r"   r#   rB   ¼   s   €
z$_AsyncHiredisParser.read_from_socketFrW   Úreturnc                 Ã   sž   �| j s	ttƒd ‚|r| j d¡}n| j ¡ }|tu r4|  ¡ I d H  |r+| j d¡}n| j ¡ }|tu st|tƒr;|‚t|tƒrM|rMt|d tƒrM|d ‚|S rS   )	r`   r   r   r;   rA   r8   rB   rT   rU   rV   r"   r"   r#   rY   Å   s,   €


û

ÿþýz!_AsyncHiredisParser.read_responserZ   )r   r   r   r[   Ú	__slots__Úintr+   r?   r-   rc   rB   Úboolr   r   r   rY   Ú__classcell__r"   r"   r^   r#   r\   “   s    
ÿÿþr\   )!rb   rH   ÚsysÚtypingr   r   r   r   r   Úversion_infoÚmajorÚminorr	   ra   Ú
exceptionsr   r   r   r   Úutilsr   Úbaser   r   r   r   r   r   Úobjectr8   r   r%   r\   r"   r"   r"   r#   Ú<module>   s     
p