o
    ßý°jÂ)  ã                   @   sX   d Z ddlmZmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
mZ G dd	„ d	eƒZd
S )Ú
é    )ÚdatetimeÚ	timedelta)Úlinesepé   )ÚLDAPMetricsErroré   )ÚlogÚlog_enabledÚERRORÚBASICc                   @   sf   e Zd 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d„Zdd„ Zedd„ ƒZdS )ÚConnectionUsagez0
    Collect statistics on connection usage
    c                 C   sª   d| _ d| _d| _d| _d| _d| _d| _d| _d| _d| _	d| _
d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _ttƒrSttdƒ d S d S )Nr   zreset usage metrics)Úopen_socketsÚclosed_socketsÚwrapped_socketsÚbytes_transmittedÚbytes_receivedÚmessages_transmittedÚmessages_receivedÚ
operationsÚabandon_operationsÚadd_operationsÚbind_operationsÚcompare_operationsÚdelete_operationsÚextended_operationsÚmodify_operationsÚmodify_dn_operationsÚsearch_operationsÚunbind_operationsÚreferrals_receivedÚreferrals_followedÚreferrals_connectionsÚrestartable_failuresÚrestartable_successesÚservers_from_poolr
   r   r	   ©Úself© r(   úƒ/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/ldap3/core/usage.pyÚreset&   s6   ÿzConnectionUsage.resetc                 C   sÈ   d | _ d | _d | _d | _d | _d| _d| _d| _d| _d| _	d| _
d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _ttƒrbttdƒ d S d S )Nr   zinstantiated Usage object) Úinitial_connection_start_timeÚopen_socket_start_timeÚconnection_stop_timeÚlast_transmitted_timeÚlast_received_timer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r
   r   r	   r&   r(   r(   r)   Ú__init__B   s@   ÿzConnectionUsage.__init__c                 C   sV  dt  }|dt| jƒ d t  7 }|d| jrt| j ¡ ƒnd t  7 }|d| jr/t| j ¡ ƒnd t  7 }|d| jrAt| j ¡ ƒnd t  7 }|d| jrSt| j ¡ ƒnd t  7 }|d	| jret| j ¡ ƒnd t  7 }|d
t  7 }|dt| j	ƒ t  7 }|dt| j
ƒ t  7 }|dt| jƒ t  7 }|dt| jƒ t  7 }|dt| j| j ƒ t  7 }|dt| jƒ t  7 }|dt| jƒ t  7 }|dt| j| j ƒ t  7 }|dt| jƒ t  7 }|dt| jƒ t  7 }|dt| jƒ t  7 }|dt| jƒ t  7 }|dt| jƒ t  7 }|dt| jƒ t  7 }|dt| jƒ t  7 }|dt| jƒ t  7 }|dt| jƒ t  7 }|dt| jƒ t  7 }|dt| jƒ t  7 }|dt| jƒ t  7 }|dt| jƒ t  7 }|dt  7 }|dt| jƒ t  7 }|dt| jƒ t  7 }|d t| jƒ t  7 }|d!t| j| j  ƒ t  7 }|d"t| jƒ t  7 }|d#t| j ƒ t  7 }|S )$NzConnection Usage:z  Time: [elapsed:          ú]z    Initial start time:    Ú z    Open socket time:      z    Last transmitted time: z    Last received time:    z    Close socket time:     z	  Server:z    Servers from pool:     z    Sockets open:          z    Sockets closed:        z    Sockets wrapped:       z  Bytes:                   z    Transmitted:           z    Received:              z  Messages:                z  Operations:              z    Abandon:               z    Bind:                  z    Add:                   z    Compare:               z    Delete:                z    Extended:              z    Modify:                z    ModifyDn:              z    Search:                z    Unbind:                z  Referrals:               z    Followed:              z    Connections:           z  Restartable tries:       z    Failed restarts:       z    Successful restarts:   )!r   ÚstrÚelapsed_timer+   Ú	isoformatr,   r.   r/   r-   r%   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   )r'   Úrr(   r(   r)   Ú__repr__d   sJ   $$$$$zConnectionUsage.__repr__c                 C   s   |   ¡ S )N)r7   r&   r(   r(   r)   Ú__str__‹   s   zConnectionUsage.__str__c                 C   s–  t |tƒs	tdƒ‚|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _|  j	|j	7  _	|  j
|j
7  _
|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _|  j|j7  _| S )Nz unable to add to ConnectionUsage)Ú
isinstancer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   )r'   Úotherr(   r(   r)   Ú__iadd__Ž   s6   
zConnectionUsage.__iadd__c                 C   s€  t  ¡ | _|  j|7  _|  jd7  _|  jd7  _|d dkr)|  jd7  _d S |d dkr8|  jd7  _d S |d dkrG|  jd7  _d S |d dkrV|  j	d7  _	d S |d dkre|  j
d7  _
d S |d dkrt|  jd7  _d S |d d	krƒ|  jd7  _d S |d d
kr’|  jd7  _d S |d dkr¡|  jd7  _d S |d dkr°|  jd7  _d S ttƒr¼ttd|d ƒ tdƒ‚)Nr   ÚtypeÚabandonRequestÚ
addRequestÚbindRequestÚcompareRequestÚ
delRequestÚextendedReqÚmodifyRequestÚmodDNRequestÚsearchRequestÚunbindRequestz5unable to collect usage for unknown message type <%s>z0unable to collect usage for unknown message type)r   Únowr.   r   r   r   r   r   r   r   r   r   r   r   r   r   r
   r   r	   r   )r'   ÚmessageÚlengthr(   r(   r)   Úupdate_transmitted_message¬   s6   
z*ConnectionUsage.update_transmitted_messagec                 C   s*   t  ¡ | _|  j|7  _|  jd7  _d S )Nr   )r   rG   r/   r   r   )r'   rI   r(   r(   r)   Úupdate_received_messageÊ   s   
z'ConnectionUsage.update_received_messageTc                 C   sD   |r|   ¡  t ¡ | _d | _| js| j| _ttƒr ttdƒ d S d S )Nzstart collecting usage metrics)	r*   r   rG   r,   r-   r+   r
   r   r	   )r'   r*   r(   r(   r)   ÚstartÏ   s   
ÿzConnectionUsage.startc                 C   s.   | j rt ¡ | _ttƒrttdƒ d S d S d S )Nzstop collecting usage metrics)r,   r   rG   r-   r
   r   r	   r&   r(   r(   r)   ÚstopÚ   s   
ýzConnectionUsage.stopc                 C   s.   | j r	| j | j S | jrt ¡ | j S tdƒS )Nr   )r-   r,   r   rG   r   r&   r(   r(   r)   r4   à   s   zConnectionUsage.elapsed_timeN)T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r*   r0   r7   r8   r;   rJ   rK   rL   rM   Úpropertyr4   r(   r(   r(   r)   r   !   s    "'
r   N)rQ   r   r   Úosr   Ú
exceptionsr   Ú	utils.logr	   r
   r   r   Úobjectr   r(   r(   r(   r)   Ú<module>   s    