U
    hy                     @   sD  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rbe jjdkrbd 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" 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 deZ.G dd de.Z/G dd de.Z0G dd de0Z1dS )    N)ABC)IncompleteReadErrorStreamReaderTimeoutError)ListOptionalUnion      )timeout   )AskErrorAuthenticationError$AuthenticationWrongNumberOfArgsErrorBusyLoadingErrorClusterCrossSlotErrorClusterDownErrorConnectionErrorExecAbortError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 setc                   @   sp   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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krT|t|d d }| j| }t|trL||t}||S t|S )zParse an error response r   r    N)splitEXCEPTION_CLASSESlen
isinstancedictgetr   )clsresponseZ
error_codeZexception_class r/   7/tmp/pip-unpacked-wheel-4avdqdik/redis/_parsers/base.pyparse_errorY   s    


zBaseParser.parse_errorc                 C   s
   t  d S NNotImplementedErrorselfr/   r/   r0   on_disconnecte   s    zBaseParser.on_disconnectc                 C   s
   t  d S r2   r3   r6   
connectionr/   r/   r0   
on_connecth   s    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_ERRORr   r   r   r   r   r   r   r   r   r   r   r   r(   classmethodr1   r7   r:   r/   r/   r/   r0   r$   6   sL         "
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 r2   )socket_read_sizeencoder_sock_bufferr6   rE   r/   r/   r0   __init__o   s    z_RESPBase.__init__c                 C   s&   z|    W n tk
r    Y nX d S r2   )r7   	Exceptionr5   r/   r/   r0   __del__u   s    z_RESPBase.__del__c                 C   s(   |j | _ t| j | j|j| _|j| _dS )zCalled when the socket connectsN)rG   r#   rE   socket_timeoutrH   rF   r8   r/   r/   r0   r:   {   s      z_RESPBase.on_connectc                 C   s*   d| _ | jdk	r | j  d| _d| _dS )z"Called when the socket disconnectsN)rG   rH   closerF   r5   r/   r/   r0   r7      s
    

z_RESPBase.on_disconnectc                 C   s   | j o| j |S r2   )rH   can_read)r6   r   r/   r/   r0   rO      s    z_RESPBase.can_readN)	r;   r<   r=   __doc__rJ   rL   r:   r7   rO   r/   r/   r/   r0   rD   l   s   rD   c                   @   sR   e Zd ZdZdZedddZedddZdee	e
ed
ee
 f dddZd
S )AsyncBaseParserz5Base parsing class for the python-backed async parser_stream
_read_sizerE   c                 C   s   d | _ || _d S r2   rR   rI   r/   r/   r0   rJ      s    zAsyncBaseParser.__init__returnc                    s
   t  d S r2   r3   r5   r/   r/   r0   can_read_destructive   s    z$AsyncBaseParser.can_read_destructiveFN)disable_decodingrW   c                    s
   t  d S r2   r3   )r6   rY   r/   r/   r0   read_response   s    zAsyncBaseParser.read_response)F)r;   r<   r=   rP   	__slots__intrJ   boolrX   r   r   r   r   rZ   r/   r/   r/   r0   rQ      s    rQ   c                       st   e Zd ZdZejd Zed fddZdd Zdd	 Z	d
d Z
edddZeedddZedddZ  ZS )_AsyncRESPBasez!Base class for async resp parsing)rF   rH   _pos_chunksrU   c                    s(   t  | d | _d| _g | _d| _d S )N    r   )superrJ   rF   rH   r`   r_   rI   	__class__r/   r0   rJ      s
    z_AsyncRESPBase.__init__c                 C   s   d| _ | j  d S )Nra   )rH   r`   clearr5   r/   r/   r0   _clear   s    z_AsyncRESPBase._clearc                 C   s4   |j | _| jdkrtd|j| _|   d| _dS )zCalled when the stream connectsNBuffer is closed.T)Z_readerrS   r   rF   rf   
_connectedr8   r/   r/   r0   r:      s    
z_AsyncRESPBase.on_connectc                 C   s
   d| _ dS )z"Called when the stream disconnectsFN)rh   r5   r/   r/   r0   r7      s    z_AsyncRESPBase.on_disconnectrV   c                    st   | j std| jrdS z@td4 I d H   | j W  5 Q I d H R  W S Q I d H R X W n tk
rn   Y dS X d S )Nrg   Tr   F)rh   r   rH   async_timeoutrS   Zat_eofr   r5   r/   r/   r0   rX      s    .z#_AsyncRESPBase.can_read_destructive)lengthrW   c              
      s   |d }| j | }t| j|kr6| j| j |d  }nx| j| j d }z| j|t| I dH }W n, tk
r } ztt|W 5 d}~X Y nX || 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_   r)   rH   rS   Zreadexactlyr   r   r"   r`   append)r6   rj   Zwantendresulttaildataerrorr/   r/   r0   _read   s    
z_AsyncRESPBase._readc                    s   | j d| j}|dkr*| j | j| }nN| 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   Nrk   r   )rH   findr_   rS   readlineendswithr   r"   r`   rl   r)   )r6   foundrn   ro   rp   r/   r/   r0   	_readline   s    
z_AsyncRESPBase._readline)r;   r<   r=   rP   rQ   r[   r\   rJ   rf   r:   r7   r]   rX   bytesrr   rw   __classcell__r/   r/   rc   r0   r^      s   
	r^   )2sysabcr   Zasyncior   r   r   typingr   r   r   version_infomajorminorr   ri   
exceptionsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   encodersr!   socketr"   r#   r>   r@   rA   r?   rB   r$   rD   rQ   r^   r/   r/   r/   r0   <module>   s,   P

6#