Ë
    êëjš6  ã                  ó¶  — U d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	m
Z
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 dd	lmZ dd
lmZ ddlmZ ej6                  Zej:                  Zej>                  Z ejB                  Z"ej6                  Z#ej:                  Z$ej>                  Z% ejL                  e'«      Z(ejR                  dk7  rdd„Z*ndd„Z*d d!d„Z+d d"d„Z,d d!d„Z-d d"d„Z.d d!d„Z/ e0ed«      r[eejb                  ejd                  z  eejb                  ejf                  z  e ejb                  ejd                  z  ejf                  z  iZ4ni Z4d d!d„Z5 e0ed«      rNeejl                  eejn                  e ejl                  ejn                  z  iZ8ejl                  ejn                  z   Z9ni Z8d d!d„Z:d#d„Z;erejx                  Z<de=d<   dej|                  v r?ej|                  d   Z?e?j�                  d«      r	e? eA«       vr eBde?›�«      ‚ eA«       e?   ZCyerejR                  dk7  r
 e;«       se<ZCyej                   eDedd«      u re/ZCy e0ed«      re:ZCye+ZCy)$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                ó~   — 	 t        j                  | «       y# t        $ r}t        j                  d«      |‚d}~ww xY w)zC
        Raise OperationalError if the connection is lost.
        úconnection socket closedN)ÚosÚfstatÚ	ExceptionÚeÚOperationalError)ÚfilenoÚexs     úV/var/www/html/kelly/kelly-backend/venv/lib/python3.12/site-packages/psycopg/waiting.pyÚ_check_fd_closedr   (   s:   € ð	IÜ�H‰H�VÕøÜò 	IÜ×$Ñ$Ð%?Ó@ÀbÐHûð	Iús   ‚ ˜	<¡7·<c                 ó   — y ©N© )r   s    r   r   r   4   s   € Øó    c                ó’  — |€t        d«      ‚	 t        | «      }t        «       5 }|j                  ||«       	 |j	                  |¬«      x}s!t        |«       | j                  t        «       Œ6|d   d   }| j                  |«      }|j                  ||«       Œa# 1 sw Y   yxY w# t        $ r}|j                  }|cY d}~S d}~ww xY w)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 QÔ'ð ÷ Ðûô ò Ø—‘ˆØ�	ûðús5   �B% ¤A5BÂB"ÂB% Â"B% Â%	CÂ.CÂ;CÃCc                óª  — |€t        d«      ‚	 t        | «      \  }}t        «       5 }|j                  ||«       	 |j	                  |¬«      x}s| j                  t        «       Œ+|j                  |«       |d   d   }| j                  |«      \  }}|j                  ||«       Œj# 1 sw Y   yxY w# t        $ r}|j                  }|cY d}~S d}~ww xY w)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 QÔ'ð ÷ Ðûô ò Ø—‘ˆØ�	ûðús5   �B1 §A>B%Â%B.Â*B1 Â.B1 Â1	CÂ:CÃCÃCc              ƒ  ó  ‡
‡K  — |€t        d«      ‚t        «       Š
t        «       }dˆ
ˆfd„}	 t        | «      }	 |t        z  }|t
        z  }|s|st        j                  d|› �«      ‚‰
j                  «        dŠ|r|j                  ||t        «       |r|j                  ||t        «       	 	 t        ‰
j                  «       |«      ƒ d{  –—†  |r|j!                  |«       |r|j#                  |«       	 | j%                  ‰«      }ŒÏ7 Œ=# t        $ r Y ŒFw xY w# |r|j!                  |«       |r|j#                  |«       w w xY w# t&        $ r}t        j(                  d«      |‚d}~wt*        $ r}|j,                  }	|	cY d}~S d}~ww xY w­w)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   •— ‰| z  Š‰j                  «        y r   ©Úset©ÚstateÚevr3   s    €€r   Úwakeupz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_asyncrT   ~   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®A>E Â.D ÃD	ÃD Ã9E Ä	D Ä	DÄD ÄDÄD Ä)EÅE Å	F	ÅE%Å%F	Å1FÅ>F	Å?FÆF	Æ	Fc              ƒ  ó  ‡
‡K  — |€t        d«      ‚t        «       Š
t        «       }dˆ
ˆfd„}	 t        | «      \  }}	 |t        z  }|t
        z  }|s|st        j                  d|› �«      ‚‰
j                  «        dŠ|r|j                  ||t        «       |r|j                  ||t        «       	 |r$	 t        ‰
j                  «       |«      ƒ d{  –—†  n‰
j                  «       ƒ d{  –—†  |r|j!                  |«       |r|j#                  |«       	 | j%                  ‰«      \  }}Œí7 ŒY# t        $ r Y ŒIw xY w7 ŒQ# |r|j!                  |«       |r|j#                  |«       w w xY w# t&        $ r}|j(                  }	|	cY d}~S d}~ww xY w­w)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                ó*   •— | Š‰j                  «        y r   r;   r=   s    €€r   r@   zwait_conn_async.<locals>.wakeupÒ   s   ø€ àˆØ
�‰�r!   rA   r   rB   )r&   r   r   r'   rE   rF   r   rG   rH   rI   rJ   rK   rL   r   rM   r   rN   rO   r*   r,   r-   )r.   r/   rQ   r@   r   r0   rR   rS   r   r4   r?   r3   s             @@r   Úwait_conn_asyncrW   »   su  ùè ø€ ð ÐÜÐ@Ó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�Að1 ð <ùÜ'ò Ùðúð $ùáØ×&Ñ& vÔ.ÙØ×&Ñ& vÕ.ð ûô ò Ø—‘ˆØ�	ûðüs‰   „)F®BE) Â0D= Â3D, ÃD*ÃD, ÃD= Ã)D;Ã*D= Ã.<E) Ä*D, Ä,	D8Ä5D= Ä7D8Ä8D= Ä=)E&Å&E) Å)	F
Å2FÅ?F
Æ FÆF
Æ
Fc                óÂ  — |€t        d«      ‚	 t        | «      }d}|f}	 t        j                  |t        z  r|n||t        z  r|n|||«      \  }}}|r t        |«       t        j                  d«      ‚d}	|rt        }	|r	|	t        z  }	| j                  |	«      }Œ{# t        $ r}
t        j                  d«      |
‚d}
~
wt        $ r}
|
j                  }|cY d}
~
S d}
~
ww xY w)z‚
    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)   rE   rF   r   r   r   rJ   rL   r*   rP   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B Â	CÂ$B:Â:CÃCÃCÃCÚEpollSelectorc                óD  — |€t        d«      ‚	 t        | «      }|dk  rd}t        j                  «       5 }t        |   }|j                  ||«       	 |j                  |«      x}s!t        |«       | j                  t        «       Œ5|d   d   }d}|t        j                  z  rt        }|t        j                  z  r	|t        z  }| j                  |«      }t        |   }|j                  ||«       Œ # 1 sw Y   yxY w# t        $ r}	|	j                   }
|
cY d}	~	S d}	~	ww xY w)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+   ÚEPOLLINrJ   ÚEPOLLOUTrL   Úmodifyr,   r-   )r.   r   r/   r0   rb   ÚevmaskÚfileevsr?   r3   r   r4   s              r   Ú
wait_epollrj   -  s  € ð  ÐÜÐ@ÓAÐAðÜ�‹Iˆà�aŠ<ØˆHä�\‰\Œ^˜uÜ# AÑ&ˆFØ�N‰N˜6 6Ô*ØØ#(§:¡:¨hÓ#7Ð7˜Ð7Ü$ VÔ,Ø—H‘HœZÔ(ØØ˜Q‘Z ‘]�Ø�ØœŸ™Ò&Ü#�EØœŸ™Ò'ØœWÑ$�EØ—H‘H˜U“O�Ü'¨Ñ*�Ø—‘˜V VÔ,ð ÷ ˆ^ûô$ ò Ø—‘ˆØ�	ûðús5   �&C> µB=C2Ã2C;Ã7C> Ã;C> Ã>	DÄDÄDÄDÚPollSelectorc                óˆ  — |€t        d«      ‚	 t        | «      }|dk  rd}nt        |dz  «      }t        j                  «       }t
        |   }|j                  ||«       	 |j	                  |«      x}s| j                  t        «       Œ*|d   d   }d}|t        j                  z  rt        }|t        j                  z  r	|t        z  }|s)|t        z  r t        |«       t        j                   d«      ‚| j                  |«      }t
        |   }|j#                  ||«       ŒÀ# t$        $ r}	|	j&                  }
|
cY d}	~	S d}	~	ww xY w)za
    Wait for a generator using poll where supported.

    Parameters are like for `wait()`.
    Nr#   r   g     @�@r	   r   )r&   r'   Úintr)   rd   Ú_poll_evmasksr(   r*   r+   ÚPOLLINrJ   ÚPOLLOUTrL   ÚPOLL_BADr   r   r   rg   r,   r-   )r.   r   r/   r0   rd   rh   ri   r?   r3   r   r4   s              r   Ú	wait_pollrr   g  s.  € ð ÐÜÐ@ÓAÐAð#Ü�‹Iˆà�aŠ<Ø‰Hä˜8 fÑ,Ó-ˆHä�{‰{‹}ˆÜ˜qÑ!ˆØ�‰�f˜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Ä)D<Ä6EÄ<Ec                 óÈ   — t         j                  j                  d«      x} r	 | j                  d«      ry	 yy# t        $ r }t
        j                  d|«       Y d}~yd}~ww xY w)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{   •  sf   € ô �K‰K�O‰O˜OÓ,Ð,€qÐ,ð	NØ×"Ñ" 8Ô,Øð -ñ
 øô ò 	NÜ�N‰NÐHÈ"×MÐMàûð	Nús   £8 ¸	A!ÁAÁA!r   rM   ÚPSYCOPG_WAIT_FUNCÚwait_zHPSYCOPG_WAIT_FUNC should be the name of an available wait function; got ÚSelectSelector)r   rm   rC   rD   )ra   )r.   z	PQGen[RV]r   rm   r/   ÚfloatrC   r   )r.   zPQGenConn[RV]r/   r   rC   r   )rC   Úbool)EÚ__doc__Ú
__future__r   r   rt   r)   ÚloggingÚ	selectorsÚasyncior   r   r   r   r   Ú r
   r   Úabcr   r   r   r   Ú_enumsr   r   Ú_cmoduler   ÚRrE   ÚWrF   ÚRWÚWAIT_RWÚNONEr+   rJ   rL   ÚREADY_RWÚ	getLoggerÚ__name__rx   Úplatformr   r5   r8   rT   rW   r^   ÚhasattrÚEPOLLONESHOTre   rf   rc   rj   ro   rp   rn   rq   rr   r{   Úwait_cÚ__annotations__ÚenvironÚfnameÚ
startswithÚglobalsÚImportErrorrM   Úgetattrr    r!   r   Ú<module>r�      sG  ðòõ #ã 	Û 
Û Û Û ß 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Ø�Dà×Ñ¡'¨)Ð5EÀtÓ"LÑLà�DáˆY˜Ô'ð �Dð �Dr!   