
    OǻiO                     x   U d dl Z 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mZmZmZ d dlmZmZmZmZmZmZmZmZ d dlmZ ej4                  j6                  dk\  r ej4                  j8                  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+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 d
dlm2Z2 ddl3m4Z4 ddl5m6Z6m7Z7 dZ8dZ9dZ:dZ;e!e!dZ<de(iZ= e j|                  e?      Z@ G d de      ZA G d deA      ZB G d deA      ZC G d d      ZDdZEdZFd ZGd!ZHd"ZId#ZJd$ZKd%ZLeGeHeIeJeKfZMeGeeDj                  feHeeDj                  feIeeDj                  feJeeDj                  feFeeDj                  feKeeDj                  feLeeDj                  fiZSeTeUeVeWe   e
f   f   eXd&<    G d' d(e      ZY G d) d*e      ZZ G d+ d,eC      Z[y)-    N)ABC)IncompleteReadErrorStreamReaderTimeoutError)	AwaitableCallableListOptionalProtocolUnion)MaintenanceNotificationNodeFailedOverNotificationNodeFailingOverNotificationNodeMigratedNotificationNodeMigratingNotificationNodeMovingNotificationOSSNodeMigratedNotificationOSSNodeMigratingNotification)safe_str      )timeout   )AskErrorAuthenticationError$AuthenticationWrongNumberOfArgsErrorBusyLoadingErrorClusterCrossSlotErrorClusterDownErrorConnectionErrorExecAbortErrorExternalAuthProviderErrorMasterDownErrorModuleError
MovedErrorNoPermissionErrorNoScriptErrorOutOfMemoryErrorReadOnlyErrorResponseErrorTryAgainError)
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 setzproblem with LDAP servicec                   t    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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NOPERMASKTRYAGAINMOVEDCLUSTERDOWN	CROSSSLOT
MASTERDOWNc                     |j                  d      d   }|| j                  v rP|t        |      dz   d }| j                  |   }t        |t              r|j                  |t              } |||      S t        |      S )zParse an error response r   r-   N)status_code)splitEXCEPTION_CLASSESlen
isinstancedictgetr*   )clsresponse
error_codeexception_classs       Q/opt/lhia/marcimex/agent/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DDX&&    c                     t               NNotImplementedErrorselfs    rO   on_disconnectzBaseParser.on_disconnecty       !##rQ   c                     t               rS   rT   rW   
connections     rO   
on_connectzBaseParser.on_connect|   rY   rQ   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_ERROREXTERNAL_AUTH_PROVIDER_ERRORr(   r!   r   r'   r)   r&   r   r+   r%   r   r   r#   rF   classmethodrP   rX   r]    rQ   rO   r2   r2   I   s     ,_ 3!"F!"F{+[ +,k
  
  +!
$  (##!!%#!'*%A!F 	' 	'$$rQ   r2   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 rS   )socket_read_sizeencoder_sock_bufferrW   rl   s     rO   __init__z_RESPBase.__init__   s     0
rQ   c                 D    	 | j                          y # t        $ r Y y w xY wrS   )rX   	ExceptionrV   s    rO   __del__z_RESPBase.__del__   s%    	  		s    	c                     |j                   | _         t        | j                   | j                  |j                        | _        |j
                  | _        y)zCalled when the socket connectsN)rn   r0   rl   socket_timeoutro   rm   r[   s     rO   r]   z_RESPBase.on_connect   sA    %%
#JJ--z/H/H
 "))rQ   c                 z    d| _         | j                  !| j                  j                          d| _        d| _        y)z"Called when the socket disconnectsN)rn   ro   closerm   rV   s    rO   rX   z_RESPBase.on_disconnect   s1    
<<#LL DLrQ   c                 T    | j                   xr | j                   j                  |      S rS   )ro   can_read)rW   r   s     rO   rz   z_RESPBase.can_read   s     ||> 5 5g >>rQ   N)	r^   r_   r`   __doc__rq   rt   r]   rX   rz   rh   rQ   rO   rj   rj      s    0*?rQ   rj   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_sizerl   c                      d | _         || _        y rS   r~   rp   s     rO   rq   zAsyncBaseParser.__init__   s    /3*rQ   returnc                    K   t               wrS   rT   rV   s    rO   can_read_destructivez$AsyncBaseParser.can_read_destructive   s     !##   disable_decodingNc                    K   t               wrS   rT   )rW   r   s     rO   read_responsezAsyncBaseParser.read_response   s      "##r   )F)r^   r_   r`   r{   	__slots__intrq   boolr   r   r,   r*   r	   r   rh   rQ   rO   r}   r}      sO    ?'I+ +$D $ (-$ $$	z=$Z0@@	A$rQ   r}   c                   `    e Zd ZdZed        Zed        Zed        Zed        Zed        Z	y)MaintenanceNotificationsParserzEProtocol defining maintenance push notification parsing functionalityc                 @    | d   }t        | d         }t        ||      S Nr-   r   )r   r   )rL   idslotss      rO   parse_oss_maintenance_start_msgz>MaintenanceNotificationsParser.parse_oss_maintenance_start_msg   s(     a[!%+B66rQ   c                     | d   }| d   }i }|D ]F  \  }}}t        |      }t        |      }t        |      }	||vrg ||<   ||   j                  ||	i       H t        ||      S r   )r   appendr   )
rL   r   nodes_to_slots_mapping_datanodes_to_slots_mappingsrc_node	dest_noder   src_node_strdest_node_str	slots_strs
             rO   #parse_oss_maintenance_completed_msgzBMaintenanceNotificationsParser.parse_oss_maintenance_completed_msg   s     a[&.qk# "$*E 	T&Hi#H-L$Y/M I#9979&|4"<077	8RS	T +2/EFFrQ   c                 (    | d   }| d   } |||      S r   rh   )rL   notification_typer   ttls       rO   parse_maintenance_start_msgz:MaintenanceNotificationsParser.parse_maintenance_start_msg   s#     a[qk S))rQ   c                     | d   } ||      S )Nr-   rh   )rL   r   r   s      rO   parse_maintenance_completed_msgz>MaintenanceNotificationsParser.parse_maintenance_completed_msg   s     a[ $$rQ   c                     | d   }| d   }| d   d\  }}n1t        | d         }|j                  d      \  }}|t        |      nd }t        ||||      S )Nr-   r   r   )NN:)r   rE   r   r   )rL   r   r   hostportvalues         rO   parse_moving_msgz/MaintenanceNotificationsParser.parse_moving_msg   sj     a[qkA;#JD$Xa[)ES)JD$ $ 03t9dD%b$c::rQ   N)
r^   r_   r`   r{   staticmethodr   r   r   r   r   rh   rQ   rO   r   r      si    O7 7 G G2 * * % % ; ;rQ   r   
invalidateMOVING	MIGRATINGMIGRATEDFAILING_OVERFAILED_OVER
SMIGRATING	SMIGRATED-MSG_TYPE_TO_MAINT_NOTIFICATION_PARSER_MAPPINGc                       e Zd ZU dZeed<   dZee   ed<   dZee   ed<   dZ	ee   ed<   dZ
ee   ed<   d Zd	 Zd
 Zd Zd Zd Zd Zy)PushNotificationsParserz6Protocol defining RESP3-specific parsing functionalitypubsub_push_handler_funcNinvalidation_push_handler_funcnode_moving_push_handler_funcmaintenance_push_handler_func#oss_cluster_maint_push_handler_funcc                     t               )zHandle pubsub push responsesrT   rW   rL   s     rO   handle_pubsub_push_responsez3PushNotificationsParser.handle_pubsub_push_response8  s    !##rQ   c                 x   |d   }t        |t              r|j                         }|t        gt        t
        t        vr| j                  |      S 	 |t        k(  r| j                  r| j                  |      S |t
        k(  r1| j                  r%t        |   d   } ||      }| j                  |      S |t        v rR| j                  rFt        |   d   }|t        k(  r	 ||      }nt        |   d   } |||      }|| j                  |      S |t        k(  rh| j                  s| j                  rPt        |   d   } ||      }|:| j                  r| j                  |       | j                  r| j                  |       y # t        $ r0}t        j!                  dj#                  |||             Y d }~y d }~ww xY w)Nr   r-   "Error handling {} message ({}): {}rH   bytesdecode_INVALIDATION_MESSAGE_MAINTENANCE_MESSAGES_MOVING_MESSAGE_SMIGRATED_MESSAGEr   r   r   r   r   _SMIGRATING_MESSAGEr   rs   loggererrorformatrW   rL   kwargsmsg_typeparser_functionnotificationr   es           rO   handle_push_responsez,PushNotificationsParser.handle_push_response<  s   A;h&(H!
"
 
 	
 
 00::.	1177::8DD?*t/Q/Q"O##  /x899,GG00T5W5W"O## 22#28#<L(U ))% $38=N#OL+==lKK--8855"O##  /x8+99::<H??@@N   	LL4;;HhPQR  	s,   %F  :9F  4AF  A1F   	F9	&F44F9c                     || _         y rS   r   rW   r   s     rO   set_pubsub_push_handlerz/PushNotificationsParser.set_pubsub_push_handler{  s
    (@%rQ   c                     || _         y rS   r   rW   r   s     rO   set_invalidation_push_handlerz5PushNotificationsParser.set_invalidation_push_handler~  s
    .L+rQ   c                     || _         y rS   r   rW   r   s     rO   set_node_moving_push_handlerz4PushNotificationsParser.set_node_moving_push_handler  
    -J*rQ   c                     || _         y rS   r   rW   r   s     rO   set_maintenance_push_handlerz4PushNotificationsParser.set_maintenance_push_handler  r   rQ   c                     || _         y rS   r   rW   r   s     rO   "set_oss_cluster_maint_push_handlerz:PushNotificationsParser.set_oss_cluster_maint_push_handler  
    3V0rQ   )r^   r_   r`   r{   r   __annotations__r   r
   r   r   r   r   r   r   r   r   r   r   rh   rQ   rO   r   r   /  st    @&&9="HX$6=8<!8H#5<8<!8H#5<>B'();B$=~AMKKWrQ   r   c                       e Zd ZU dZeed<   dZee   ed<   dZeede	d   f      ed<   dZ
eede	d   f      ed<   dZeede	d   f      ed<   d	 Zd
 Zd Zd Zd Zd Zd Zy)AsyncPushNotificationsParserz<Protocol defining async RESP3-specific parsing functionalityr   Nr   .r   r   r   c                    K   t               w)z+Handle pubsub push responses asynchronouslyrT   r   s     rO   r   z8AsyncPushNotificationsParser.handle_pubsub_push_response  s     !##r   c                   K   |d   }t        |t              r|j                         }|t        gt        t
        t        vr| j                  |       d{   S 	 |t        k(  r%| j                  r| j                  |       d{   S t        |t              r|j                         }|t
        k(  r9| j                  r-t        |   d   } ||      }| j                  |       d{   S |t        v rZ| j                  rNt        |   d   }|t        k(  r	 ||      }nt        |   d   } |||      }|| j                  |       d{   S |t        k(  r;| j                  r/t        |   d   } ||      }|| j                  |       d{   S y7 =7 7 7 Q7 # t        $ r0}t        j!                  dj#                  |||             Y d}~yd}~ww xY ww)z$Handle push responses asynchronouslyr   Nr-   r   r   r   s           rO   r   z1AsyncPushNotificationsParser.handle_push_response  s     A;h&(H!
"
 
 	
 
 66x@@@,	1177!@@JJJ(E*#??,?*t/Q/Q"O##  /x8!??MMM00T5W5W"O## 22#28#<L(U ))% $38=N#OL+!%!C!CL!QQQ..<<"O##  /x8+!%!I!I,!WWW a A K N R X 	LL4;;HhPQR  	s   AGFG)F! FF! GAF! )F*F! -G.AF! FF! G?F! FF! GF! F! F! F! !	G*&GGGGc                     || _         y)z$Set the pubsub push handler functionNr   r   s     rO   r   z4AsyncPushNotificationsParser.set_pubsub_push_handler  s
    (@%rQ   c                     || _         y)z*Set the invalidation push handler functionNr   r   s     rO   r   z:AsyncPushNotificationsParser.set_invalidation_push_handler  s
    .L+rQ   c                     || _         y rS   r   r   s     rO   r   z9AsyncPushNotificationsParser.set_node_moving_push_handler  r   rQ   c                     || _         y rS   r   r   s     rO   r   z9AsyncPushNotificationsParser.set_maintenance_push_handler  r   rQ   c                     || _         y rS   r   r   s     rO   r   z?AsyncPushNotificationsParser.set_oss_cluster_maint_push_handler  r   rQ   )r^   r_   r`   r{   r   r   r   r
   r   r   r   r   r   r   r   r   r   r   r   rh   rQ   rO   r   r     s    F&&9="HX$6=NR!8HS)D/5I,J#KRNR!8HS)D/5I,J#KRTX'(3	$;O2P)QX$=~AMKKWrQ   r   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)rm   ro   _pos_chunksrl   c                 \    t         |   |       d | _        d| _        g | _        d| _        y )NrQ   r   )superrq   rm   ro   r   r   )rW   rl   	__class__s     rO   rq   z_AsyncRESPBase.__init__  s-    )**.	rQ   c                 F    d| _         | j                  j                          y )NrQ   )ro   r   clearrV   s    rO   _clearz_AsyncRESPBase._clear  s    rQ   c                     |j                   | _        | j                  t        t              |j                  | _        | j                          d| _        y)zCalled when the stream connectsNT)_readerr   r    r/   rm   r   
_connectedr[   s     rO   r]   z_AsyncRESPBase.on_connect  sB    !))<<!"@AA!))rQ   c                     d| _         y)z"Called when the stream disconnectsFN)r   rV   s    rO   rX   z_AsyncRESPBase.on_disconnect  s	    rQ   r   c                 "  K   | j                   st        d      | j                  ry	 t        d      4 d {    | j                  j                         cd d d       d {    S 7 /7 # 1 d {  7  sw Y   y xY w# t        $ r Y yw xY ww)NzBuffer is closed.Tr   F)r   OSErrorro   async_timeoutr   at_eofr   rV   s    rO   r   z#_AsyncRESPBase.can_read_destructive  s     -..<<	$Q' - -||**,- - - - - - - 		sy   %BB  A'B  A+B  !A)"B  &B'B  )B  +A=1A42A=9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)
r   rG   ro   r   readexactlyr   r    r/   r   r   )rW   r  wantendresulttaildatar   s           rO   _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   )ro   findr   r   readlineendswithr    r/   r   r   rG   )rW   foundr	  r
  r  s        rO   	_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+)r^   r_   r`   r{   r}   r   r   rq   r   r]   rX   r   r   r   r  r  __classcell__)r   s   @rO   r   r     s]    +)),UUI  	D 	# % ( rQ   r   )\loggingsysabcr   asyncior   r   r   typingr   r   r	   r
   r   r   redis.maint_notificationsr   r   r   r   r   r   r   r   redis.utilsr   version_infomajorminorr   r  
exceptionsr   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   encodersr.   socketr/   r0   ra   rc   rd   rb   re   rf   	getLoggerr^   r   r2   rj   r}   r   r   r   _MIGRATING_MESSAGE_MIGRATED_MESSAGE_FAILING_OVER_MESSAGE_FAILED_OVER_MESSAGEr   r   r   r   r   r   r   r   r   rI   strtupletyper   r   r   r   rh   rQ   rO   <module>r)     sE    
  C C G G	 	 	 !Q3#3#3#9#9R#?06    (    @P N #T     ':0C   !:   
		8	$4$ 4$n ?
  ?F$j $$D; D;N %    & $ "      !&BB  &FF #&BB "&FF &77 $&FF #&JJ3 .tt+,h6	770 DYWh YWx[W8 [W|L_ LrQ   