
    >i                        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       o/var/www/html/wine-match-dev/backend/winematch-backend/venv/lib/python3.12/site-packages/redis/_parsers/base.pyparse_errorzBaseParser.parse_errorN   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_disconnectZ       !##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__d   s     0
r8   c                 D    	 | j                          y # t        $ r Y y w xY wr:   r?   	Exceptionr=   s    r6   __del__z_RESPBase.__del__j   %    	  		    	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_connectp   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_disconnectx   s1    
<<#LL DLr8   c                 T    | j                   xr | j                   j                  |      S r:   )rU   can_read)r>   r   s     r6   rc   z_RESPBase.can_read   s     ||> 5 5g >>r8   N)	rE   rF   rG   __doc__rW   r[   rD   r?   rc   rN   r8   r6   rP   rP   a   s    0*?r8   rP   c            
       Z    e Zd ZdZdZdefdZ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:   rg   rV   s     r6   rW   zAsyncBaseParser.__init__   s    /3*r8   c                 D    	 | j                          y # t        $ r Y y w xY wr:   rY   r=   s    r6   r[   zAsyncBaseParser.__del__   r\   r]   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>   rp   s     r6   read_responsezAsyncBaseParser.read_response   s      "##ro   )F)rE   rF   rG   rd   	__slots__intrW   r[   boolrn   r	   r   r   r   rr   rN   r8   r6   rf   rf      sT    ?'I+ +$D $ (-$ $$	z=$Z0@@	A$r8   rf   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   ry   rx   )r>   rR   	__class__s     r6   rW   z_AsyncRESPBase.__init__   s-    )**.	r8   c                 F    d| _         | j                  j                          y )Nr8   )rU   ry   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)_readerrh   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   rl   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_timeoutrh   readr   r=   s    r6   rn   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)
rx   r.   rU   rh   readexactlyr   r   r   ry   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   findrx   rh   readlineendswithr   r   ry   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   rd   rf   rs   rt   rW   r   rD   r?   ru   rn   bytesr   r   __classcell__)r|   s   @r6   rw   rw      s]    +)),UUI  	D 	# % ( r8   rw   ),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   rf   rw   rN   r8   r6   <module>r      s    
  C C ( (Q3#3#3#9#9R#?06       @S N #W     ':0C .$ .$b ?
  ?F$j $0L_ Lr8   