
    j                         d dl mZ d dlmZ d dlmZ ddlmZ  ed          Z G d de          Z	 G d	 d
          Z
dS )    )
MutableSet)	getLogger)perf_counter   )Addressneo4jc                   \    e Zd ZddZd Zd Zd Zd Zd Zd Z	d	 Z
d
 Zd ZddZddZdS )
OrderedSet c                 R    t                               |          | _        d | _        d S N)dictfromkeys	_elements_currentselfelementss     X/lsinfo/ai/hellotax_ai/base_platform/venv/lib/python3.11/site-packages/neo4j/_routing.py__init__zOrderedSet.__init__   s     x00    c                 b    dd                     t          t          | j                            z  S )Nz{%s}z, )joinmapreprr   r   s    r   __repr__zOrderedSet.__repr__"   s%    		#dDN";";<<<<r   c                     || j         v S r   r   r   elements     r   __contains__zOrderedSet.__contains__%   s    $.((r   c                 *    t          | j                  S r   )iterr   r   s    r   __iter__zOrderedSet.__iter__(   s    DN###r   c                 *    t          | j                  S r   )lenr   r   s    r   __len__zOrderedSet.__len__+   s    4>"""r   c                 Z    t          | j                                                  |         S r   )listr   keys)r   indexs     r   __getitem__zOrderedSet.__getitem__.   s#    DN''))**511r   c                     d | j         |<   d S r   r   r    s     r   addzOrderedSet.add1   s    "&wr   c                 8    | j                                          d S r   )r   clearr   s    r   r1   zOrderedSet.clear4   s    r   c                 :    	 | j         |= d S # t          $ r Y d S w xY wr   )r   KeyErrorr    s     r   discardzOrderedSet.discard7   s9    	w''' 	 	 	DD	s    
c                 T    	 | j         |= d S # t          $ r t          |          d w xY wr   )r   r3   
ValueErrorr    s     r   removezOrderedSet.remove=   sB    	0w''' 	0 	0 	0W%%4/	0s    'c                 j    | j                             t                              |                     d S r   )r   updater   r   r   s     r   r9   zOrderedSet.updateC   s*    dmmH5566666r   c                     | j         }|                                 |                    t                              |                     d S r   )r   r1   r9   r   r   )r   r   es      r   replacezOrderedSet.replaceF   s:    N					x(()))))r   N)r   )__name__
__module____qualname__r   r   r"   r%   r(   r-   r/   r1   r4   r7   r9   r<   r   r   r   r
   r
      s           
= = =) ) )$ $ $# # #2 2 2' ' '    0 0 07 7 7 7* * * * * *r   r
   c                   \    e Zd Zed             ZddddddZd Zd Zdd	Zd
 Z	d Z
d ZdS )RoutingTablec                   g }g }g }	 |D ]}|d         }g }	|d         D ]+}
|	                     t          j        |
d                     ,|dk    r|                    |	           \|dk    r|                    |	           x|dk    r|                    |	           	  | |||||          S # t          t
          f$ r}t          d	          |d
}~ww xY w)zl Parse the records returned from the procedure call and
        return a new RoutingTable instance.
        role	addressesi  )default_portROUTEREADWRITE)databaseroutersreaderswritersttlzCannot parse routing infoN)appendr   parseextendr3   	TypeErrorr6   )clsrI   serversrM   rJ   rK   rL   serverrC   rD   addressexcs               r   parse_routing_infozRoutingTable.parse_routing_infoN   s)   
 	f! 
. 
.f~	%k2 P PG$$W]7%N%N%NOOOO7??NN9----V^^NN9----W__NN9---
. 3'7T[adeeee )$ 	C 	C 	C899sB	Cs   BB/ /C CCr   r   )rJ   rK   rL   rM   c                   t          |          | _        t          |          | _        t          |          | _        t          |          | _        | j         | _        t                      | _        || _        || _	        d S r   )
r
   initial_routersrJ   rK   rL   initialized_without_writersr   last_updated_timerM   rI   )r   rI   rJ   rK   rL   rM   s         r   r   zRoutingTable.__init__g   sj    )'22!'**!'**!'**/3|+;(!- r   c                 h    d| j         d| j        d| j        d| j        d| j        d| j        dS )NzRoutingTable(database=z	 routers=z
, readers=z
, writers=z, last_updated_time=z, ttl=))rI   rJ   rK   rL   r[   rM   r   s    r   r   zRoutingTable.__repr__q   sG     MMMLLLLLLLLL"""HHH
 	
r   c                 8    || j         v p|| j        v p|| j        v S r   )rJ   rK   rL   )r   rU   s     r   r"   zRoutingTable.__contains__{   s)    $,&\'T\*A\WPTP\E\\r   Fc                 (   t          |t                    sJ | j        | j        z   t	                      k    }|rt          | j                  }nt          | j                  }| o| j        o|}t          	                    d|||| j        |           |S )zD Indicator for whether routing information is still usable.
        z~[#0000]  _: <ROUTING> checking table freshness (readonly=%r): table expired=%r, has_server_for_mode=%r, table routers=%r => %r)

isinstanceboolr[   rM   r   rK   rL   rJ   logdebug)r   readonlyexpiredhas_server_for_moderess        r   is_freshzRoutingTable.is_fresh~   s     (D)))))(483|~~E 	5"&t|"4"4"&t|"4"4kBdlB/B		 C G%8$,	M 	M 	M 
r   c                     ddl m} t                      }| j        | j        z   |j        z   |k    }t                              d| j        | j        ||           |S )z Check if the routing table is stale and not used for a long time and should be removed from memory.

        :returns: Returns true if it is old and not used for a while.
        :rtype: bool
        r   )RoutingConfigzS[#0000]  _: <ROUTING> purge check: last_updated_time=%r, ttl=%r, perf_time=%r => %r)_confrj   r   r[   rM   routing_table_purge_delayrb   rc   )r   rj   	perf_timerg   s       r   should_be_purged_from_memoryz)RoutingTable.should_be_purged_from_memory   sp     	)((((( NN	$tx/-2YY]ff		 E($(Is	D 	D 	D 
r   c                 N   | j                             |j                    | j                            |j                   | j                            |j                   | j         | _        t                      | _        |j        | _        t          	                    d|            dS )zi Update the current routing table with new routing information
        from a replacement table.
        z&[#0000]  _: <ROUTING> updated table=%rN)
rJ   r<   rK   rL   rZ   r   r[   rM   rb   rc   )r   new_routing_tables     r   r9   zRoutingTable.update   s     	.6777.6777.6777/3|+;(!-$(		:DAAAAAr   c                 ~    t          | j                  t          | j                  z  t          | j                  z  S r   )setrJ   rL   rK   r   s    r   rS   zRoutingTable.servers   s0    4<  3t|#4#44s4<7H7HHHr   N)F)r=   r>   r?   classmethodrW   r   r   r"   rh   rn   r9   rS   r   r   r   rA   rA   L   s        f f [f0 -/BA ! ! ! ! !
 
 
] ] ]      
B 
B 
BI I I I Ir   rA   N)collections.abcr   loggingr   timer   
addressingr   rb   r
   rA   r   r   r   <module>rx      s   " ' & & & & &                   i.* .* .* .* .* .* .* .*b]I ]I ]I ]I ]I ]I ]I ]I ]I ]Ir   