o
    iO                     @   sb  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jjdkrVejjdkrVd 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 >e?Z@G dd deZAG dd deAZBG dd deAZCG dd dZDdZEdZFd ZGd!ZHd"ZId#ZJd$ZKd%ZLeGeHeIeJeKfZMeGeeDjNfeHeeDjOfeIeeDjNfeJeeDjOfeFeeDjPfeKeeDjQfeLeeDjRfiZSeTeUeVeWe e
f f eXd&< G d'd( d(eZYG d)d* d*eZZG d+d, d,eCZ[dS )-    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                   @   st   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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)ZERRZOOMZ	WRONGPASSZ	EXECABORTZLOADINGZNOSCRIPTZREADONLYZNOAUTHZNOPERMZASKZTRYAGAINMOVEDZCLUSTERDOWNZ	CROSSSLOTZ
MASTERDOWNc                 C   s`   | dd }|| jv r,|t|d d }| j| }t|tr&||t}|||dS t|S )zParse an error response r   r,   N)status_code)splitEXCEPTION_CLASSESlen
isinstancedictgetr)   )clsresponseZ
error_codeZexception_class r<   J/home/app/Keep/.python/lib/python3.10/site-packages/redis/_parsers/base.pyparse_errorm   s   


zBaseParser.parse_errorc                 C      t  NNotImplementedErrorselfr<   r<   r=   on_disconnecty      zBaseParser.on_disconnectc                 C   r?   r@   rA   rD   
connectionr<   r<   r=   
on_connect|   rF   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_ERROREXTERNAL_AUTH_PROVIDER_ERRORr'   r    r   r&   r(   r%   r   r*   r$   r   r   r"   r5   classmethodr>   rE   rI   r<   r<   r<   r=   r0   I   sF    #
r0   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 r@   )socket_read_sizeencoder_sock_bufferrD   rU   r<   r<   r=   __init__   s   
z_RESPBase.__init__c                 C   s$   z|    W d S  ty   Y d S w r@   )rE   	ExceptionrC   r<   r<   r=   __del__   s
   z_RESPBase.__del__c                 C   s(   |j | _ t| j | j|j| _|j| _dS )zCalled when the socket connectsN)rW   r/   rU   socket_timeoutrX   rV   rG   r<   r<   r=   rI      s
   z_RESPBase.on_connectc                 C   s*   d| _ | jdur| j  d| _d| _dS )z"Called when the socket disconnectsN)rW   rX   closerV   rC   r<   r<   r=   rE      s
   


z_RESPBase.on_disconnectc                 C   s   | j o| j |S r@   )rX   can_read)rD   r   r<   r<   r=   r_      s   z_RESPBase.can_readN)	rJ   rK   rL   __doc__rZ   r\   rI   rE   r_   r<   r<   r<   r=   rT      s    rT   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_sizerU   c                 C   s   d | _ || _d S r@   rb   rY   r<   r<   r=   rZ      s   
zAsyncBaseParser.__init__returnc                       t  r@   rA   rC   r<   r<   r=   can_read_destructive   s   z$AsyncBaseParser.can_read_destructiveFdisable_decodingNc                    rf   r@   rA   )rD   rh   r<   r<   r=   read_response   s   zAsyncBaseParser.read_response)F)rJ   rK   rL   r`   	__slots__intrZ   boolrg   r   r+   r)   r   ri   r<   r<   r<   r=   ra      s    ra   c                   @   sL   e Zd ZdZedd Zedd Zedd Zedd	 Zed
d Z	dS )MaintenanceNotificationsParserzEProtocol defining maintenance push notification parsing functionalityc                 C   s   | d }t | d }t||S Nr,   r   )r   r   )r;   idslotsr<   r<   r=   parse_oss_maintenance_start_msg   s   
z>MaintenanceNotificationsParser.parse_oss_maintenance_start_msgc           
      C   sh   | d }| d }i }|D ]"\}}}t |}t |}t |}	||vr%g ||< || ||	i qt||S rn   )r   appendr   )
r;   ro   Znodes_to_slots_mapping_dataZnodes_to_slots_mappingZsrc_nodeZ	dest_noderp   Zsrc_node_strZdest_node_strZ	slots_strr<   r<   r=   #parse_oss_maintenance_completed_msg   s   	
zBMaintenanceNotificationsParser.parse_oss_maintenance_completed_msgc                 C   s   | d }| d }|||S rn   r<   )r;   notification_typero   ttlr<   r<   r=   parse_maintenance_start_msg   s   
z:MaintenanceNotificationsParser.parse_maintenance_start_msgc                 C   s   | d }||S )Nr,   r<   )r;   rt   ro   r<   r<   r=   parse_maintenance_completed_msg   s   z>MaintenanceNotificationsParser.parse_maintenance_completed_msgc                 C   sb   | d }| d }| d d u rd\}}nt | d }|d\}}|d ur(t|nd }t||||S )Nr,   r   r   )NN:)r   r4   rk   r   )r;   ro   ru   hostportvaluer<   r<   r=   parse_moving_msg   s   
z/MaintenanceNotificationsParser.parse_moving_msgN)
rJ   rK   rL   r`   staticmethodrq   rs   rv   rw   r|   r<   r<   r<   r=   rm      s    


	
rm   Z
invalidateZMOVINGZ	MIGRATINGZMIGRATEDZFAILING_OVERZFAILED_OVERZ
SMIGRATINGZ	SMIGRATED-MSG_TYPE_TO_MAINT_NOTIFICATION_PARSER_MAPPINGc                   @   s   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d	 Zd
d Zdd Zdd Zdd Zdd Zdd ZdS )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                 C   r?   )zHandle pubsub push responsesrA   rD   r;   r<   r<   r=   handle_pubsub_push_response8  s   z3PushNotificationsParser.handle_pubsub_push_responsec              
   K   s  |d }t |tr| }|tgtttR vr| |S z|tkr,| jr,| |W S |tkrC| j	rCt
| d }||}| 	|W S |tv rn| jrnt
| d }|tkrY||}nt
| d }|||}|d urn| |W S |tkr| jsx| jrt
| d }||}|d ur| jr| | | jr| | W d S W d S W d S W d S W d S  ty } ztd||| W Y d }~d S d }~ww )Nr   r,   "Error handling {} message ({}): {}r7   bytesdecode_INVALIDATION_MESSAGE_MAINTENANCE_MESSAGES_MOVING_MESSAGE_SMIGRATED_MESSAGEr   r   r   r~   r   _SMIGRATING_MESSAGEr   r[   loggererrorformatrD   r;   kwargsmsg_typeZparser_functionZnotificationrt   er<   r<   r=   handle_push_response<  s   





z,PushNotificationsParser.handle_push_responsec                 C   
   || _ d S r@   r   rD   r   r<   r<   r=   set_pubsub_push_handler{     
z/PushNotificationsParser.set_pubsub_push_handlerc                 C   r   r@   r   rD   r   r<   r<   r=   set_invalidation_push_handler~  r   z5PushNotificationsParser.set_invalidation_push_handlerc                 C   r   r@   r   rD   r   r<   r<   r=   set_node_moving_push_handler  r   z4PushNotificationsParser.set_node_moving_push_handlerc                 C   r   r@   r   rD   r   r<   r<   r=   set_maintenance_push_handler  r   z4PushNotificationsParser.set_maintenance_push_handlerc                 C   r   r@   r   rD   r   r<   r<   r=   "set_oss_cluster_maint_push_handler  r   z:PushNotificationsParser.set_oss_cluster_maint_push_handler)rJ   rK   rL   r`   r   __annotations__r   r	   r   r   r   r   r   r   r   r   r   r   r<   r<   r<   r=   r   /  s   
 ?r   c                   @   s   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	d
 Zdd Zdd Zdd Zdd Zdd Zdd ZdS )AsyncPushNotificationsParserz<Protocol defining async RESP3-specific parsing functionalityr   Nr   .r   r   r   c                    rf   )z+Handle pubsub push responses asynchronouslyrA   r   r<   r<   r=   r     s   z8AsyncPushNotificationsParser.handle_pubsub_push_responsec              
      s  |d }t |tr| }|tgtttR vr"| |I dH S z|tkr3| jr3| |I dH W S t |tr<| }|tkrV| j	rVt
| d }||}| 	|I dH W S |tv r| jrt
| d }|tkrl||}nt
| d }|||}|dur| |I dH W S |tkr| jrt
| d }||}|dur| |I dH W S W dS W dS W dS  ty } ztd||| W Y d}~dS d}~ww )z$Handle push responses asynchronouslyr   Nr,   r   r   r   r<   r<   r=   r     s   



z1AsyncPushNotificationsParser.handle_push_responsec                 C   
   || _ dS )z$Set the pubsub push handler functionNr   r   r<   r<   r=   r        
z4AsyncPushNotificationsParser.set_pubsub_push_handlerc                 C   r   )z*Set the invalidation push handler functionNr   r   r<   r<   r=   r     r   z:AsyncPushNotificationsParser.set_invalidation_push_handlerc                 C   r   r@   r   r   r<   r<   r=   r     r   z9AsyncPushNotificationsParser.set_node_moving_push_handlerc                 C   r   r@   r   r   r<   r<   r=   r     r   z9AsyncPushNotificationsParser.set_maintenance_push_handlerc                 C   r   r@   r   r   r<   r<   r=   r     r   z?AsyncPushNotificationsParser.set_oss_cluster_maint_push_handler)rJ   rK   rL   r`   r   r   r   r	   r   r   r   r   r   r   r   r   r   r   r   r<   r<   r<   r=   r     s   
 ?r   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)rV   rX   _pos_chunksrU   c                    s(   t  | d | _d| _g | _d| _d S )N    r   )superrZ   rV   rX   r   r   rY   	__class__r<   r=   rZ     s
   
z_AsyncRESPBase.__init__c                 C   s   d| _ | j  d S )Nr   )rX   r   clearrC   r<   r<   r=   _clear  s   z_AsyncRESPBase._clearc                 C   s4   |j | _| jdu rtt|j| _|   d| _dS )zCalled when the stream connectsNT)_readerrc   r   r.   rV   r   
_connectedrG   r<   r<   r=   rI     s   

z_AsyncRESPBase.on_connectc                 C   s
   d| _ dS )z"Called when the stream disconnectsFN)r   rC   r<   r<   r=   rE     r   z_AsyncRESPBase.on_disconnectre   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 )NzBuffer is closed.Tr   F)r   OSErrorrX   async_timeoutrc   at_eofr   rC   r<   r<   r=   rg     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)
r   r6   rX   rc   readexactlyr   r   r.   r   rr   )rD   r   Zwantendresulttaildatar   r<   r<   r=   _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   Nr   r   )rX   findr   rc   readlineendswithr   r.   r   rr   r6   )rD   foundr   r   r   r<   r<   r=   	_readline%  s   
z_AsyncRESPBase._readline)rJ   rK   rL   r`   ra   rj   rk   rZ   r   rI   rE   rl   rg   r   r   r   __classcell__r<   r<   r   r=   r     s    
	r   )\loggingsysabcr   asyncior   r   r   typingr   r   r   r	   r
   r   Zredis.maint_notificationsr   r   r   r   r   r   r   r   Z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.   r/   rM   rO   rP   rN   rQ   rR   	getLoggerrJ   r   r0   rT   ra   rm   r   r   Z_MIGRATING_MESSAGEZ_MIGRATED_MESSAGEZ_FAILING_OVER_MESSAGEZ_FAILED_OVER_MESSAGEr   r   r   rv   rw   r|   rq   rs   r~   r8   strtupletyper   r   r   r   r<   r<   r<   r=   <module>   s   
  (
P


7#G"\^