Ë
    ojße  ã                   óN  — d Z ddlZddlZddlmZmZ ddl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 ddlmZ d	Z G d
„ d«      Z G d„ d«      Z G d„ d«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Zd„ Z eed e «       «        eed e «       «        G d„ d «      Z! G d!„ d"ejD                  «      Z# G d#„ d$ejD                  «      Z$ G d%„ d&«      Z% G d'„ d(e	«      Z& G d)„ d*«      Z' G d+„ d,ejD                  «      Z(y)-z&
Tests for twisted.enterprise.adbapi.
é    N)ÚDictÚOptional)Ú
ConnectionÚConnectionLostÚConnectionPoolÚTransaction)ÚdeferÚ
interfacesÚreactor)ÚFailure©ÚrequireModule)Úunittestz%
CREATE TABLE simple (
  x integer
)
c                   óà   — e Zd ZU dZi Zeeef   ed<    e	j                  ed«      €dZd„ Zd„ 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„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#y)ÚADBAPITestBasez,
    Test the asynchronous DB-API code.
    Úopenfun_calledNú5ADB-API requires threads, no way to test without themc                 óš   — | j                  «        | j                  | j                  ¬«      | _        | j                  j	                  «        y)zR
        Set up the database and create a connection pool pointing at it.
        )Ú
cp_openfunN)ÚstartDBÚmakePoolÚopenfunÚdbpoolÚstart©Úselfs    ú:/usr/lib/python3/dist-packages/twisted/test/test_adbapi.pyÚ
extraSetUpzADBAPITestBase.extraSetUp(   s3   € ð 	�‰ŒØ—m‘m¨t¯|©|�mÓ<ˆŒØ�‰×ÑÕó    c                 óŽ   ‡ — ‰ j                   j                  d«      }|j                  ˆ fd„«       |j                  ˆ fd„«       |S )NúDROP TABLE simplec                 ó8   •— ‰j                   j                  «       S ©N©r   Úclose©Úresr   s    €r   ú<lambda>z)ADBAPITestBase.tearDown.<locals>.<lambda>2   ó   ø€  $§+¡+×"3Ñ"3Ó"5€ r   c                 ó$   •— ‰j                  «       S r#   ©ÚstopDBr&   s    €r   r(   z)ADBAPITestBase.tearDown.<locals>.<lambda>3   ó   ø€  $§+¡+£-€ r   ©r   ÚrunOperationÚaddCallback©r   Úds   ` r   ÚtearDownzADBAPITestBase.tearDown0   ó7   ø€ Ø�K‰K×$Ñ$Ð%8Ó9ˆØ	�‰Ó5Ô6Ø	�‰Ó/Ô0Øˆr   c                 ó"   — d| j                   |<   y )NT)r   ©r   Úconns     r   r   zADBAPITestBase.openfun6   s   € Ø$(ˆ×Ñ˜DÒ!r   c                 óx   — |s| j                  | j                  «       y | j                  || j                  «       y r#   )Ú
assertTruer   ÚassertInr6   s     r   ÚcheckOpenfunCalledz!ADBAPITestBase.checkOpenfunCalled9   s+   € ÙØ�O‰O˜D×/Ñ/Õ0à�M‰M˜$ × 3Ñ 3Õ4r   c                 ó  ‡ — ‰ j                   j                  t        «      }‰ j                  r€|j	                  ‰ j
                  «       |j	                  ‰ j                  «       |j	                  ‰ j                  «       |j	                  ‰ j                  «       |j	                  ˆ fd„«       |j	                  ‰ j                  «       |j	                  ‰ j                  «       |j	                  ‰ j                  «       |j	                  ‰ j                  «       |j	                  ‰ j                  «       |j	                  ‰ j                  «       |j	                  ‰ j                  «       |j	                  ‰ j                   «       |S )Nc                 ó$   •— ‰j                  «       S r#   )ÚflushLoggedErrorsr&   s    €r   r(   z*ADBAPITestBase.test_pool.<locals>.<lambda>F   s   ø€  d×&<Ñ&<Ó&>€ r   )r   r/   Úsimple_table_schemaÚtest_failuresr0   Ú_testPool_1_1Ú_testPool_1_2Ú_testPool_1_3Ú_testPool_1_4Ú_testPool_2Ú_testPool_3Ú_testPool_4Ú_testPool_5Ú_testPool_6Ú_testPool_7Ú_testPool_8Ú_testPool_9r1   s   ` r   Ú	test_poolzADBAPITestBase.test_pool?   s  ø€ Ø�K‰K×$Ñ$Ô%8Ó9ˆØ×ÒØ�M‰M˜$×,Ñ,Ô-Ø�M‰M˜$×,Ñ,Ô-Ø�M‰M˜$×,Ñ,Ô-Ø�M‰M˜$×,Ñ,Ô-Ø�M‰MÓ>Ô?Ø	�‰�d×&Ñ&Ô'Ø	�‰�d×&Ñ&Ô'Ø	�‰�d×&Ñ&Ô'Ø	�‰�d×&Ñ&Ô'Ø	�‰�d×&Ñ&Ô'Ø	�‰�d×&Ñ&Ô'Ø	�‰�d×&Ñ&Ô'Ø	�‰�d×&Ñ&Ô'Øˆr   c                 óˆ   ‡ — t        j                  ‰ j                  j                  d«      }|j	                  ˆ fd„d„ «       |S )Núselect * from NOTABLEc                 ó&   •— ‰j                  d«      S ©Nzno exception©Úfailr&   s    €r   r(   z.ADBAPITestBase._testPool_1_1.<locals>.<lambda>S   ó   ø€  4§9¡9¨^Ó#<€ r   c                  ó   — y r#   © ©Úfs    r   r(   z.ADBAPITestBase._testPool_1_1.<locals>.<lambda>S   ó   � r   ©r	   ÚmaybeDeferredr   ÚrunQueryÚaddCallbacks©r   r'   r2   s   `  r   rA   zADBAPITestBase._testPool_1_1Q   s4   ø€ Ü×Ñ §¡× 4Ñ 4Ð6MÓNˆØ	�‰Ó<¹nÔMØˆr   c                 óˆ   ‡ — t        j                  ‰ j                  j                  d«      }|j	                  ˆ fd„d„ «       |S )Nzdeletexxx from NOTABLEc                 ó&   •— ‰j                  d«      S rQ   rR   r&   s    €r   r(   z.ADBAPITestBase._testPool_1_2.<locals>.<lambda>X   rT   r   c                  ó   — y r#   rV   rW   s    r   r(   z.ADBAPITestBase._testPool_1_2.<locals>.<lambda>X   rY   r   )r	   r[   r   r/   r]   r^   s   `  r   rB   zADBAPITestBase._testPool_1_2V   s4   ø€ Ü×Ñ §¡× 8Ñ 8Ð:RÓSˆØ	�‰Ó<¹nÔMØˆr   c                 óœ   ‡ — t        j                  ‰ j                  j                  ‰ j                  «      }|j                  ˆ fd„d„ «       |S )Nc                 ó&   •— ‰j                  d«      S rQ   rR   r&   s    €r   r(   z.ADBAPITestBase._testPool_1_3.<locals>.<lambda>]   rT   r   c                  ó   — y r#   rV   rW   s    r   r(   z.ADBAPITestBase._testPool_1_3.<locals>.<lambda>]   rY   r   )r	   r[   r   ÚrunInteractionÚbad_interactionr]   r^   s   `  r   rC   zADBAPITestBase._testPool_1_3[   s9   ø€ Ü×Ñ §¡× :Ñ :¸D×<PÑ<PÓQˆØ	�‰Ó<¹nÔMØˆr   c                 óœ   ‡ — t        j                  ‰ j                  j                  ‰ j                  «      }|j                  ˆ fd„d„ «       |S )Nc                 ó&   •— ‰j                  d«      S rQ   rR   r&   s    €r   r(   z.ADBAPITestBase._testPool_1_4.<locals>.<lambda>b   rT   r   c                  ó   — y r#   rV   rW   s    r   r(   z.ADBAPITestBase._testPool_1_4.<locals>.<lambda>b   rY   r   )r	   r[   r   ÚrunWithConnectionÚbad_withConnectionr]   r^   s   `  r   rD   zADBAPITestBase._testPool_1_4`   s9   ø€ Ü×Ñ §¡× =Ñ =¸t×?VÑ?VÓWˆØ	�‰Ó<¹nÔMØˆr   c                 ón   ‡ — d}‰ j                   j                  |«      }ˆ fd„}|j                  |«       |S )Núselect count(1) from simplec                 ón   •— ‰j                  t        | d   d   «      dk(  d«       ‰j                  «        y )Nr   zInteraction not rolled back)r9   Úintr;   ©Úrowr   s    €r   Ú_checkz*ADBAPITestBase._testPool_2.<locals>._checkj   s/   ø€ Ø�O‰OœC  A¡ q¡	›N¨aÑ/Ð1NÔOØ×#Ñ#Õ%r   ©r   r\   r0   ©r   r'   Úsqlr2   rr   s   `    r   rE   zADBAPITestBase._testPool_2e   s4   ø€ à+ˆØ�K‰K× Ñ  Ó%ˆô	&ð 	
�‰�fÔØˆr   c                 ó$  ‡ — d}g }t        ‰ j                  «      D ]1  }d|z  }|j                  ‰ j                  j	                  |«      «       Œ3 t        j                  |«      }ˆ fd„}|j                  |«       ˆ fd„}|j                  |«       |S )Nrm   z insert into simple(x) values(%d)c                 óB   •— d}‰j                   j                  |«      }|S )Núselect x from simple order by x)r   r\   )r'   ru   r2   r   s      €r   Ú_selectz+ADBAPITestBase._testPool_3.<locals>._selectz   s!   ø€ à3ˆCØ—‘×$Ñ$ SÓ)ˆAØˆHr   c                 ó  •— ‰j                  t        | «      ‰j                  k(  d«       t        ‰j                  «      D ]>  }‰j                  t        | |   «      dk(  d«       ‰j                  | |   d   |k(  d«       Œ@ y )NzWrong number of rowsé   úWrong size rowr   zValues not returned.)r9   ÚlenÚnum_iterationsÚrange)ÚrowsÚir   s     €r   rr   z*ADBAPITestBase._testPool_3.<locals>._check‚   st   ø€ Ø�O‰OœC ›I¨×)<Ñ)<Ñ<Ð>TÔUÜ˜4×.Ñ.Ó/ò I�Ø—‘¤ D¨¡G£°Ñ 1Ð3CÔDØ—‘  Q¡¨¡
¨a¡Ð1GÕHñIr   )r   r~   Úappendr   r/   r	   ÚgatherResultsr0   )r   r'   ru   Úinsertsr�   r2   ry   rr   s   `       r   rF   zADBAPITestBase._testPool_3q   sŠ   ø€ Ø+ˆØˆä�t×*Ñ*Ó+ò 	:ˆAØ4°qÑ8ˆCØ�N‰N˜4Ÿ;™;×3Ñ3°CÓ8Õ9ð	:ô ×Ñ Ó(ˆô	ð 	
�‰�gÔô	Ið 	
�‰�fÔàˆr   c                 óz   ‡ — ‰ j                   j                  ‰ j                  «      }|j                  ˆ fd„«       |S )Nc                 ó(   •— ‰j                  | d«      S ©NÚdone©ÚassertEqualr&   s    €r   r(   z,ADBAPITestBase._testPool_4.<locals>.<lambda>�   ó   ø€  $×"2Ñ"2°3¸Ó"?€ r   )r   re   Úinteractionr0   r^   s   `  r   rG   zADBAPITestBase._testPool_4Œ   s/   ø€ à�K‰K×&Ñ& t×'7Ñ'7Ó8ˆØ	�‰Ó?Ô@Øˆr   c                 óz   ‡ — ‰ j                   j                  ‰ j                  «      }|j                  ˆ fd„«       |S )Nc                 ó(   •— ‰j                  | d«      S r‡   r‰   r&   s    €r   r(   z,ADBAPITestBase._testPool_5.<locals>.<lambda>•   r‹   r   )r   rj   ÚwithConnectionr0   r^   s   `  r   rH   zADBAPITestBase._testPool_5’   s/   ø€ à�K‰K×)Ñ)¨$×*=Ñ*=Ó>ˆØ	�‰Ó?Ô@Øˆr   c                 óP   — | j                   j                  | j                  «      }|S r#   )r   rj   Úclose_withConnectionr^   s      r   rI   zADBAPITestBase._testPool_6˜   s!   € à�K‰K×)Ñ)¨$×*CÑ*CÓDˆØˆr   c                 óø   ‡ — g }t        ‰ j                  «      D ]1  }d|z  }|j                  ‰ j                  j	                  |«      «       Œ3 t        j                  |d¬«      }ˆ fd„}|j                  |«       |S )Nz!select x from simple where x = %dT©ÚfireOnOneErrbackc                 ó|   •— t        ‰j                  «      D ]#  }‰j                  | |   d   d   d   |k(  d«       Œ% y )Nr{   r   zValue not returned)r   r~   r9   )Úresultr�   r   s     €r   rr   z*ADBAPITestBase._testPool_7.<locals>._check¥   sD   ø€ Ü˜4×.Ñ.Ó/ò O�Ø—‘  q¡	¨!¡¨Q¡°Ñ 2°aÑ 7Ð9MÕNñOr   )r   r~   r‚   r   r\   r	   ÚDeferredListr0   )r   r'   Údsr�   ru   Údlistrr   s   `      r   rJ   zADBAPITestBase._testPool_7�   sv   ø€ àˆÜ�t×*Ñ*Ó+ò 	1ˆAØ5¸Ñ9ˆCØ�I‰I�d—k‘k×*Ñ*¨3Ó/Õ0ð	1ô ×"Ñ" 2¸Ô=ˆô	Oð 	×Ñ˜&Ô!Øˆr   c                 óÊ   — g }t        | j                  «      D ]1  }d|z  }|j                  | j                  j	                  |«      «       Œ3 t        j                  |d¬«      }|S )Nzdelete from simple where x = %dTr“   )r   r~   r‚   r   r/   r	   r—   )r   r'   r˜   r�   ru   r™   s         r   rK   zADBAPITestBase._testPool_8¬   s_   € àˆÜ�t×*Ñ*Ó+ò 	5ˆAØ3°aÑ7ˆCØ�I‰I�d—k‘k×.Ñ.¨sÓ3Õ4ð	5ô ×"Ñ" 2¸Ô=ˆØˆr   c                 ón   ‡ — d}‰ j                   j                  |«      }ˆ fd„}|j                  |«       |S )Nrm   c                 ón   •— ‰j                  t        | d   d   «      dk(  d«       ‰j                  «        y )Nr   z)Didn't successfully delete table contents)r9   ro   ÚcheckConnectrp   s    €r   rr   z*ADBAPITestBase._testPool_9.<locals>._checkº   s4   ø€ Ø�O‰OÜ�C˜‘F˜1‘I“ !Ñ#Ð%Pôð ×ÑÕr   rs   rt   s   `    r   rL   zADBAPITestBase._testPool_9µ   s4   ø€ à+ˆØ�K‰K× Ñ  Ó%ˆô	 ð 	
�‰�fÔØˆr   c                 ól  — | j                   j                  «       }| j                  |«       |j                  «       }|j	                  d«       |j	                  d«       |j                  «       }| j                  t        |«      d«       | j                  t        |d   «      d«       | j                  |d   d   d«       |j	                  d«       |j	                  d«       | j                  t        |j                  «       «      d«       |j                  «        | j                   j                  |«       y)z/Check the connect/disconnect synchronous calls.zinsert into simple(x) values(1)zselect x from simpler{   r   zdelete from simpleN)
r   Úconnectr;   ÚcursorÚexecuteÚfetchallrŠ   r}   r%   Ú
disconnect)r   r7   Úcursr'   s       r   r�   zADBAPITestBase.checkConnectÃ   sæ   € à�{‰{×"Ñ"Ó$ˆØ×Ñ Ô%Ø�{‰{‹}ˆØ�‰Ð6Ô7Ø�‰Ð+Ô,Ø�m‰m‹oˆØ×Ñœ˜S› 1Ô%Ø×Ñœ˜S ™V› aÔ(Ø×Ñ˜˜Q™ ™ AÔ&Ø�‰Ð)Ô*Ø�‰Ð+Ô,Ø×Ñœ˜TŸ]™]›_Ó-¨qÔ1Ø�
‰
ŒØ�‰×Ñ˜tÕ$r   c                 ó&  — |j                  d«       t        | j                  «      D ]H  }|j                  «       }| j	                  t        |«      dk(  d«       | j	                  |d   |k(  d«       ŒJ | j                  |j                  «       d«       y)Nrx   r{   r|   r   úValue not returned.zToo many rowsrˆ   )r¡   r   r~   Úfetchoner9   r}   ÚassertIsNone)r   Útransactionr�   rq   s       r   rŒ   zADBAPITestBase.interactionÔ   s‡   € Ø×ÑÐ=Ô>Ü�t×*Ñ*Ó+ò 	@ˆAØ×&Ñ&Ó(ˆCØ�O‰OœC ›H¨™MÐ+;Ô<Ø�O‰O˜C ™F a™KÐ)>Õ?ð	@ð 	×Ñ˜+×.Ñ.Ó0°/ÔBØr   c                 ó`   — | j                   r|j                  d«       |j                  d«       y )Nzinsert into simple(x) values(0)rO   )Úcan_rollbackr¡   )r   r©   s     r   rf   zADBAPITestBase.bad_interactionÝ   s)   € Ø×ÒØ×ÑÐ AÔBà×ÑÐ3Õ4r   c                 óT  — |j                  «       }	 |j                  d«       t        | j                  «      D ]H  }|j	                  «       }| j                  t        |«      dk(  d«       | j                  |d   |k(  d«       ŒJ 	 |j                  «        y# |j                  «        w xY w)Nrx   r{   r|   r   r¦   rˆ   )r    r¡   r   r~   r§   r9   r}   r%   )r   r7   r¤   r�   rq   s        r   r�   zADBAPITestBase.withConnectionã   s�   € Ø�{‰{‹}ˆð	Ø�L‰LÐ:Ô;Ü˜4×.Ñ.Ó/ò D�Ø—m‘m“o�Ø—‘¤ C£¨A¡Ð/?Ô@Ø—‘  A¡¨!¡Ð-BÕCñDð
 �J‰JŒLØøð �J‰J�Lús   ’A1B ÂB'c                 ó$   — |j                  «        y r#   )r%   r6   s     r   r‘   z#ADBAPITestBase.close_withConnectionï   s   € Ø�
‰
�r   c                 ó’   — |j                  «       }	 |j                  d«       |j                  «        y # |j                  «        w xY w)NrO   )r    r¡   r%   )r   r7   r¤   s      r   rk   z!ADBAPITestBase.bad_withConnectionò   s2   € Ø�{‰{‹}ˆð	Ø�L‰LÐ0Ô1à�J‰J�LøˆD�J‰J�Lús	   ’4 ´Ar#   )$Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   ÚobjectÚboolÚ__annotations__r
   ÚIReactorThreadsr   Úskipr   r3   r   r;   rM   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   r�   rŒ   rf   r�   r‘   rk   rV   r   r   r   r      s©   … ñð *,€N�D˜ ˜Ñ&Ó+à!€z×!Ñ! '¨4Ó0Ð8ØFˆòòò)ó5òò$ò
ò
ò
ò

òò6òòò
òòò%ò"ò5ò
òór   r   c                   ój   — e Zd ZdZ ej
                  ed«      €dZd„ Zd„ Z	d„ Z
d„ Zd„ Zd	„ Zd
„ Zd„ Zy)ÚReconnectTestBasez;
    Test the asynchronous DB-API code with reconnect.
    Nr   c                 ó  — | j                   €t        j                  d«      ‚| j                  «        | j	                  dd| j                   ¬«      | _        | j
                  j                  «        | j
                  j                  t        «      S )z¹
        Skip the test if C{good_sql} is unavailable.  Otherwise, set up the
        database, create a connection pool pointed at it, and set up a simple
        schema in it.
        zno good sql for reconnect testr{   T)Úcp_maxÚcp_reconnectÚcp_good_sql)	Úgood_sqlr   ÚSkipTestr   r   r   r   r/   r?   r   s    r   r   zReconnectTestBase.extraSetUp  sq   € ð �=‰=Ð Ü×#Ñ#Ð$DÓEÐEØ�‰ŒØ—m‘mØ 4°T·]±]ð $ó 
ˆŒð 	�‰×ÑÔØ�{‰{×'Ñ'Ô(;Ó<Ð<r   c                 óŽ   ‡ — ‰ j                   j                  d«      }|j                  ˆ fd„«       |j                  ˆ fd„«       |S )Nr!   c                 ó8   •— ‰j                   j                  «       S r#   r$   r&   s    €r   r(   z,ReconnectTestBase.tearDown.<locals>.<lambda>  r)   r   c                 ó$   •— ‰j                  «       S r#   r+   r&   s    €r   r(   z,ReconnectTestBase.tearDown.<locals>.<lambda>  r-   r   r.   r1   s   ` r   r3   zReconnectTestBase.tearDown  r4   r   c                 óV  — t        j                  d «      }|j                  | j                  «       |j                  | j                  «       | j
                  s|j                  | j                  «       |j                  | j                  «       |j                  | j                  «       |S r#   )	r	   Úsucceedr0   Ú_testPool_1rE   Úearly_reconnectrF   rG   rH   r1   s     r   rM   zReconnectTestBase.test_pool  sx   € Ü�M‰M˜$ÓˆØ	�‰�d×&Ñ&Ô'Ø	�‰�d×&Ñ&Ô'Ø×#Ò#Ø�M‰M˜$×*Ñ*Ô+Ø	�‰�d×&Ñ&Ô'Ø	�‰�d×&Ñ&Ô'Øˆr   c                 ón   ‡ — d}‰ j                   j                  |«      }ˆ fd„}|j                  |«       |S )Nrm   c                 óN   •— ‰j                  t        | d   d   «      dk(  d«       y ©Nr   zTable not empty©r9   ro   rp   s    €r   rr   z-ReconnectTestBase._testPool_1.<locals>._check%  ó#   ø€ Ø�O‰OœC  A¡ q¡	›N¨aÑ/Ð1BÕCr   rs   rt   s   `    r   rÅ   zReconnectTestBase._testPool_1!  ó5   ø€ Ø+ˆØ�K‰K× Ñ  Ó%ˆô	Dð 	
�‰�fÔØˆr   c                 ó€   — t        | j                  j                  j                  «       «      d   j	                  «        y )Nr   )Úlistr   ÚconnectionsÚvaluesr%   )r   r'   s     r   rE   zReconnectTestBase._testPool_2+  s+   € äˆT�[‰[×$Ñ$×+Ñ+Ó-Ó.¨qÑ1×7Ñ7Õ9r   c                 óŒ   ‡ — d}t        j                  ‰ j                  j                  |«      }|j	                  ˆ fd„d„ «       |S )Nrm   c                 ó&   •— ‰j                  d«      S rQ   rR   r&   s    €r   r(   z/ReconnectTestBase._testPool_3.<locals>.<lambda>2  rT   r   c                  ó   — y r#   rV   rW   s    r   r(   z/ReconnectTestBase._testPool_3.<locals>.<lambda>2  rY   r   rZ   ©r   r'   ru   r2   s   `   r   rF   zReconnectTestBase._testPool_3/  s8   ø€ Ø+ˆÜ×Ñ §¡× 4Ñ 4°cÓ:ˆØ	�‰Ó<¹nÔMØˆr   c                 ón   ‡ — d}‰ j                   j                  |«      }ˆ fd„}|j                  |«       |S )Nrm   c                 óN   •— ‰j                  t        | d   d   «      dk(  d«       y rÉ   rÊ   rp   s    €r   rr   z-ReconnectTestBase._testPool_4.<locals>._check9  rË   r   rs   rt   s   `    r   rG   zReconnectTestBase._testPool_45  rÌ   r   c                 ó°   ‡ — ‰ j                  «        d}t        j                  ‰ j                  j                  |«      }|j                  ˆ fd„ˆ fd„«       |S )NrO   c                 ó&   •— ‰j                  d«      S rQ   rR   r&   s    €r   r(   z/ReconnectTestBase._testPool_5.<locals>.<lambda>D  s   ø€ ˜Ÿ	™	 .Ó1€ r   c                 óL   •— ‰j                  | j                  t        «      «      S r#   )ÚassertFalseÚcheckr   )rX   r   s    €r   r(   z/ReconnectTestBase._testPool_5.<locals>.<lambda>E  s   ø€ �d×&Ñ& q§w¡w¬~Ó'>Ó?€ r   )r>   r	   r[   r   r\   r]   rÔ   s   `   r   rH   zReconnectTestBase._testPool_5?  sI   ø€ Ø×ÑÔ Ø%ˆÜ×Ñ §¡× 4Ñ 4°cÓ:ˆØ	�‰Û1Û?ô	
ð ˆr   )r¯   r°   r±   r²   r
   r¶   r   r·   r   r3   rM   rÅ   rE   rF   rG   rH   rV   r   r   r¹   r¹   ú   sK   „ ñð "€z×!Ñ! '¨4Ó0Ð8ØFˆò=òòòò:òòór   r¹   c                   ó¢   — e Zd ZU dZdZee   ed<   dZdZ	dZ
dZdZdZdZdZdZej$                  Zee   ed<   dZdZdZd„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zy)ÚDBTestConnectora>  
    A class which knows how to test for the presence of
    and establish a connection to a relational database.

    To enable test cases  which use a central, system database,
    you must create a database named DB_NAME with a user DB_USER
    and password DB_PASS with full access rights to database DB_NAME.
    NÚTEST_PREFIXÚtwisted_testTr¾   é2   c                 óî   — | j                  «       | _        t        j                  | j                  «       | j	                  «       s"t        j                  d| j                  z  «      ‚| j                  «       S )Nz%s: Cannot access db)	ÚmktempÚDB_DIRÚosÚmkdirÚcan_connectr   r¿   rÞ   r   r   s    r   ÚsetUpzDBTestConnector.setUpi  sU   € Ø—k‘k“mˆŒÜ
�‰�—‘ÔØ×ÑÔ!Ü×#Ñ#Ð$:¸T×=MÑ=MÑ$MÓNÐNØ�‰Ó Ð r   c                 ó   — t        «       ‚)zXReturn true if this database is present on the system
        and can be used in a test.©ÚNotImplementedErrorr   s    r   ræ   zDBTestConnector.can_connectp  s   € ô "Ó#Ð#r   c                  ó   — y)z+Take any steps needed to bring database up.NrV   r   s    r   r   zDBTestConnector.startDBu  ó   € àr   c                  ó   — y)zBring database down, if needed.NrV   r   s    r   r,   zDBTestConnector.stopDBy  rì   r   c                 ó€   — | j                  «       \  }}|j                  «       }|j                  |«       t        |i |¤ŽS )z;Create a connection pool with additional keyword arguments.)ÚgetPoolArgsÚcopyÚupdater   )r   ÚnewkwÚargsÚkws       r   r   zDBTestConnector.makePool}  s;   € à×#Ñ#Ó%‰ˆˆbØ�W‰W‹YˆØ
�	‰	�%ÔÜ˜tÐ* rÑ*Ð*r   c                 ó   — t        «       ‚)z™Return a tuple (args, kw) of list and keyword arguments
        that need to be passed to ConnectionPool to create a connection
        to this database.ré   r   s    r   rï   zDBTestConnector.getPoolArgs„  s   € ô "Ó#Ð#r   )r¯   r°   r±   r²   rÞ   r   Ústrrµ   ÚDB_NAMEÚDB_USERÚDB_PASSrã   Únulls_okÚtrailing_spaces_okr«   r@   Úescape_slashesr   r¾   rÆ   Ú	can_clearr~   rç   ræ   r   r,   r   rï   rV   r   r   rÝ   rÝ   J  sˆ   … ñð "&€K�˜#‘Ó%à€GØ€GØ€Gà€Fà€HØÐØ€LØ€MØ€NØ,×5Ñ5€Hˆh�s‰mÓ5Ø€OØ€Ið €Nò!ò$ò
òò+ó$r   rÝ   c                   ó.   — e Zd ZdZdZdZdZd„ Zd„ Zd„ Z	y)	ÚSQLite3ConnectorzB
    Connector that uses the stdlib SQLite3 database support.
    ÚSQLite3Fr{   c                 ó   — t        d«      €yy)NÚsqlite3FTr   r   s    r   ræ   zSQLite3Connector.can_connect”  s   € Ü˜Ó#Ð+Øàr   c                 ó  — t         j                  j                  | j                  | j                  «      | _        t         j                  j                  | j
                  «      r t        j                  | j
                  «       y y r#   ©rä   ÚpathÚjoinrã   r÷   ÚdatabaseÚexistsÚunlinkr   s    r   r   zSQLite3Connector.startDBš  óI   € ÜŸ™Ÿ™ T§[¡[°$·,±,Ó?ˆŒÜ�7‰7�>‰>˜$Ÿ-™-Ô(Ü�I‰I�d—m‘mÕ$ð )r   c                 ó.   — d}| j                   dddœ}||fS )N)r  r{   F©r  r»   Úcheck_same_thread©r  ©r   ró   rô   s      r   rï   zSQLite3Connector.getPoolArgsŸ  s    € ØˆØŸ-™-°1È5ÑQˆØ�Rˆxˆr   N©
r¯   r°   r±   r²   rÞ   rü   r~   ræ   r   rï   rV   r   r   rÿ   rÿ   ‹  s'   „ ñð €KØ€NØ€Nòò%ó
r   rÿ   c                   ó.   — e Zd ZdZdZdZdZd„ Zd„ Zd„ Z	y)	ÚPySQLite2ConnectorzA
    Connector that uses pysqlite's SQLite database support.
    Ú	pysqlite2Fr{   c                 ó   — t        d«      €yy)Núpysqlite2.dbapi2FTr   r   s    r   ræ   zPySQLite2Connector.can_connect®  s   € ÜÐ+Ó,Ð4Øàr   c                 ó  — t         j                  j                  | j                  | j                  «      | _        t         j                  j                  | j
                  «      r t        j                  | j
                  «       y y r#   r  r   s    r   r   zPySQLite2Connector.startDB´  r
  r   c                 ó.   — d}| j                   dddœ}||fS )N)r  r{   Fr  r  r  s      r   rï   zPySQLite2Connector.getPoolArgs¹  s    € Ø$ˆØŸ-™-°1È5ÑQˆØ�Rˆxˆr   Nr  rV   r   r   r  r  ¥  s'   „ ñð €KØ€NØ€Nòò%ó
r   r  c                   ó   — e Zd ZdZd„ Zd„ Zy)ÚPyPgSQLConnectorÚPyPgSQLc                 óÔ   — 	 ddl m} 	 |j                  | j                  | j
                  | j                  ¬«      }|j                  «        y# t        $ r Y yw xY w# t        $ r Y yw xY w)Nr   )ÚPgSQLF©r  ÚuserÚpasswordT)ÚpyPgSQLr  ÚBaseExceptionrŸ   r÷   rø   rù   r%   )r   r  r7   s      r   ræ   zPyPgSQLConnector.can_connectÂ  sj   € ð	Ý%ð	Ø—=‘=ØŸ™¨D¯L©LÀ4Ç<Á<ð !ó ˆDð �J‰JŒLØøô ò 	Ùð	ûô ò 	Ùð	ús#   ‚A ‰AA Á	AÁAÁ	A'Á&A'c                 óX   — d}| j                   | j                  | j                  ddœ}||fS )N)zpyPgSQL.PgSQLr   ©r  r  r  Úcp_min©r÷   rø   rù   r  s      r   rï   zPyPgSQLConnector.getPoolArgsÐ  s1   € Ø!ˆàŸ™Ø—L‘LØŸ™Øñ	
ˆð �Rˆxˆr   N©r¯   r°   r±   rÞ   ræ   rï   rV   r   r   r  r  ¿  ó   „ Ø€Kòór   r  c                   ó   — e Zd ZdZd„ Zd„ Zy)ÚPsycopgConnectorÚPsycopgc                 óÐ   — 	 dd l }	 |j                  | j                  | j                  | j
                  ¬«      }|j                  «        y# t        $ r Y yw xY w# t        $ r Y yw xY w)Nr   Fr  T)Úpsycopgr!  rŸ   r÷   rø   rù   r%   )r   r,  r7   s      r   ræ   zPsycopgConnector.can_connectÞ  sj   € ð	Ûð	Ø—?‘?ØŸ™¨D¯L©LÀ4Ç<Á<ð #ó ˆDð �J‰JŒLØøô ò 	Ùð	ûô ò 	Ùð	úó#   ‚A
 ‡AA Á
	AÁAÁ	A%Á$A%c                 óX   — d}| j                   | j                  | j                  ddœ}||fS )N)r,  r   r#  r%  r  s      r   rï   zPsycopgConnector.getPoolArgsì  s1   € ØˆàŸ™Ø—L‘LØŸ™Øñ	
ˆð �Rˆxˆr   Nr&  rV   r   r   r)  r)  Û  r'  r   r)  c                   ó(   — e Zd ZdZdZdZdZd„ Zd„ Zy)ÚMySQLConnectorÚMySQLFc                 óÐ   — 	 dd l }	 |j                  | j                  | j                  | j
                  ¬«      }|j                  «        y# t        $ r Y yw xY w# t        $ r Y yw xY w)Nr   F©Údbr  ÚpasswdT)ÚMySQLdbr!  rŸ   r÷   rø   rù   r%   )r   r6  r7   s      r   ræ   zMySQLConnector.can_connectþ  sj   € ð	Ûð	Ø—?‘?Ø—<‘< d§l¡l¸4¿<¹<ð #ó ˆDð �J‰JŒLØøô ò 	Ùð	ûô ò 	Ùð	úr-  c                 óV   — d}| j                   | j                  | j                  dœ}||fS )N)r6  r3  r%  r  s      r   rï   zMySQLConnector.getPoolArgs  s(   € ØˆØ—L‘L¨$¯,©,À$Ç,Á,ÑOˆØ�Rˆxˆr   N)	r¯   r°   r±   rÞ   rû   r«   rÆ   ræ   rï   rV   r   r   r0  r0  ÷  s!   „ Ø€KàÐØ€LØ€Oòór   r0  c                   ó<   — e Zd ZdZdZdZdZdZdZd„ Z	d„ Z
d„ Zd„ Zy)	ÚFirebirdConnectorÚFirebirdFNé   c                 ó|   — t        d«      €y	 | j                  «        | j                  «        y# t        $ r Y yw xY w)NÚkinterbasdbFT)r   r   r,   r!  r   s    r   ræ   zFirebirdConnector.can_connect  s<   € Ü˜Ó'Ð/Øð	Ø�L‰LŒNØ�K‰KŒMØøÜò 	Ùð	ús   Ž / ¯	;º;c                 ó¸  — dd l }t        j                  j                  | j                  t
        j                  «      | _        t        j                  | j                  t        j                  t        j                  z   t        j                  z   «       d}|| j                  | j                  | j                  fz  }|j                  |«      }|j                  «        y )Nr   z,create database "%s" user "%s" password "%s")r=  rä   r  r  rã   rÝ   r÷   ÚchmodÚstatÚS_IRWXUÚS_IRWXGÚS_IRWXOrø   rù   Úcreate_databaser%   )r   r=  ru   r7   s       r   r   zFirebirdConnector.startDB&  sˆ   € Ûä—w‘w—|‘| D§K¡K´×1HÑ1HÓIˆŒÜ
�‰�—‘œdŸl™l¬T¯\©\Ñ9¼D¿L¹LÑHÔIØ<ˆØ�—‘˜dŸl™l¨D¯L©LÐ9Ñ9ˆØ×*Ñ*¨3Ó/ˆØ�
‰
�r   c                 óX   — d}| j                   d| j                  | j                  dœ}||fS )N)r=  ú	127.0.0.1©r  Úhostr  r  r%  r  s      r   rï   zFirebirdConnector.getPoolArgs0  s1   € ØˆàŸ™ØØ—L‘LØŸ™ñ	
ˆð �Rˆxˆr   c                 ó’   — dd l }|j                  | j                  d| j                  | j                  ¬«      }|j                  «        y )Nr   rF  rG  )r=  rŸ   r÷   rø   rù   Údrop_database)r   r=  r7   s      r   r,   zFirebirdConnector.stopDB:  s@   € Ûà×"Ñ"Ø—\‘\ØØ—‘Ø—\‘\ð	 #ó 
ˆð 	×ÑÕr   )r¯   r°   r±   rÞ   r@   rü   r¾   rý   r~   ræ   r   rï   r,   rV   r   r   r9  r9    s4   „ Ø€Kà€MØ€NØ€HØ€Ià€Nòòòó	r   r9  c                 ól  ‡— t         t        t        t        t        t
        g}i }|D ]{  Š‰j                  |z   } G ˆfd„d‰| t        j                  «      }||_	        t        ‰d«      r5dj                  ‰j                  j                  «       dd |gz   «      |_        |||<   Œ} |j                  |«       y)aQ  
    Make a test case for every db connector which can connect.

    @param base: Base class for test case. Additional base classes
                 will be a DBConnector subclass and unittest.TestCase
    @param suffix: A suffix used to create test case names. Prefixes
                   are defined in the DBConnector subclasses.
    c                   ó(   •— e Zd ZW ° j                  Zy)úmakeSQLTests.<locals>.testcaseN)r¯   r°   r±   )Ú	connclasss   €r   ÚtestcaserM  [  s   ø„ Ù"×-Ñ-‰Jr   rO  r±   ú.r   éÿÿÿÿN)r  rÿ   r  r)  r0  r9  rÞ   r   ÚTestCaser¯   Úhasattrr  r±   Úsplitrñ   )ÚbaseÚsuffixÚglobalsÚ
connectorsÚtestsÚnamerO  rN  s          @r   ÚmakeSQLTestsr[  F  s¸   ø€ ô 	ÜÜÜÜÜð€Jð €EØò ˆ	Ø×$Ñ$ vÑ-ˆö	.�y $¬×(9Ñ(9ô 	.ð !ˆÔÜ�9˜nÔ-Ø$'§H¡HØ×&Ñ&×,Ñ,Ó.¨q°Ð4¸°vÑ=ó%ˆHÔ!ð ˆˆdŠðð ‡N�N�5Õr   ÚADBAPITestsÚReconnectTestsc                   ó*   — e Zd ZdZdZdZd„ Zd„ Zd„ Zy)ÚFakePoolz¿
    A fake L{ConnectionPool} for tests.

    @ivar connectionFactory: factory for making connections returned by the
        C{connect} method.
    @type connectionFactory: any callable
    Tc                 ó   — || _         y r#   ©ÚconnectionFactory)r   rb  s     r   Ú__init__zFakePool.__init__}  s
   € Ø!2ˆÕr   c                 ó"   — | j                  «       S )zB
        Return an instance of C{self.connectionFactory}.
        ra  r   s    r   rŸ   zFakePool.connect€  s   € ð ×%Ñ%Ó'Ð'r   c                  ó   — y)z
        Do nothing.
        NrV   )r   Ú
connections     r   r£   zFakePool.disconnect†  rY   r   N)	r¯   r°   r±   r²   Ú	reconnectÚnoisyrc  rŸ   r£   rV   r   r   r_  r_  q  s"   „ ñð €IØ€Eò3ò(ór   r_  c                   ó   — e Zd ZdZd„ Zy)ÚConnectionTestsz,
    Tests for the L{Connection} class.
    c                 ó<  —  G d„ d«      }t        |«      }t        |«      }| j                  t        |j                  «       | j                  t        «      }| j                  t        |«      d«       | j                  |d   j                  j                  d   d«       y)z|
        If an error happens during rollback, L{ConnectionLost} is raised but
        the original error is logged.
        c                   ó   — e Zd Zd„ Zy)úIConnectionTests.test_rollbackErrorLogged.<locals>.ConnectionRollbackRaisec                 ó   — t        d«      ‚©Núproblem!©ÚRuntimeErrorr   s    r   ÚrollbackzRConnectionTests.test_rollbackErrorLogged.<locals>.ConnectionRollbackRaise.rollback˜  ó   € Ü" :Ó.Ð.r   N)r¯   r°   r±   rs  rV   r   r   ÚConnectionRollbackRaiserm  —  ó   „ ó/r   ru  r{   r   rp  N)r_  r   ÚassertRaisesr   rs  r>   rr  rŠ   r}   Úvalueró   )r   ru  Úpoolrf  Úerrorss        r   Útest_rollbackErrorLoggedz(ConnectionTests.test_rollbackErrorLogged‘  s€   € ÷	/ñ 	/ô Ð/Ó0ˆÜ Ó%ˆ
Ø×Ñœ.¨*×*=Ñ*=Ô>Ø×'Ñ'¬Ó5ˆØ×Ñœ˜V› aÔ(Ø×Ñ˜ ™Ÿ™×-Ñ-¨aÑ0°*Õ=r   N)r¯   r°   r±   r²   r{  rV   r   r   rj  rj  Œ  s   „ ñó>r   rj  c                   ó   — e Zd ZdZd„ Zy)ÚTransactionTestsz-
    Tests for the L{Transaction} class.
    c                 ó(  —  G d„ d«      }t        d«      }t        | |«       «      }|j                  «        | j                  t        «      }| j                  t        |«      d«       | j                  |d   j                  j                  d   d«       y)z„
        If the cursor creation raises an error in L{Transaction.reopen}, it
        reconnects but log the error occurred.
        c                   ó   — e Zd ZdZd„ Zd„ Zy)úNTransactionTests.test_reopenLogErrorIfReconnect.<locals>.ConnectionCursorRaiser   c                  ó   — y r#   rV   r   s    r   rg  zXTransactionTests.test_reopenLogErrorIfReconnect.<locals>.ConnectionCursorRaise.reconnect±  ó   € Ør   c                 ób   — | j                   dk(  r | xj                   dz  c_         t        d«      ‚y )Nr   r{   rp  )Úcountrr  r   s    r   r    zUTransactionTests.test_reopenLogErrorIfReconnect.<locals>.ConnectionCursorRaise.cursor´  s*   € Ø—:‘: ’?Ø—J’J !‘O•JÜ& zÓ2Ð2ð #r   N)r¯   r°   r±   r„  rg  r    rV   r   r   ÚConnectionCursorRaiser€  ®  s   „ ØˆEòó3r   r…  Nr{   r   rp  )	r_  r   Úreopenr>   rr  rŠ   r}   rx  ró   )r   r…  ry  r©   rz  s        r   Útest_reopenLogErrorIfReconnectz/TransactionTests.test_reopenLogErrorIfReconnect¨  sz   € ÷		3ñ 		3ô ˜‹~ˆÜ! $Ñ(=Ó(?Ó@ˆØ×ÑÔØ×'Ñ'¬Ó5ˆØ×Ñœ˜V› aÔ(Ø×Ñ˜ ™Ÿ™×-Ñ-¨aÑ0°*Õ=r   N)r¯   r°   r±   r²   r‡  rV   r   r   r}  r}  £  s   „ ñó>r   r}  c                   ó   — e Zd Zd„ Zy)ÚNonThreadPoolc                 ób   — d}	  ||i |¤Ž} |||«       y # t         $ r d}t        «       }Y Œ!w xY w)NTF)Ú	Exceptionr   )r   ÚonResultrX   Úarô   Úsuccessr–   s          r   ÚcallInThreadWithCallbackz&NonThreadPool.callInThreadWithCallbackÂ  sB   € Øˆð	Ù˜�[˜R‘[ˆFñ 	�˜&Õ!øô ò 	ØˆGÜ“YŠFð	ús   „ –.­.N)r¯   r°   r±   r�  rV   r   r   r‰  r‰  Á  s   „ ó"r   r‰  c                   ó$   — e Zd ZdZ e«       Zd„ Zy)ÚDummyConnectionPoolz'
    A testable L{ConnectionPool};
    c                 ó   — t         | _        y)z*
        Don't forward init call.
        N)r   Ú_reactorr   s    r   rc  zDummyConnectionPool.__init__Ó  s   € ô  ˆ�r   N)r¯   r°   r±   r²   r‰  Ú
threadpoolrc  rV   r   r   r‘  r‘  Ì  s   „ ññ “€Jó r   r‘  c                   ó(   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zy)ÚEventReactora  
    Partial L{IReactorCore} implementation with simple event-related
    methods.

    @ivar _running: A C{bool} indicating whether the reactor is pretending
        to have been started already or not.

    @ivar triggers: A C{list} of pending system event triggers.
    c                 ó    — || _         g | _        y r#   )Ú_runningÚtriggers)r   Úrunnings     r   rc  zEventReactor.__init__å  s   € ØˆŒØˆ�r   c                 óP   — | j                   r |«        y | j                  dd|«      S )NÚafterÚstartup)r˜  ÚaddSystemEventTrigger)r   Úfunctions     r   ÚcallWhenRunningzEventReactor.callWhenRunningé  s#   € Ø�=Š=Ù�Jà×-Ñ-¨g°yÀ(ÓKÐKr   c                 óF   — |||f}| j                   j                  |«       |S r#   )r™  r‚   )r   ÚphaseÚeventÚtriggerÚhandles        r   rž  z"EventReactor.addSystemEventTriggerï  s%   € Ø˜ Ð(ˆØ�‰×Ñ˜VÔ$Øˆr   c                 ó:   — | j                   j                  |«       y r#   )r™  Úremove)r   r¥  s     r   ÚremoveSystemEventTriggerz%EventReactor.removeSystemEventTriggerô  s   € Ø�‰×Ñ˜VÕ$r   N)r¯   r°   r±   r²   rc  r   rž  r¨  rV   r   r   r–  r–  Ú  s   „ ñòòLòó
%r   r–  c                   ó.   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚConnectionPoolTestsz+
    Unit tests for L{ConnectionPool}.
    c                 ó¾   ‡ —  G d„ d«      }d„ }t        «       }||_        |j                  |«      }‰ j                  |t        «      }ˆ fd„}|j                  |«       |S )z‘
        If rollback fails, L{ConnectionPool.runWithConnection} raises the
        original exception and log the error of the rollback.
        c                   ó   — e Zd Zd„ Zd„ Zy)ú]ConnectionPoolTests.test_runWithConnectionRaiseOriginalError.<locals>.ConnectionRollbackRaisec                  ó   — y r#   rV   ©r   ry  s     r   rc  zfConnectionPoolTests.test_runWithConnectionRaiseOriginalError.<locals>.ConnectionRollbackRaise.__init__  r‚  r   c                 ó   — t        d«      ‚ro  rq  r   s    r   rs  zfConnectionPoolTests.test_runWithConnectionRaiseOriginalError.<locals>.ConnectionRollbackRaise.rollback  rt  r   N©r¯   r°   r±   rc  rs  rV   r   r   ru  r­    ó   „ òó/r   ru  c                 ó   — t        d«      ‚©NÚfoo©Ú
ValueError)rf  s    r   ÚraisingFunctionzUConnectionPoolTests.test_runWithConnectionRaiseOriginalError.<locals>.raisingFunction
  ó   € Ü˜UÓ#Ð#r   c                 ó¾   •— ‰j                  t        «      }‰j                  t        |«      d«       ‰j                  |d   j                  j
                  d   d«       y ©Nr{   r   rp  ©r>   rr  rŠ   r}   rx  ró   ©Úignoredrz  r   s     €r   ÚcbFailedzNConnectionPoolTests.test_runWithConnectionRaiseOriginalError.<locals>.cbFailed  óJ   ø€ Ø×+Ñ+¬LÓ9ˆFØ×ÑœS ›[¨!Ô,Ø×Ñ˜V A™YŸ_™_×1Ñ1°!Ñ4°jÕAr   )r‘  rb  rj   ÚassertFailurer·  r0   )r   ru  r¸  ry  r2   r¿  s   `     r   Ú(test_runWithConnectionRaiseOriginalErrorz<ConnectionPoolTests.test_runWithConnectionRaiseOriginalErrorý  s_   ø€ ÷	/ñ 	/ò	$ô #Ó$ˆØ!8ˆÔØ×"Ñ" ?Ó3ˆØ×Ñ˜q¤*Ó-ˆô	Bð
 	
�‰�hÔØˆr   c                 ó  —  G d„ d«      }t        «       }|j                   |«       «       | j                  t        «      }| j	                  t        |«      d«       | j	                  |d   j                  j                  d   d«       y)z;
        L{ConnectionPool._close} logs exceptions.
        c                   ó   — e Zd Zd„ Zy)úDConnectionPoolTests.test_closeLogError.<locals>.ConnectionCloseRaisec                 ó   — t        d«      ‚ro  rq  r   s    r   r%   zJConnectionPoolTests.test_closeLogError.<locals>.ConnectionCloseRaise.close   rt  r   N)r¯   r°   r±   r%   rV   r   r   ÚConnectionCloseRaiserÅ    rv  r   rÇ  r{   r   rp  N)r‘  Ú_closer>   rr  rŠ   r}   rx  ró   )r   rÇ  ry  rz  s       r   Útest_closeLogErrorz&ConnectionPoolTests.test_closeLogError  sm   € ÷
	/ñ 	/ô #Ó$ˆØ�‰Ñ(Ó*Ô+à×'Ñ'¬Ó5ˆØ×Ñœ˜V› aÔ(Ø×Ñ˜ ™Ÿ™×-Ñ-¨aÑ0°*Õ=r   c                 óà   ‡ —  G d„ d«      } G d„ d«      }d„ }t        «       }||_        ||_        |j                  |«      }‰ j	                  |t
        «      }ˆ fd„}|j                  |«       |S )zŽ
        If rollback fails, L{ConnectionPool.runInteraction} raises the
        original exception and log the error of the rollback.
        c                   ó   — e Zd Zd„ Zd„ Zy)ú^ConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.ConnectionRollbackRaisec                  ó   — y r#   rV   r¯  s     r   rc  zgConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.ConnectionRollbackRaise.__init__1  r‚  r   c                 ó   — t        d«      ‚ro  rq  r   s    r   rs  zgConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.ConnectionRollbackRaise.rollback4  rt  r   Nr±  rV   r   r   ru  rÌ  0  r²  r   ru  c                   ó   — e Zd Zd„ Zy)úWConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.DummyTransactionc                  ó   — y r#   rV   )r   ry  rf  s      r   rc  z`ConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.DummyTransaction.__init__8  r‚  r   N)r¯   r°   r±   rc  rV   r   r   ÚDummyTransactionrÐ  7  s   „ ór   rÒ  c                 ó   — t        d«      ‚r´  r¶  )r©   s    r   r¸  zVConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.raisingFunction;  r¹  r   c                 ó¾   •— ‰j                  t        «      }‰j                  t        |«      d«       ‰j                  |d   j                  j
                  d   d«       y r»  r¼  r½  s     €r   r¿  zOConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.cbFailedE  rÀ  r   )r‘  rb  ÚtransactionFactoryre   rÁ  r·  r0   )r   ru  rÒ  r¸  ry  r2   r¿  s   `      r   Ú)test_runWithInteractionRaiseOriginalErrorz=ConnectionPoolTests.test_runWithInteractionRaiseOriginalError*  sq   ø€ ÷	/ñ 	/÷	ñ 	ò	$ô #Ó$ˆØ!8ˆÔØ"2ˆÔà×Ñ Ó0ˆØ×Ñ˜q¤*Ó-ˆô	Bð
 	
�‰�hÔØˆr   c                 óÞ   — t        d«      }t        d|¬«      }| j                  |j                  dd|j                  fg«       |j                  «        | j                  |j                  «       y)z™
        If L{ConnectionPool.close} is called without L{ConnectionPool.start}
        having been called, the pool's startup event is cancelled.
        Fútwisted.test.test_adbapi©Ú
cp_reactorrœ  r�  N)r–  r   rŠ   r™  Ú_startr%   rÚ   ©r   r   ry  s      r   Útest_unstartedClosez'ConnectionPoolTests.test_unstartedCloseM  s\   € ô
 ˜uÓ%ˆÜÐ8ÀWÔMˆà×Ñ˜×)Ñ)¨W°iÀÇÁÐ,MÐ+NÔOØ�
‰
Œà×Ñ˜×)Ñ)Õ*r   c                 óÞ   — t        d«      }t        d|¬«      }| j                  |j                  dd|j                  fg«       |j                  «        | j                  |j                  «       y)z�
        If L{ConnectionPool.close} is called after it has been started, but
        not by its shutdown trigger, the shutdown trigger is cancelled.
        TrØ  rÙ  ÚduringÚshutdownN)r–  r   rŠ   r™  Ú
finalCloser%   rÚ   rÜ  s      r   Útest_startedClosez%ConnectionPoolTests.test_startedCloseZ  s\   € ô
 ˜tÓ$ˆÜÐ8ÀWÔMˆà×Ñ˜×)Ñ)¨X°zÀ4Ç?Á?Ð,SÐ+TÔUØ�
‰
Œà×Ñ˜×)Ñ)Õ*r   N)	r¯   r°   r±   r²   rÂ  rÉ  rÖ  rÝ  râ  rV   r   r   rª  rª  ø  s!   „ ñòò:>ò !òF+ó+r   rª  ))r²   rä   r@  Útypingr   r   Útwisted.enterprise.adbapir   r   r   r   Útwisted.internetr	   r
   r   Útwisted.python.failurer   Útwisted.python.reflectr   Útwisted.trialr   r?   r   r¹   rÝ   rÿ   r  r  r)  r0  r9  r[  rW  r_  rR  rj  r}  r‰  r‘  r–  rª  rV   r   r   ú<module>ré     s0  ðñó 
Û ß !÷ó ÷ 8Ñ 7Ý *Ý 0Ý "ðÐ ÷Yñ Y÷xMñ M÷`>$ñ >$ôB�ô ô4˜ô ô4�ô ô8�ô ô8�_ô ô61˜ô 1òhñH ˆ^˜]©G«IÔ 6ñ ÐÐ 0±'³)Ô <÷ñ ô6>�h×'Ñ'ô >ô.>�x×(Ñ(ô >÷<"ñ "ô ˜.ô  ÷%ñ %ô<m+˜(×+Ñ+õ m+r   