B
    ß%Q[37  ã               @   sÂ   d Z ddlmZmZ ddlmZ ddlmZ ddl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 dd
lmZ ddlmZmZmZmZmZ e
eegZG dd„ deƒZG dd„ deƒZdS )Ú
é    )ÚdatetimeÚMINYEAR)Úlinesep)Úrandint)Úsleepé   )ÚFIRSTÚROUND_ROBINÚRANDOMÚSEQUENCE_TYPESÚSTRING_TYPESÚget_config_parameteré   )ÚLDAPUnknownStrategyErrorÚLDAPServerPoolErrorÚLDAPServerPoolExhaustedError)ÚServer)ÚlogÚlog_enabledÚERRORÚBASICÚNETWORKc               @   sL   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚServerPoolStatec             C   sD   g | _ |j| _|| _d| _|  ¡  t ¡ | _tt	ƒr@t
t	d| ƒ d S )Nr   z"instantiated ServerPoolState: <%r>)ÚserversÚstrategyÚserver_poolÚlast_used_serverÚrefreshr   ÚnowZinitialize_timer   r   r   )Úselfr   © r!   úUC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6i93dh7p\ldap3\ldap3\core\pooling.pyÚ__init__(   s    
zServerPoolState.__init__c             C   s„   dt  }| jr4x0| jD ]}|t|d ƒt  7 }qW n|dt  7 }|dt| jƒ t  7 }|d| jdkrhdnt| j| j d ƒ 7 }|S )Nz	servers: r   ÚNonezPool strategy: z - Last used server: éÿÿÿÿ)r   r   Ústrr   r   )r    ÚsÚserverr!   r!   r"   Ú__str__3   s    *zServerPoolState.__str__c             C   sL   g | _ x*| jj D ]}| j  |ttddƒdg¡ qW tdt| j ƒd ƒ| _d S )Nr   Tr   )r   r   Úappendr   r   r   Úlenr   )r    r(   r!   r!   r"   r   ?   s    zServerPoolState.refreshc             C   s   | j | j d S )Nr   )r   r   )r    r!   r!   r"   Úget_current_serverE   s    z"ServerPoolState.get_current_serverc             C   s"  | j �r | jjtkr4| jjr,| jdd�| _qÚd| _n¦| jjtkr‚| jjr\|  | jd ¡| _qÚ| jd t| j ƒk rz| jd nd| _nX| jjt	krº| jjr¢|  
¡ | _qÚtdt| j ƒd ƒ| _n ttƒrÒttd| jjƒ tdƒ‚ttƒrðttd| jƒ | j | j d S ttƒ�rttd| ƒ tdƒ‚d S )	Nr   )Ústartingr   z$unknown server pooling strategy <%s>zunknown server pooling strategyz&server returned from Server Pool: <%s>zno servers in Server Pool <%s>zno servers in server pool)r   r   r   r	   ÚactiveÚfind_active_serverr   r
   r+   r   Úfind_active_random_serverr   r   r   r   r   r   r   )r    r!   r!   r"   Ú
get_serverH   s,    &
zServerPoolState.get_serverc             C   sL  | j j}�x|�r(ttƒr&ttd| ƒ | jd d … }xÚ|�r| tdt|ƒd ƒ¡}|d s¾t	| j j
tƒrr| j j
sŒt ¡ |d  j| j j
k r¦ttƒr6ttd|d ƒ q6ttƒr¾ttd|d ƒ t ¡ |d< ttƒrâttd|d ƒ |d  ¡ �rd|d< | j |¡S d	|d< q6W t	| j jtƒs|d8 }qW ttƒ�r@ttd
| ƒ tdƒ‚d S )Nz4entering loop for finding active server in pool <%s>r   r   r   z8server <%s> excluded from checking because it is offlinezserver <%s> reinserted in poolz%checking server <%s> for availabilityTFzSno random active server available in Server Pool <%s> after maximum number of trieszNno random active server available in server pool after maximum number of tries)r   r.   r   r   r   r   Úpopr   r+   Ú
isinstanceÚexhaustÚboolr   r   ÚsecondsÚcheck_availabilityÚindexr   r   )r    ÚcounterZ	temp_listr(   r!   r!   r"   r0   j   s4    
0
z)ServerPoolState.find_active_random_serverc             C   s  t dƒ}| jj}|t| jƒkr"d}�xÖ|�rúttƒrBttd|| ƒ d}t| jƒ}�xn||d k �rÀ|d7 }|| |k r~|| n
|| | }| j| d �sXt| jj	t
ƒr°| jj	sÒt ¡ | j| d  j| jj	k �r8ttƒrTt| jj	t
ƒ�rttd| j| d ƒ qTttd| j| d | jj	t ¡ | j| d  j ƒ qTttƒ�rXttd	| j| d ƒ t ¡ | j| d< ttƒ�rŠttd
| j| d ƒ | j| d  ¡ �r°d| j| d< |S d| j| d< qTW t| jjt
ƒ�sÚ|d8 }ttƒ�rðttd|ƒ t|ƒ q&W ttƒ�rttd| ƒ tdƒ‚d S )NZPOOLING_LOOP_TIMEOUTr   z@entering loop number <%s> for finding active server in pool <%s>r%   r   r   z5server <%s> excluded from checking because is offlinezDserver <%s> excluded from checking because is offline for %d secondszserver <%s> reinserted in poolz%checking server <%s> for availabilityTFz9waiting for %d seconds before retrying pool servers cyclezLno active server available in Server Pool <%s> after maximum number of trieszGno active server available in server pool after maximum number of tries)r   r   r.   r+   r   r   r   r   r3   r4   r5   r   r   r6   r7   r   r   r   )r    r-   Zconf_pool_timeoutr9   r8   Z	pool_sizeÚoffsetr!   r!   r"   r/   Š   sH    

 84



z"ServerPoolState.find_active_serverc             C   s
   t | jƒS )N)r+   r   )r    r!   r!   r"   Ú__len__µ   s    zServerPoolState.__len__N)Ú__name__Ú
__module__Ú__qualname__r#   r)   r   r,   r1   r0   r/   r;   r!   r!   r!   r"   r   '   s   " +r   c               @   sn   e Zd Zdeddfdd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )Ú
ServerPoolNTFc             C   s²   |t kr$ttƒrttd|ƒ tdƒ‚|rF|sFttƒr>ttdƒ tdƒ‚g | _tƒ | _|| _	|| _
t|ttf ƒr||  |¡ nt|tƒr”|  t|ƒ¡ || _ttƒr®ttd| ƒ d S )Nzunknown pooling strategy <%s>zunknown pooling strategyz3cannot instantiate pool with exhaust and not activez<pools can be exhausted only when checking for active serverszinstantiated ServerPool: <%r>)ÚPOOLING_STRATEGIESr   r   r   r   r   r   ÚdictÚpool_statesr.   r4   r3   r   r   Úaddr   r   r   )r    r   Zpool_strategyr.   r4   r!   r!   r"   r#   º   s&    

zServerPool.__init__c             C   sŠ   dt  }| jr0x,| jD ]}|t|ƒt  7 }qW n|dt  7 }|dt| jƒ 7 }|d| jrbt| jƒnd 7 }|d| jr~t| jƒnd 7 }|S )Nz	servers: r$   zPool strategy: z - active: ÚFalsez - exhaust pool: )r   r   r&   r   r.   r4   )r    r'   r(   r!   r!   r"   r)   Õ   s    zServerPool.__str__c             C   s‚   d}| j rD|d7 }x| j D ]}|| ¡ d 7 }qW |d d… d }n|d7 }|d | ¡7 }|d | ¡7 }|d	 | ¡7 }|d
7 }|S )NzServerPool(servers=ú[z, éþÿÿÿú]r$   z, pool_strategy={0.strategy!r}z, active={0.active!r}z, exhaust={0.exhaust!r}ú))r   Ú__repr__Úformat)r    Úrr(   r!   r!   r"   rI   á   s    zServerPool.__repr__c             C   s
   t | jƒS )N)r+   r   )r    r!   r!   r"   r;   ñ   s    zServerPool.__len__c             C   s
   | j | S )N)r   )r    Úitemr!   r!   r"   Ú__getitem__ô   s    zServerPool.__getitem__c             C   s
   | j  ¡ S )N)r   Ú__iter__)r    r!   r!   r"   rN   ÷   s    zServerPool.__iter__c             C   sæ   t |tƒr"|| jkrÄ| j |¡ n¢t |tƒr>| j t|ƒ¡ n†t |tƒr¨xz|D ]T}t |tƒrj| j |¡ qNt |tƒr†| j t|ƒ¡ qNttƒršttd| ƒ t	dƒ‚qNW nttƒr¼ttd| ƒ t	dƒ‚x| j
D ]}| j
|  ¡  qÌW d S )Nz,element must be a server in Server Pool <%s>z%server in ServerPool must be a ServerzLserver must be a Server of a list of Servers when adding to Server Pool <%s>z+server must be a Server or a list of Server)r3   r   r   r*   r   r   r   r   r   r   rB   r   )r    r   r(   Ú
connectionr!   r!   r"   rC   ú   s&    






zServerPool.addc             C   sX   || j kr| j  |¡ nttƒr.ttd|| ƒ tdƒ‚x| jD ]}| j|  ¡  q>W d S )Nz/server %s to be removed not in Server Pool <%s>zserver not in server pool)r   Úremover   r   r   r   rB   r   )r    r(   rO   r!   r!   r"   rP     s    
zServerPool.removec             C   s   t | ƒ}|| j|< d S )N)r   rB   )r    rO   Z
pool_stater!   r!   r"   Ú
initialize  s    zServerPool.initializec             C   s:   || j kr| j |  ¡ S ttƒr.ttd|| ƒ tdƒ‚d S )Nz-connection <%s> not in Server Pool State <%s>z!connection not in ServerPoolState)rB   r1   r   r   r   r   )r    rO   r!   r!   r"   r1   $  s
    
zServerPool.get_serverc             C   s:   || j kr| j |  ¡ S ttƒr.ttd|| ƒ tdƒ‚d S )Nz-connection <%s> not in Server Pool State <%s>z!connection not in ServerPoolState)rB   r,   r   r   r   r   )r    rO   r!   r!   r"   r,   ,  s
    
zServerPool.get_current_server)r<   r=   r>   r
   r#   r)   rI   r;   rM   rN   rC   rP   rQ   r1   r,   r!   r!   r!   r"   r?   ¹   s   r?   N) Ú__doc__r   r   Úosr   Úrandomr   Útimer   Ú r	   r
   r   r   r   r   Ú
exceptionsr   r   r   r(   r   Z	utils.logr   r   r   r   r   r@   Úobjectr   r?   r!   r!   r!   r"   Ú<module>   s    
 