o
    i<+                     @   s  d dl Z d dlZd dlZd dlmZ d dlmZmZmZm	Z	m
Z
 ejjdkr3ejjdkr3d 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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eZ#G dd deeZ$dS )    N)	getLogger)CallableListOptional	TypedDictUnion      )timeout   )ConnectionErrorInvalidResponse
RedisError)
EncodableT)HIREDIS_AVAILABLE   )AsyncBaseParserAsyncPushNotificationsParser
BaseParserPushNotificationsParser)#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%   J/home/ubuntu/.local/lib/python3.10/site-packages/redis/_parsers/hiredis.pyr   "   s
   
 r   F)totalc                   @   sX   e Zd ZdZd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   sF   t std|| _t|| _| j| _d | _d | _d | _	d | _
d | _d S )NzHiredis is not installed)r   r   socket_read_size	bytearray_bufferhandle_pubsub_push_responsepubsub_push_handler_funcnode_moving_push_handler_funcmaintenance_push_handler_func#oss_cluster_maint_push_handler_funcinvalidation_push_handler_func_hiredis_PushNotificationType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#   r4   r%   r%   r&   __del__8   s
   z_HiredisParser.__del__c                 C   s   t d}|dt|  |S Npush_responsezPush response: r   debugr"   r4   responseloggerr%   r%   r&   r,   >   s   z*_HiredisParser.handle_pubsub_push_responsec                 K   s   dd l }|j| _|j| _t| j|jjtd}|jj	r |jj
|d< |jdi || _t| _z|j| _W d S  ty@   d | _Y d S w )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PushNotificationr2   AttributeError)r4   
connectionkwargsrB   r%   r%   r&   
on_connectC   s"   z_HiredisParser.on_connectc                 C   s   d | _ d | _t| _d S r6   )rC   rL   rI   rM   r8   r%   r%   r&   r7   Z   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)rL   r   r   rM   rI   getsread_from_socket)r4   r
   r%   r%   r&   can_read_   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: )rC   r   
settimeout	recv_intor+   r   r   rL   feedrE   socketr
   TimeoutErrorr   r   get	__class__errnoargs)r4   r
   rS   sockcustom_timeoutbufflenexallowedr%   r%   r&   rU   i   sB   

z_HiredisParser.read_from_socketFc                 C   s  | j stt| jtur/| j}t| _| jd ur-t|| jr-| |}|r&|S | j||dS |S |r8| j 	d}n| j 	 }|tu rW| 
  |rN| j 	d}n| j 	 }|tu sAt|tr^|| jd uryt|| jry| |}|rr|S | j||dS t|tr|rt|d tr|d |S )Ndisable_decodingpush_requestFr   )rL   r   r   rM   rI   r2   
isinstancehandle_push_responseread_responserT   rU   listr4   rg   rh   r?   r%   r%   r&   rk      sZ   




	
z_HiredisParser.read_responseNFF)r   r    r!   __doc__r5   r9   r,   rR   r7   rV   r   rU   rk   r%   r%   r%   r&   r(   )   s    
r(   c                
       sx   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 Z	ddededeeee f fddZ  ZS )_AsyncHiredisParserzBAsync implementation of parser class for connections using Hiredis)rL   r)   c                    s8   t stdt j|d d | _| j| _d | _d | _d S )NzHiredis is not available.)r)   )	r   r   superr5   rL   r,   r-   r1   r2   r3   r^   r%   r&   r5      s   
z_AsyncHiredisParser.__init__c                    s    t d}|dt|  |S r:   r<   r>   r%   r%   r&   r,      s   z/_AsyncHiredisParser.handle_pubsub_push_responsec                 C   s   dd l }|j| _t| jtd}|jjr|jj|d< |jj	|d< |j
di || _d| _z
t|dd | _W d S  tyB   d | _Y d S w )Nr   )r   r   rA   r   r   TrN   r%   )rB   rL   _streamr   rF   rI   rG   rJ   r   rH   rK   
_connectedgetattrr2   rO   )r4   rP   rB   rQ   r%   r%   r&   rR      s$   z_AsyncHiredisParser.on_connectc                 C   s
   d| _ d S )NF)rt   r8   r%   r%   r&   r7      s   
z!_AsyncHiredisParser.on_disconnectc              	      s   | j std| 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 )NzBuffer is closed.Tr   F)	rt   OSErrorrL   rT   rI   async_timeoutrU   asyncior\   r8   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)	rs   read
_read_sizeri   bytesr   r   rL   rZ   )r4   bufferr%   r%   r&   rU      s   
z$_AsyncHiredisParser.read_from_socketFrg   rh   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;|| jd ur\t|| jr\| 	|I d H }|sZ| j
||dI d H S |S t|trn|rnt|d trn|d |S )NFrf   r   )rt   r   r   rL   rT   rI   rU   ri   r2   rj   rk   rl   rm   r%   r%   r&   rk     s>   




z!_AsyncHiredisParser.read_responsern   )r   r    r!   ro   	__slots__intr5   r,   rR   r7   ry   rU   boolr   r   r   rk   __classcell__r%   r%   rr   r&   rp      s"    	
rp   )%rx   r[   sysloggingr   typingr   r   r   r   r   version_infomajorminorr
   rw   
exceptionsr   r   r   r   utilsr   baser   r   r   r   r   r   r   r   objectrI   r   r(   rp   r%   r%   r%   r&   <module>   s$    
 