o
    `f                      @   s   d dl Z d dlZd dlZd dl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 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Union      )timeout)	TypedDict   )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"   O/home/ubuntu/webapp/venv/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_connect4   s   
z_HiredisParser.on_connectc                 C   s   d | _ d | _t| _d S r,   )r2   r;   r8   r<   r.   r"   r"   r#   r-   E   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_readJ   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 socketFz!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   T   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_responser   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   version_infomajorminorr   ra   redis.compatr	   
exceptionsr   r   r   r   utilsr   baser   r   r   r   r   r   objectr8   r   r%   r\   r"   r"   r"   r#   <module>   s"    
p