o
    /i?                     @   s4  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 ejjdkrLejjdkrLd 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+m,Z,m-Z-m.Z. d	dlm/Z/ ddl0m1Z1 ddl2m3Z3m4Z4 dZ5dZ6dZ7dZ8eedZ9de$iZ:e ;e<Z=G dd deZ>G dd de>Z?G dd de>Z@G dd dZAdZBdZCdZDd ZEd!ZFd"ZGeDeEeFeGfZHeDeeAjIfeEeeAjJfeFeeAjIfeGeeAjJfeCeeAjKfiZLeMeNeOePe e
f f eQd#< G d$d% d%eZRG d&d' d'eZSG d(d) d)e@ZTdS )*    N)ABC)IncompleteReadErrorStreamReaderTimeoutError)	AwaitableCallableListOptionalProtocolUnion)MaintenanceNotificationNodeFailedOverNotificationNodeFailingOverNotificationNodeMigratedNotificationNodeMigratingNotificationNodeMovingNotification      )timeout   )AskErrorAuthenticationError$AuthenticationWrongNumberOfArgsErrorBusyLoadingErrorClusterCrossSlotErrorClusterDownErrorConnectionErrorExecAbortErrorExternalAuthProviderErrorMasterDownErrorModuleError
MovedErrorNoPermissionErrorNoScriptErrorOutOfMemoryErrorReadOnlyError
RedisError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)ERROOM	WRONGPASS	EXECABORTLOADINGNOSCRIPTREADONLYNOAUTHNOPERMASKTRYAGAINMOVEDCLUSTERDOWN	CROSSSLOT
MASTERDOWNc                 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 rI   S/var/www/html/flask_server/venv/lib/python3.10/site-packages/redis/_parsers/base.pyparse_errork   s   


zBaseParser.parse_errorc                 C      t  NNotImplementedErrorselfrI   rI   rJ   on_disconnectw      zBaseParser.on_disconnectc                 C   rL   rM   rN   rQ   
connectionrI   rI   rJ   
on_connectz   rS   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   r@   classmethodrK   rR   rV   rI   rI   rI   rJ   r.   G   sF    #
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 rM   )socket_read_sizeencoder_sock_bufferrQ   rb   rI   rI   rJ   __init__   s   
z_RESPBase.__init__c                 C   s$   z|    W d S  ty   Y d S w rM   )rR   	ExceptionrP   rI   rI   rJ   __del__   s
   z_RESPBase.__del__c                 C   s(   |j | _ t| j | j|j| _|j| _dS )zCalled when the socket connectsN)rd   r-   rb   socket_timeoutre   rc   rT   rI   rI   rJ   rV      s
   z_RESPBase.on_connectc                 C   s*   d| _ | jdur| j  d| _d| _dS )z"Called when the socket disconnectsN)rd   re   closerc   rP   rI   rI   rJ   rR      s
   


z_RESPBase.on_disconnectc                 C   s   | j o| j |S rM   )re   can_read)rQ   r   rI   rI   rJ   rl      s   z_RESPBase.can_readN)	rW   rX   rY   __doc__rg   ri   rV   rR   rl   rI   rI   rI   rJ   ra   ~   s    ra   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_sizerb   c                 C   s   d | _ || _d S rM   ro   rf   rI   rI   rJ   rg      s   
zAsyncBaseParser.__init__returnc                       t  rM   rN   rP   rI   rI   rJ   can_read_destructive   s   z$AsyncBaseParser.can_read_destructiveFdisable_decodingNc                    rs   rM   rN   )rQ   ru   rI   rI   rJ   read_response   s   zAsyncBaseParser.read_response)F)rW   rX   rY   rm   	__slots__intrg   boolrt   r   r)   r'   r   rv   rI   rI   rI   rJ   rn      s    rn   c                   @   s4   e Zd Z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 }| d }|||S )Nr*   r   rI   )rF   notification_typeidttlrI   rI   rJ   parse_maintenance_start_msg   s   
z:MaintenanceNotificationsParser.parse_maintenance_start_msgc                 C   s   | d }||S )Nr*   rI   )rF   r{   r|   rI   rI   rJ   parse_maintenance_completed_msg   s   z>MaintenanceNotificationsParser.parse_maintenance_completed_msgc                 C   sp   | d }| d }| d d u rd\}}n| d }t |tr | }|d\}}|d ur/t|nd }t||||S )Nr*   r   r   )NN:)rB   bytesdecoder?   rx   r   )rF   r|   r}   hostportvaluerI   rI   rJ   parse_moving_msg   s   

z/MaintenanceNotificationsParser.parse_moving_msgN)rW   rX   rY   rm   staticmethodr~   r   r   rI   rI   rI   rJ   rz      s    

rz   
invalidateMOVING	MIGRATINGMIGRATEDFAILING_OVERFAILED_OVER-MSG_TYPE_TO_MAINT_NOTIFICATION_PARSER_MAPPINGc                   @   sz   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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_funcc                 C   rL   )zHandle pubsub push responsesrN   rQ   rF   rI   rI   rJ   handle_pubsub_push_response  s   z3PushNotificationsParser.handle_pubsub_push_responsec              
   K   s  |d }t |tr| }|tgttR vr| |S zO|tkr*| jr*| |W S |tkrA| jrAt	| d }||}| |W S |tv rc| j
rft	| d }t	| d }|||}|d uri| 
|W 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 ({}): {}rB   r   r   _INVALIDATION_MESSAGE_MAINTENANCE_MESSAGES_MOVING_MESSAGEr   r   r   r   r   rh   loggererrorformatrQ   rF   kwargsmsg_typeparser_functionnotificationr{   erI   rI   rJ   handle_push_response  sf   


z,PushNotificationsParser.handle_push_responsec                 C   
   || _ d S rM   r   rQ   r   rI   rI   rJ   set_pubsub_push_handler5     
z/PushNotificationsParser.set_pubsub_push_handlerc                 C   r   rM   r   rQ   r   rI   rI   rJ   set_invalidation_push_handler8  r   z5PushNotificationsParser.set_invalidation_push_handlerc                 C   r   rM   r   rQ   r   rI   rI   rJ   set_node_moving_push_handler;  r   z4PushNotificationsParser.set_node_moving_push_handlerc                 C   r   rM   r   rQ   r   rI   rI   rJ   set_maintenance_push_handler>  r   z4PushNotificationsParser.set_maintenance_push_handler)rW   rX   rY   rm   r   __annotations__r   r	   r   r   r   r   r   r   r   r   rI   rI   rI   rJ   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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   c                    rs   )z+Handle pubsub push responses asynchronouslyrN   r   rI   rI   rJ   r   J  s   z8AsyncPushNotificationsParser.handle_pubsub_push_responsec              
      s>  |d }t |tr| }|tgttR vr | |I dH S za|tkr1| jr1| |I dH W S t |tr:| }|tkrT| jrTt	| d }||}| |I dH W S |tv ry| j
r|t	| d }t	| 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   rI   rI   rJ   r   N  sl   


z1AsyncPushNotificationsParser.handle_push_responsec                 C   
   || _ dS )z$Set the pubsub push handler functionNr   r   rI   rI   rJ   r        
z4AsyncPushNotificationsParser.set_pubsub_push_handlerc                 C   r   )z*Set the invalidation push handler functionNr   r   rI   rI   rJ   r     r   z:AsyncPushNotificationsParser.set_invalidation_push_handlerc                 C   r   rM   r   r   rI   rI   rJ   r     r   z9AsyncPushNotificationsParser.set_node_moving_push_handlerc                 C   r   rM   r   r   rI   rI   rJ   r     r   z9AsyncPushNotificationsParser.set_maintenance_push_handler)rW   rX   rY   rm   r   r   r   r	   r   r   r   r   r   r   r   r   r   rI   rI   rI   rJ   r   B  s   
 1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)rc   re   _pos_chunksrb   c                    s(   t  | d | _d| _g | _d| _d S )N    r   )superrg   rc   re   r   r   rf   	__class__rI   rJ   rg     s
   
z_AsyncRESPBase.__init__c                 C   s   d| _ | j  d S )Nr   )re   r   clearrP   rI   rI   rJ   _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)_readerrp   r&   rc   r   
_connectedrT   rI   rI   rJ   rV     s   

z_AsyncRESPBase.on_connectc                 C   s
   d| _ dS )z"Called when the stream disconnectsFN)r   rP   rI   rI   rJ   rR     r   z_AsyncRESPBase.on_disconnectrr   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 )Nr   Tr   F)r   r&   re   async_timeoutrp   at_eofr   rP   rI   rI   rJ   rt     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   rA   re   rp   readexactlyr   r   r,   r   append)rQ   r   wantendresulttaildatar   rI   rI   rJ   _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   )re   findr   rp   readlineendswithr   r,   r   r   rA   )rQ   foundr   r   r   rI   rI   rJ   	_readline  s   
z_AsyncRESPBase._readline)rW   rX   rY   rm   rn   rw   rx   rg   r   rV   rR   ry   rt   r   r   r   __classcell__rI   rI   r   rJ   r     s    
	r   )Uloggingsysabcr   asyncior   r   r   typingr   r   r   r	   r
   r   redis.maint_notificationsr   r   r   r   r   r   version_infomajorminorr   r   
exceptionsr   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   encodersr+   socketr,   r-   rZ   r\   r]   r[   r^   r_   	getLoggerrW   r   r.   ra   rn   rz   r   r   _MIGRATING_MESSAGE_MIGRATED_MESSAGE_FAILING_OVER_MESSAGE_FAILED_OVER_MESSAGEr   r~   r   r   r   rC   strtupletyper   r   r   r   rI   rI   rI   rJ   <module>   s   
   	T


7#!
FL