
    +h8                        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\  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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e      Z( G d de(      Z) G d de(      Z* G d de*      Z+y)    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                   d    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        Zd Zd Zy	)

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                     |j                  d      d   }|| j                  v rN|t        |      dz   d }| j                  |   }t        |t              r|j                  |t              } ||      S t        |      S )zParse an error response r   r   N)splitEXCEPTION_CLASSESlen
isinstancedictgetr   )clsresponse
error_codeexception_classs       F/var/www/html/venv/lib/python3.12/site-packages/redis/_parsers/base.pyparse_errorzBaseParser.parse_errorM   s}     ^^C(+
...J! 3 56H!33J?O/40"1"5"5h"N"8,,X&&    c                     t               NNotImplementedErrorselfs    r6   on_disconnectzBaseParser.on_disconnectY       !##r8   c                     t               r:   r;   r>   
connections     r6   
on_connectzBaseParser.on_connect\   r@   r8   N)__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-   classmethodr7   r?   rD    r8   r6   r    r    0   s     ,_ 3!"F!"F{+[ +,k
  
"  (##!!%#38 	' 	'$$r8   r    c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)	_RESPBasez&Base class for sync-based resp parsingc                 <    || _         d | _        d | _        d | _        y r:   )socket_read_sizeencoder_sock_bufferr>   rR   s     r6   __init__z_RESPBase.__init__c   s     0
r8   c                 D    	 | j                          y # t        $ r Y y w xY wr:   )r?   	Exceptionr=   s    r6   __del__z_RESPBase.__del__i   s%    	  		s    	c                     |j                   | _         t        | j                   | j                  |j                        | _        |j
                  | _        y)zCalled when the socket connectsN)rT   r   rR   socket_timeoutrU   rS   rB   s     r6   rD   z_RESPBase.on_connecto   sA    %%
#JJ--z/H/H
 "))r8   c                 z    d| _         | j                  !| j                  j                          d| _        d| _        y)z"Called when the socket disconnectsN)rT   rU   closerS   r=   s    r6   r?   z_RESPBase.on_disconnectw   s1    
<<#LL DLr8   c                 T    | j                   xr | j                   j                  |      S r:   )rU   can_read)r>   r   s     r6   r`   z_RESPBase.can_read   s     ||> 5 5g >>r8   N)	rE   rF   rG   __doc__rW   rZ   rD   r?   r`   rN   r8   r6   rP   rP   `   s    0*?r8   rP   c            
       T    e Zd ZdZdZdefdZdefdZ	 d
dede	e
edee
   f   fd	Zy)AsyncBaseParserz5Base parsing class for the python-backed async parser_stream
_read_sizerR   c                      d | _         || _        y r:   rd   rV   s     r6   rW   zAsyncBaseParser.__init__   s    /3*r8   returnc                    K   t               wr:   r;   r=   s    r6   can_read_destructivez$AsyncBaseParser.can_read_destructive   s     !##   disable_decodingNc                    K   t               wr:   r;   )r>   rl   s     r6   read_responsezAsyncBaseParser.read_response   s      "##rk   )F)rE   rF   rG   ra   	__slots__intrW   boolrj   r	   r   r   r   rn   rN   r8   r6   rc   rc      sO    ?'I+ +$D $ (-$ $$	z=$Z0@@	A$r8   rc   c                        e Zd ZdZej
                  dz   Zdef fdZd Zd Z	d Z
defd	Zd
edefdZdefdZ xZS )_AsyncRESPBasez!Base class for async resp parsing)rS   rU   _pos_chunksrR   c                 \    t         |   |       d | _        d| _        g | _        d| _        y )Nr8   r   )superrW   rS   rU   ru   rt   )r>   rR   	__class__s     r6   rW   z_AsyncRESPBase.__init__   s-    )**.	r8   c                 F    d| _         | j                  j                          y )Nr8   )rU   ru   clearr=   s    r6   _clearz_AsyncRESPBase._clear   s    r8   c                     |j                   | _        | j                  t        d      |j                  | _        | j	                          d| _        y)zCalled when the stream connectsNBuffer is closed.T)_readerre   r   rS   r{   
_connectedrB   s     r6   rD   z_AsyncRESPBase.on_connect   sB    !))<<011!))r8   c                     d| _         y)z"Called when the stream disconnectsFN)r   r=   s    r6   r?   z_AsyncRESPBase.on_disconnect   s	    r8   rh   c                 8  K   | j                   st        d      | j                  ry	 t        d      4 d {    | j                  j                  d       d {   cd d d       d {    S 7 87 7 	# 1 d {  7  sw Y   y xY w# t        $ r Y yw xY ww)Nr}   Tr   r   F)r   r   rU   async_timeoutre   readr   r=   s    r6   rj   z#_AsyncRESPBase.can_read_destructive   s     011<<	$Q' 2 2!\\..q112 2 212 2 2 2 		s   %BB A0B A6A2A6B *A4+B /B0B 2A64B 6B<A?=BB BB 	BBBBlengthc                   K   |dz   }| j                   |z   }t        | j                        |k\  r| j                  | j                   |dz
   }nl| j                  | j                   d }	 | j                  j	                  |t        |      z
         d{   }||z   dd }| j                  j                  |       | xj                   |z  c_         |S 7 ># t
        $ r}t        t              |d}~ww xY ww)z
        Read `length` bytes of data.  These are assumed to be followed
        by a '
' terminator which is subsequently discarded.
        r   N)
rt   r.   rU   re   readexactlyr   r   r   ru   append)r>   r   wantendresulttaildataerrors           r6   _readz_AsyncRESPBase._read   s     
 zii$t||#\\$))cAg6F<<		,DQ!\\55dSY6FGG Tk3B'FLL%		T	 H& Q%&DE5PQs<   A#C2&*C CC :C2C 	C/C**C//C2c                   K   | j                   j                  d| j                        }|dk\  r| j                   | j                  | }n~| j                   | j                  d }| j                  j	                          d{   }|j                  d      st        t              ||z   dd }| j                  j                  |       | xj                  t        |      dz   z  c_        |S 7 jw)zq
        read an unknown number of bytes up to the next '
'
        line separator, which is discarded.
        s   
r   Nr   r   )rU   findrt   re   readlineendswithr   r   ru   r   r.   )r>   foundr   r   r   s        r6   	_readlinez_AsyncRESPBase._readline   s     
 !!'4995A:\\$))e4F<<		,D..00D==)%&DEETk3B'FLL%		S[1_$	 1s   A<C+>C)?A+C+)rE   rF   rG   ra   rc   ro   rp   rW   r{   rD   r?   rq   rj   bytesr   r   __classcell__)rx   s   @r6   rs   rs      s]    +)),UUI  	D 	# % ( r8   rs   ),sysabcr   asyncior   r   r   typingr   r   r	   version_infomajorminorr   r   
exceptionsr   r   r   r   r   r   r   r   r   r   r   r   r   encodersr   socketr   r   rH   rJ   rK   rI   rL   r    rP   rc   rs   rN   r8   r6   <module>r      s    
  C C ( (Q3#3#3#9#9R#?06       @S N #W     ':0C -$ -$` ?
  ?F$j $$L_ Lr8   