o
    Š¨Êh3  ã                   @   s,  d dl Z d dlmZ d dlmZmZmZ d dlmZm	Z	m
Z
 e jjdkr1e jjdkr1d dlmZ nd dlmZ dd	lmZmZmZmZmZmZmZmZmZmZmZm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edœZ'G dd„ deƒZ(G dd„ de(ƒZ)G dd„ de(ƒZ*G dd„ de*ƒZ+dS )é    N)ÚABC)ÚIncompleteReadErrorÚStreamReaderÚTimeoutError)ÚListÚOptionalÚUnioné   é   )Útimeouté   )ÚAuthenticationErrorÚ$AuthenticationWrongNumberOfArgsErrorÚBusyLoadingErrorÚConnectionErrorÚExecAbortErrorÚModuleErrorÚNoPermissionErrorÚNoScriptErrorÚOutOfMemoryErrorÚReadOnlyErrorÚ
RedisErrorÚResponseError)Ú
EncodableTé   )ÚEncoder)ÚSERVER_CLOSED_CONNECTION_ERRORÚSocketBufferz:Error loading the extension. Please check the server logs.z5Error unloading module: no such module with that namez/Error unloading module: operation not possible.z[Error unloading module: the module exports one or more module-side data types, can't unload)zxAUTH <password> called without any password configured for the default user. Are you sure your configuration is correct?z(Client sent AUTH, but no password is setc                   @   sd   e Zd Zdedededeeeeee	ee
eie¥eeeeeeeedœ	Zedd„ ƒZdd	„ Zd
d„ ZdS )Ú
BaseParserzmax number of clients reachedzinvalid passwordz,wrong number of arguments for 'auth' commandz,wrong number of arguments for 'AUTH' command)	ÚERRÚOOMÚ	WRONGPASSÚ	EXECABORTÚLOADINGÚNOSCRIPTÚREADONLYÚNOAUTHÚNOPERMc                 C   s\   |  d¡d }|| jv r*|t|ƒd d… }| j| }t|tƒr&| |t¡}||ƒS t|ƒS )zParse an error responseú r   r   N)ÚsplitÚEXCEPTION_CLASSESÚlenÚ
isinstanceÚdictÚgetr   )ÚclsÚresponseÚ
error_codeÚexception_class© r3   úE/var/www/html/env/lib/python3.10/site-packages/redis/_parsers/base.pyÚparse_errorM   s   


zBaseParser.parse_errorc                 C   ó   t ƒ ‚©N©ÚNotImplementedError©Úselfr3   r3   r4   Úon_disconnectY   ó   zBaseParser.on_disconnectc                 C   r6   r7   r8   ©r;   Ú
connectionr3   r3   r4   Ú
on_connect\   r=   zBaseParser.on_connectN)Ú__name__Ú
__module__Ú__qualname__r   r   r   ÚMODULE_LOAD_ERRORr   ÚMODULE_EXPORTS_DATA_TYPES_ERRORÚNO_SUCH_MODULE_ERRORÚ MODULE_UNLOAD_NOT_POSSIBLE_ERRORÚNO_AUTH_SET_ERRORr   r   r   r   r   r   r*   Úclassmethodr5   r<   r@   r3   r3   r3   r4   r   0   s6    òñç
r   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )Ú	_RESPBasez&Base class for sync-based resp parsingc                 C   s   || _ d | _d | _d | _d S r7   )Úsocket_read_sizeÚencoderÚ_sockÚ_buffer©r;   rK   r3   r3   r4   Ú__init__c   s   
z_RESPBase.__init__c                 C   s$   z|   ¡  W d S  ty   Y d S w r7   )r<   Ú	Exceptionr:   r3   r3   r4   Ú__del__i   s
   ÿz_RESPBase.__del__c                 C   s(   |j | _ t| j | j|jƒ| _|j| _dS )zCalled when the socket connectsN)rM   r   rK   Úsocket_timeoutrN   rL   r>   r3   r3   r4   r@   o   s
   ÿz_RESPBase.on_connectc                 C   s*   d| _ | jdur| j ¡  d| _d| _dS )z"Called when the socket disconnectsN)rM   rN   ÚcloserL   r:   r3   r3   r4   r<   w   s
   


z_RESPBase.on_disconnectc                 C   s   | j o| j  |¡S r7   )rN   Úcan_read)r;   r   r3   r3   r4   rU      s   z_RESPBase.can_readN)	rA   rB   rC   Ú__doc__rP   rR   r@   r<   rU   r3   r3   r3   r4   rJ   `   s    rJ   c                
   @   sV   e Zd ZdZdZdefdd„Zdefdd„Z		dd
ede	e
edee
 f fdd„ZdS )ÚAsyncBaseParserz5Base parsing class for the python-backed async parser©Ú_streamÚ
_read_sizerK   c                 C   s   d | _ || _d S r7   rX   rO   r3   r3   r4   rP   ˆ   s   
zAsyncBaseParser.__init__Úreturnc                 Ã   ó   �t ƒ ‚r7   r8   r:   r3   r3   r4   Úcan_read_destructiveŒ   s   €z$AsyncBaseParser.can_read_destructiveFÚdisable_decodingNc                 Ã   r\   r7   r8   )r;   r^   r3   r3   r4   Úread_response�   s   €zAsyncBaseParser.read_response)F)rA   rB   rC   rV   Ú	__slots__ÚintrP   Úboolr]   r   r   r   r   r_   r3   r3   r3   r4   rW   ƒ   s    ÿÿþrW   c                       sv   e Zd ZdZejd Zdef‡ fdd„Zdd„ Zdd	„ Z	d
d„ Z
defdd„Zdedefdd„Zdefdd„Z‡  ZS )Ú_AsyncRESPBasez!Base class for async resp parsing)rL   rN   Ú_posÚ_chunksrK   c                    s(   t ƒ  |¡ d | _d| _g | _d| _d S )Nó    r   )ÚsuperrP   rL   rN   re   rd   rO   ©Ú	__class__r3   r4   rP   š   s
   
z_AsyncRESPBase.__init__c                 C   s   d| _ | j ¡  d S )Nrf   )rN   re   Úclearr:   r3   r3   r4   Ú_clear¡   s   z_AsyncRESPBase._clearc                 C   s4   |j | _| jdu rtdƒ‚|j| _|  ¡  d| _dS )zCalled when the stream connectsNúBuffer is closed.T)Ú_readerrY   r   rL   rk   Ú
_connectedr>   r3   r3   r4   r@   ¥   s   

z_AsyncRESPBase.on_connectc                 C   s
   d| _ dS )z"Called when the stream disconnectsFN)rn   r:   r3   r3   r4   r<   ®   s   
z_AsyncRESPBase.on_disconnectr[   c              	   Ã   s~   �| j stdƒ‚| jrdS z'tdƒ4 I d H š | j ¡ W  d   ƒI d H  W S 1 I d H s-w   Y  W d S  ty>   Y dS w )Nrl   Tr   F)rn   r   rN   Úasync_timeoutrY   Úat_eofr   r:   r3   r3   r4   r]   ²   s   €4ÿÿz#_AsyncRESPBase.can_read_destructiveÚlengthc              
   Ã   s¸   �|d }| j | }t| jƒ|kr| j| j |d … }n7| j| j d… }z| j |t|ƒ ¡I dH }W n tyD } zttƒ|‚d}~ww || dd… }| j 	|¡ |  j |7  _ |S )zŽ
        Read `length` bytes of data.  These are assumed to be followed
        by a '
' terminator which is subsequently discarded.
        r   Néþÿÿÿ)
rd   r+   rN   rY   Úreadexactlyr   r   r   re   Úappend)r;   rq   ÚwantÚendÚresultÚtailÚdataÚerrorr3   r3   r4   Ú_read½   s    €

€ÿz_AsyncRESPBase._readc                 Ã   s”   �| j  d| j¡}|dkr| j | j|… }n'| j | jd… }| j ¡ I dH }| d¡s/ttƒ‚|| dd… }| j 	|¡ |  jt
|ƒd 7  _|S )zq
        read an unknown number of bytes up to the next '
'
        line separator, which is discarded.
        s   
r   Nrr   r   )rN   Úfindrd   rY   ÚreadlineÚendswithr   r   re   rt   r+   )r;   Úfoundrw   rx   ry   r3   r3   r4   Ú	_readlineÑ   s   €
z_AsyncRESPBase._readline)rA   rB   rC   rV   rW   r`   ra   rP   rk   r@   r<   rb   r]   Úbytesr{   r€   Ú__classcell__r3   r3   rh   r4   rc   •   s    
	rc   ),ÚsysÚabcr   Úasyncior   r   r   Útypingr   r   r   Úversion_infoÚmajorÚminorr   ro   Ú
exceptionsr   r   r   r   r   r   r   r   r   r   r   r   r   Úencodersr   Úsocketr   r   rD   rF   rG   rE   rH   r   rJ   rW   rc   r3   r3   r3   r4   Ú<module>   s.    8ÿ
ú
0#