ó
    Ð]jš6  ã                  ó.  • % S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKJ	r	J
r
JrJr  SSKJr  SSKJr  SSKJrJrJrJr  SS	KJr  SS
KJr  SSKJr  \R6                  r\R:                  r\R>                  r \RB                  r"\R6                  r#\R:                  r$\R>                  r%\RL                  " \'5      r(\RR                  S:w  a  SS jr*OSS jr*S S!S jjr+S S"S jjr,S S!S jjr-S S"S jjr.S S!S jjr/\0" \S5      (       a[  \\Rb                  \Rd                  -  \\Rb                  \Rf                  -  \ \Rb                  \Rd                  -  \Rf                  -  0r4O0 r4S S!S jjr5\0" \S5      (       aN  \\Rl                  \\Rn                  \ \Rl                  \Rn                  -  0r8\Rl                  \Rn                  -  ) r9O0 r8S S!S jjr:S#S jr;\(       a  \Rx                  r<S\=S'   S\R|                  ;   aG  \R|                  S   r?\?R�                  S5      (       a  \?\A" 5       ;  a  \B" S\?< 35      e\A" 5       \?   rCg\(       a  \RR                  S:w  a  \;" 5       (       d  \<rCg\R                  \D" \SS5      L a  \/rCg\0" \S5      (       a  \:rCg\+rCg)$zÒ
Code concerned with waiting in different contexts (blocking, async, etc).

These functions are designed to consume the generators returned by the
`generators` module function and to return their final value.

é    )ÚannotationsN)ÚEventÚTimeoutErrorÚget_event_loopÚwait_for)ÚDefaultSelectoré   )Úerrors)ÚRVÚPQGenÚ	PQGenConnÚWaitFunc)ÚReady)ÚWait)Ú_psycopgÚwin32c                ó„   •  [         R                  " U 5        g! [         a  n[        R                  " S5      UeSnAff = f)z3
Raise OperationalError if the connection is lost.
úconnection socket closedN)ÚosÚfstatÚ	ExceptionÚeÚOperationalError)ÚfilenoÚexs     ÚL/home/mande/repo/quber/.venv/lib/python3.13/site-packages/psycopg/waiting.pyÚ_check_fd_closedr   (   s:   € ð	IÜ�HŠH�VÕøÜó 	IÜ×$Ò$Ð%?Ó@ÀbÐHûð	Iús   ‚ ™
?£:º?c                ó   • g ©N© )r   s    r   r   r   4   s   € Øó    c                ó¤  • Uc  [        S5      e [        U 5      n[        5        nUR                  X5         UR	                  US9=n(       d"  [        U5        U R                  [        5        M9  US   S   nU R                  U5      nUR                  X5        Md  ! , (       d  f       g= f! [         a  nUR                  nUs SnA$ SnAff = f)aì  
Wait for a generator using the best strategy available.

:param gen: a generator performing database operations and yielding
    `Ready` values when it would block.
:param fileno: the file descriptor to wait on.
:param interval: interval (in seconds) to check for other interrupt, e.g.
    to allow Ctrl-C.
:return: whatever `!gen` returns on completion.

Consume `!gen`, scheduling `fileno` for completion when it is reported to
block. Once ready again send the ready state back to `!gen`.
Nú%indefinite wait not supported anymore©Útimeoutr   r	   )
Ú
ValueErrorÚnextr   ÚregisterÚselectr   ÚsendÚ
READY_NONEÚStopIterationÚvalue)	Úgenr   ÚintervalÚsÚselÚrlistÚreadyr   Úrvs	            r   Úwait_selectorr5   8   s»   € ð ÑÜÐ@ÓAÐAðÜ�‹IˆÜÔ #Ø�L‰L˜Ô#ØØ!$§¡°H Ð!=Ð=˜Õ=ä$ VÔ,Ø—H‘HœZÔ(Ùà˜a™ ™�Ø—H‘H˜U“O�Ø—‘˜VÔ'ñ ÷ Õûô ó Ø—‘ˆØ�	ûðús5   �B- ¥A7BÂ
B*Â&B- Â*B- Â-
CÂ7C
ÃCÃ
Cc                ó¸  • Uc  [        S5      e [        U 5      u  p#[        5        nUR                  X#5         UR	                  US9=n(       d  U R                  [        5        M.  UR                  U5        US   S   nU R                  U5      u  p#UR                  X#5        Ml  ! , (       d  f       g= f! [         a  nUR                  nUs SnA$ SnAff = f)a¼  
Wait for a connection generator using the best strategy available.

:param gen: a generator performing database operations and yielding
    (fd, `Ready`) pairs when it would block.
:param interval: interval (in seconds) to check for other interrupt, e.g.
    to allow Ctrl-C.
:return: whatever `!gen` returns on completion.

Behave like in `wait()`, but take the fileno to wait from the generator
itself, which might change during processing.
Nr#   r$   r   r	   )
r&   r'   r   r(   r)   r*   r+   Ú
unregisterr,   r-   )	r.   r/   r   r0   r1   r2   r3   r   r4   s	            r   Ú	wait_connr8   \   sÃ   € ð ÑÜÐ@ÓAÐAðÜ˜“I‰	ˆÜÔ #Ø�L‰L˜Ô#ØØ!$§¡°H Ð!=Ð=˜Õ=Ø—H‘HœZÔ(Ùà—‘˜vÔ&Ø˜a™ ™�ØŸH™H U›O‘	�Ø—‘˜VÔ'ñ ÷ Õûô ó Ø—‘ˆØ�	ûðús5   �B7 §A?B&Â&
B4Â0B7 Â4B7 Â7
CÃCÃCÃCc              ƒ  óx  ^
^#   • Uc  [        S5      e[        5       m
[        5       nSU
U4S jjn [        U 5      n U[        -  nU[
        -  nU(       d   U(       d  [        R                  " SU 35      eT
R                  5         SmU(       a  UR                  X[        5        U(       a  UR                  X[        5          [        T
R                  5       U5      I Sh  v•N   U(       a  UR!                  U5        U(       a  UR#                  U5        U R%                  T5      nMì   NG! [         a     NQf = f! U(       a  UR!                  U5        U(       a  UR#                  U5        f f = f! [&         a  n[        R(                  " S5      UeSnAf[*         a  nUR,                  n	U	s SnA$ SnAff = f7f)aš  
Coroutine waiting for a generator to complete.

:param gen: a generator performing database operations and yielding
    `Ready` values when it would block.
:param fileno: the file descriptor to wait on.
:param interval: interval (in seconds) to check for other interrupt, e.g.
    to allow Ctrl-C.
:return: whatever `!gen` returns on completion.

Behave like in `wait()`, but exposing an `asyncio` interface.
Nr#   c                ó0   >• TU -  mTR                  5         g r   ©Úset©ÚstateÚevr3   s    €€r   ÚwakeupÚwait_async.<locals>.wakeup•   s   ø€ à�‰ˆØ
�‰�r!   úbad poll status: r   r   ©r>   r   ÚreturnÚNone)r&   r   r   r'   ÚWAIT_RÚWAIT_Wr   ÚInternalErrorÚclearÚ
add_readerÚREADY_RÚ
add_writerÚREADY_Wr   Úwaitr   Úremove_readerÚremove_writerr*   ÚOSErrorr   r,   r-   )r.   r   r/   Úloopr@   r0   ÚreaderÚwriterr   r4   r?   r3   s             @@r   Ú
wait_asyncrU   ~   sw  ùé € ð ÑÜÐ@ÓAÐAô 
‹€BÜÓ€D÷ð ð
Ü�‹IˆØØœ‘ZˆFØœ‘ZˆFÞžfÜ—o’oÐ(9¸!¸Ð&=Ó>Ð>Ø�H‰HŒJØˆEÞØ—‘ ´Ô8ÞØ—‘ ´Ô8ð	/ðÜ" 2§7¡7£9¨hÓ7×7Ð7ö Ø×&Ñ& vÔ.ÞØ×&Ñ& vÔ.Ø—‘˜“ˆAñ+ ñ 8øÜ#ó Ùðûö Ø×&Ñ& vÔ.ÞØ×&Ñ& vÕ.ð ûô ó Eä× Ò Ð!;Ó<À"ÐDûÜó Ø—‘ˆØ�	ûðüs~   „,F:±BE1 ÃD+ Ã!D)Ã"D+ Ã&AE1 Ä)D+ Ä+
D8Ä5D; Ä7D8Ä8D; Ä;3E.Å.E1 Å1
F7Å;FÆF7ÆF2Æ,F7Æ-F:Æ2F7Æ7F:c              ƒ  ó~  ^
^#   • Uc  [        S5      e[        5       m
[        5       nSU
U4S jjn [        U 5      u  pE U[        -  nU[
        -  nU(       d   U(       d  [        R                  " SU 35      eT
R                  5         SmU(       a  UR                  XC[        5        U(       a  UR                  XC[        5         U(       a$   [        T
R                  5       U5      I Sh  v•N   OT
R                  5       I Sh  v•N   U(       a  UR!                  U5        U(       a  UR#                  U5        U R%                  T5      u  pEGM   Nc! [         a     NTf = f N\! U(       a  UR!                  U5        U(       a  UR#                  U5        f f = f! [&         a  nUR(                  n	U	s SnA$ SnAff = f7f)a³  
Coroutine waiting for a connection generator to complete.

:param gen: a generator performing database operations and yielding
    (fd, `Ready`) pairs when it would block.
:param interval: interval (in seconds) to check for other interrupt, e.g.
    to allow Ctrl-C.
:return: whatever `!gen` returns on completion.

Behave like in `wait()`, but take the fileno to wait from the generator
itself, which might change during processing.
Nr#   c                ó*   >• U mTR                  5         g r   r;   r=   s    €€r   r@   Úwait_conn_async.<locals>.wakeupÒ   s   ø€ àˆØ
�‰�r!   rB   r   rC   )r&   r   r   r'   rF   rG   r   rH   rI   rJ   rK   rL   rM   r   rN   r   rO   rP   r*   r,   r-   )r.   r/   rR   r@   r   r0   rS   rT   r   r4   r?   r3   s             @@r   Úwait_conn_asyncrY   »   sq  ùé € ð ÑÜÐ@ÓAÐAô 
‹€BÜÓ€D÷ð ð
Ü˜“I‰	ˆØØœ‘ZˆFØœ‘ZˆFÞžfÜ—o’oÐ(9¸!¸Ð&=Ó>Ð>Ø�H‰HŒJØˆEÞØ—‘ ´Ô8ÞØ—‘ ´Ô8ð/ÞðÜ& r§w¡w£y°(Ó;×;Ñ;ð Ÿ'™'›)—O�OæØ×&Ñ& vÔ.ÞØ×&Ñ& vÔ.ØŸ™ ›‰IˆFò1 ñ <øÜ'ó Ùðúñ $øæØ×&Ñ& vÔ.ÞØ×&Ñ& vÕ.ð ûô ó Ø—‘ˆØ�	ûðüsŠ   „,F=±BF ÃE" ÃE Ã*EÃ+E Ã/E" ÄE ÄE" ÄAF ÅE Å
EÅE" ÅEÅE" Å"3FÆF Æ
F:Æ"F5Æ/F:Æ0F=Æ5F:Æ:F=c                ó   • Uc  [        S5      e [        U 5      nSnU4n [        R                  " U[        -  (       a  UOUU[        -  (       a  UOUUU5      u  pgnU(       a!  [        U5        [        R                  " S5      eSn	U(       a  [        n	U(       a	  U	[        -  n	U R                  U	5      nM–  ! [         a  n
[        R                  " S5      U
eSn
A
f[         a  n
U
R                  nUs Sn
A
$ Sn
A
ff = f)zv
Wait for a generator using select where supported.

BUG: on Linux, can't select on FD >= 1024. On Windows it's fine.
Nr#   r    r   r   )r&   r'   r)   rF   rG   r   r   r   rK   rM   r*   rQ   r,   r-   )r.   r   r/   r0   ÚemptyÚfnlistÚrlÚwlÚxlr3   r   r4   s               r   Úwait_selectr`   û   sê   € ð ÑÜÐ@ÓAÐAðÜ�‹IˆàˆØ�ˆØÜŸšØœfŸ*‘¨%ØœfŸ*‘¨%ØØó	‰JˆB�Bö Ü  Ô(ä×(Ò(Ð)CÓDÐDØˆEÞÜ�ÞØœÑ �à—‘˜“ˆAñ# øô& ó Eä× Ò Ð!;Ó<À"ÐDûÜó Ø—‘ˆØ�	ûðús*   �B'B7 Â7
C=ÃCÃC=Ã%C8Ã2C=Ã8C=ÚEpollSelectorc                ót  • Uc  [        S5      e [        U 5      nUS:  a  Sn[        R                  " 5        n[        U   nUR                  X5         UR                  U5      =n(       d"  [        U5        U R                  [        5        M;  US   S   nSnU[        R                  -  (       a  [        nU[        R                  -  (       a	  U[        -  nU R                  U5      n[        U   nUR                  X5        M°  ! , (       d  f       g= f! [         a  n	U	R                   n
U
s Sn	A	$ Sn	A	ff = f)aü  
Wait for a generator using epoll where supported.

Parameters are like for `wait()`. If it is detected that the best selector
strategy is `epoll` then this function will be used instead of `wait`.

See also: https://linux.die.net/man/2/epoll_ctl

BUG: if the connection FD is closed, `epoll.poll()` hangs. Same for
EpollSelector. For this reason, wait_poll() is currently preferable.
To reproduce the bug:

    export PSYCOPG_WAIT_FUNC=wait_epoll
    pytest tests/test_concurrency.py::test_concurrent_close
Nr#   r   ç        r	   )r&   r'   r)   ÚepollÚ_epoll_evmasksr(   Úpollr   r*   r+   ÚEPOLLINrK   ÚEPOLLOUTrM   Úmodifyr,   r-   )r.   r   r/   r0   rd   ÚevmaskÚfileevsr?   r3   r   r4   s              r   Ú
wait_epollrl   -  s  € ð  ÑÜÐ@ÓAÐAðÜ�‹Iˆà�a‹<ØˆHä�\Š\Œ^˜uÜ# AÑ&ˆFØ�N‰N˜6Ô*ØØ#(§:¡:¨hÓ#7Ð7˜Õ7Ü$ VÔ,Ø—H‘HœZÔ(ÙØ˜Q‘Z ‘]�Ø�ØœŸ™×&Ü#�EØœŸ™×'ØœWÑ$�EØ—H‘H˜U“O�Ü'¨Ñ*�Ø—‘˜VÔ,ñ ÷ �^ûô$ ó Ø—‘ˆØ�	ûðús5   �(D ¸CDÄ
DÄD ÄD Ä
D7ÄD2Ä,D7Ä2D7ÚPollSelectorc                óÄ  • Uc  [        S5      e [        U 5      nUS:  a  SnO[        US-  5      n[        R                  " 5       n[
        U   nUR                  X5         UR	                  U5      =n(       d  U R                  [        5        M0  US   S   nSnU[        R                  -  (       a  [        nU[        R                  -  (       a	  U[        -  nU(       d/  U[        -  (       a!  [        U5        [        R                   " S5      eU R                  U5      n[
        U   nUR#                  X5        MÛ  ! [$         a  n	U	R&                  n
U
s Sn	A	$ Sn	A	ff = f)zU
Wait for a generator using poll where supported.

Parameters are like for `wait()`.
Nr#   r   g     @�@r	   r   )r&   r'   Úintr)   rf   Ú_poll_evmasksr(   r*   r+   ÚPOLLINrK   ÚPOLLOUTrM   ÚPOLL_BADr   r   r   ri   r,   r-   )r.   r   r/   r0   rf   rj   rk   r?   r3   r   r4   s              r   Ú	wait_pollrt   g  s*  € ð ÑÜÐ@ÓAÐAð#Ü�‹Iˆà�a‹<Ø‰Hä˜8 fÑ,Ó-ˆHä�{Š{‹}ˆÜ˜qÑ!ˆØ�‰�fÔ%ØØ#Ÿy™y¨Ó2Ð2�GÕ2Ø—‘œÔ$Ùà˜‘˜A‘ˆBàˆEØ”F—M‘M×!Ü�Ø”F—N‘N×"ØœÑ �æ˜R¤(Ÿ]Ü  Ô(ä×(Ò(Ð)CÓDÐDà—‘˜“ˆAÜ" 1Ñ%ˆFØ�K‰K˜Ô'ñ) øô, ó Ø—‘ˆØ�	ûðús   �D-D= Ä=
EÅEÅEÅEc                 óÞ   • [         R                  R                  S5      =n (       a   U R                  S5      (       a  g gg! [         a   n[
        R                  SU5         SnAgSnAff = f)zÃ
Detect if some greenlet library has patched the select library.

If this is the case, avoid to use the wait_c function as it doesn't behave
in a collaborative way.

Currently supported: gevent.
zgevent.monkeyr)   Tz+failed to detect gevent monkey-patching: %sNF)ÚsysÚmodulesÚgetÚis_module_patchedr   ÚloggerÚwarning)Úmr   s     r   Ú_is_select_patchedr}   •  si   € ô �K‰K�O‰O˜OÓ,Ð,€qÕ,ð	NØ×"Ñ" 8×,Ñ,Øð -ñ
 øô ó 	NÜ�N‰NÐHÈ"×MÐMàûð	Nús   ¨A Á
A,ÁA'Á'A,r   rN   ÚPSYCOPG_WAIT_FUNCÚwait_zHPSYCOPG_WAIT_FUNC should be the name of an available wait function; got ÚSelectSelector)r   ro   rD   rE   )rc   )r.   z	PQGen[RV]r   ro   r/   ÚfloatrD   r   )r.   zPQGenConn[RV]r/   r�   rD   r   )rD   Úbool)EÚ__doc__Ú
__future__r   r   rv   r)   ÚloggingÚ	selectorsÚasyncior   r   r   r   r   Ú r
   r   Úabcr   r   r   r   Ú_enumsr   r   Ú_cmoduler   ÚRrF   ÚWrG   ÚRWÚWAIT_RWÚNONEr+   rK   rM   ÚREADY_RWÚ	getLoggerÚ__name__rz   Úplatformr   r5   r8   rU   rY   r`   ÚhasattrÚEPOLLONESHOTrg   rh   re   rl   rq   rr   rp   rs   rt   r}   Úwait_cÚ__annotations__ÚenvironÚfnameÚ
startswithÚglobalsÚImportErrorrN   Úgetattrr    r!   r   Ú<module>rŸ      sT  ðòõ #ã 	Û 
Û Û Û ß AÓ AÝ %å ß /Ó /Ý "Ý  Ý à	�‰€Ø	�‰€Ø
�'‰'€Ø�Z‰Z€
Ø
�'‰'€Ø
�'‰'€Ø�8‰8€à	×	Ò	˜8Ó	$€ð ‡<�<�7ÓõIôö!öHöD:öz:ö@%ñP ˆ9�o×&Ñ&à�×#Ñ# f§n¡nÑ4Ø�×#Ñ# f§o¡oÑ5Ø�×$Ñ$ v§~¡~Ñ5¸¿¹ÑGð�Nð €Nö,ñ^ ˆ9�n×%Ñ%à�—‘Ø�—‘Ø�—‘ §¡Ñ/ð€Mð
 —‘ §¡Ñ/Ð0�Hà€Mö+ô\ö( Ø�_‰_€Fð ƒð ˜"Ÿ*™*Ó$Ø�J‰JÐ*Ñ+€EØ×Ñ˜G×$Ñ$¨±W³YÓ(>ÙðØ‘9ðó
ð 	
ñ ‹9�UÑ�Dö
 �#—,‘, 'Ó)Ñ2D×2FÑ2FØ�Dà×Ñ¡'¨)Ð5EÀtÓ"LÒLà�DáˆY˜×'Ñ'ð �Dð �Dr!   