Ë
    Ûqj\2  ã                  ó˜  — 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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(ddd„Z)ddd„Z*ddd„Z+ddd„Z,ddd„Z- e.ed«      r‚eej^                  ej`                  z  ejb                  z  eej^                  ejd                  z  ejb                  z  e ej^                  ej`                  ejd                  z  ejb                  z  z  iZ3ni Z3ddd„Z4 e.ed«      r4eejj                  eejl                  e ejj                  ejl                  z  iZ7ni Z7ddd„Z8dd„Z9erejt                  Z:de;d<   dejx                  v r?ejx                  d   Z=e=j}                  d«      r	e= e?«       vr e@de=›�«      ‚ e?«       e=   ZAyerej„                  dk7  r
 e9«       se:ZAyej                   eCedd«      u re-ZAy e.ed«      re8ZAye)ZAy) 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)Úget_event_loopÚwait_forÚEventÚTimeoutError)ÚDefaultSelectoré   )Úerrors)ÚRVÚPQGenÚ	PQGenConnÚWaitFunc)ÚWaitÚReady)Ú_psycopgc                ó¦  — 	 t        | «      }t        «       5 }|j                  ||«       	 |j                  |¬«      }|s| j	                  t
        «       Œ+|j                  |«       |d   d   }| j	                  |«      }|j                  ||«       Œg# 1 sw Y   yxY w# t        $ r)}|j                  r|j                  d   nd}|cY d}~S d}~ww xY w)a8  
    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. If zero or None, wait indefinitely.
    :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`.
    ©Útimeoutr   r	   N©	Únextr   ÚregisterÚselectÚsendÚ
READY_NONEÚ
unregisterÚStopIterationÚargs)	ÚgenÚfilenoÚintervalÚsÚselÚrlistÚreadyÚexÚrvs	            úP/var/www/html/kelly-backend/venv/lib/python3.12/site-packages/psycopg/waiting.pyÚwait_selectorr(   %   s¸   € ðÜ�‹IˆÜÔ #Ø�L‰L˜ Ô#ØØŸ
™
¨8˜
Ó4�ÙØ—H‘HœZÔ(Øà—‘˜vÔ&Ø˜a™ ™�Ø—H‘H˜U“O�Ø—‘˜V QÔ'ð ÷ Ðûô ò Ø!Ÿwšw�—‘˜’¨DˆØ�	ûðús5   ‚B —A;BÂBÂB ÂB Â	CÂ'CÃCÃCc                óº  — 	 t        | «      \  }}|sd}t        «       5 }|j                  ||«       	 |j                  |¬«      }|s| j	                  t
        «       Œ+|j                  |«       |d   d   }| j	                  |«      \  }}|j                  ||«       Œj# 1 sw Y   yxY w# t        $ r)}|j                  r|j                  d   nd}|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. If zero or None, wait indefinitely.
    :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$   r%   r&   s	            r'   Ú	wait_connr*   G   sÈ   € ðÜ˜“I‰	ˆ�ÙØˆHÜÔ #Ø�L‰L˜ Ô#ØØŸ
™
¨8˜
Ó4�ÙØ—H‘HœZÔ(Øà—‘˜vÔ&Ø˜a™ ™�ØŸH™H U›O‘	�˜Ø—‘˜V QÔ'ð ÷ Ðûô ò Ø!Ÿwšw�—‘˜’¨DˆØ�	ûðús5   ‚B( žA>BÂB%Â!B( Â%B( Â(	CÂ1CÃCÃCc              ƒ  ón  ‡
‡K  — 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{  –—†  n‰
j                  «       ƒ d{  –—†  |r|j                  |«       |r|j!                  |«       	 | j#                  ‰«      }Œê7 ŒV# t        $ r Y ŒFw xY w7 ŒN# |r|j                  |«       |r|j!                  |«       w w xY w# t$        $ r#}t        j&                  t)        |«      «      ‚d}~wt*        $ r)}|j,                  r|j,                  d   nd}	|	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. If None, wait indefinitely.
    :return: whatever `!gen` returns on completion.

    Behave like in `wait()`, but exposing an `asyncio` interface.
    c                ó0   •— ‰| z  Š‰j                  «        y ©N©Úset©ÚstateÚevr$   s    €€r'   Úwakeupzwait_async.<locals>.wakeup~   s   ø€ à�‰ˆØ
�‰�ó    úbad poll status: r   N©r1   r   ÚreturnÚNone)r   r   r   ÚWAIT_RÚWAIT_WÚeÚInternalErrorÚclearÚ
add_readerÚREADY_RÚ
add_writerÚREADY_Wr   Úwaitr   Úremove_readerÚremove_writerr   ÚOSErrorÚOperationalErrorÚstrr   r   )r   r   r    Úloopr3   r!   ÚreaderÚwriterr%   r&   r2   r$   s             @@r'   Ú
wait_asyncrK   j   s†  ùè ø€ ô 
‹€BÜÓ€Döð
!Ü�‹IˆØØœ‘ZˆFØœ‘ZˆFÙ¡&Ü—o‘oÐ(9¸!¸Ð&=Ó>Ð>Ø�H‰HŒJØˆEÙØ—‘ ¨´Ô8ÙØ—‘ ¨´Ô8ð/ØÐ'ðÜ& r§w¡w£y°(Ó;×;Ñ;ð Ÿ'™'›)—O�OáØ×&Ñ& vÔ.ÙØ×&Ñ& vÕ.Ø—‘˜“ˆAð1 ð <ùÜ'ò Ùðúð $ùáØ×&Ñ& vÔ.ÙØ×&Ñ& vÕ.ð ûô ò *ä× Ñ ¤ R£Ó)Ð)ûÜò Ø!Ÿwšw�—‘˜’¨DˆØ�	ûðüs•   „F5¡A>E Â D* Â#D Ã DÃD ÃD* ÃD(ÃD* Ã9E ÄD Ä	D%Ä"D* Ä$D%Ä%D* Ä*)EÅE Å	F2ÅE=Å=F2Æ	F-Æ'F2Æ(F5Æ-F2Æ2F5c              ƒ  ó&  ‡
‡K  — 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&                  r|j&                  d   nd}	|	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. If zero or None, wait indefinitely.
    :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.
    c                ó*   •— | Š‰j                  «        y r-   r.   r0   s    €€r'   r3   zwait_conn_async.<locals>.wakeup»   s   ø€ àˆØ
�‰�r4   r5   r   Nr6   )r   r   r   r9   r:   r;   r<   r=   r>   r?   r@   rA   r   rB   r   rC   rD   r   r   r   )r   r    rH   r3   r   r!   rI   rJ   r%   r&   r2   r$   s             @@r'   Úwait_conn_asyncrN   §   sm  ùè ø€ ô 
‹€BÜÓ€Döð
Ü˜“I‰	ˆ�ØØœ‘ZˆFØœ‘ZˆFÙ¡&Ü—o‘oÐ(9¸!¸Ð&=Ó>Ð>Ø�H‰HŒJØˆEÙØ—‘ ¨´Ô8ÙØ—‘ ¨´Ô8ð/ÙðÜ& r§w¡w£y°(Ó;×;Ñ;ð Ÿ'™'›)—O�OáØ×&Ñ& vÔ.ÙØ×&Ñ& vÕ.ØŸ™ ›‰IˆF�Að1 ð <ùÜ'ò Ùðúð $ùáØ×&Ñ& vÔ.ÙØ×&Ñ& vÕ.ð ûô ò Ø!Ÿwšw�—‘˜’¨DˆØ�	ûðüs‰   „F¡BE Â#D0 Â&D ÃDÃD ÃD0 ÃD.ÃD0 Ã!<E ÄD Ä	D+Ä(D0 Ä*D+Ä+D0 Ä0)EÅE Å	FÅ%F	ÆFÆFÆ	FÆFc                ór  — 	 t        | «      }d}|f}	 t        j                  |t        z  r|n||t        z  r|n|||«      \  }}}d}	|rt        }	|r	|	t
        z  }	|	s| j                  t        «       Œ`| j                  |	«      }Œq# t        $ r)}
|
j                  r|
j                  d   nd}|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.
    © r   N)
r   r   r9   r:   r?   rA   r   r   r   r   )r   r   r    r!   ÚemptyÚfnlistÚrlÚwlÚxlr$   r%   r&   s               r'   Úwait_selectrV   ä   s»   € ðÜ�‹IˆàˆØ�ˆØÜŸ™Øœfš*‘¨%Øœfš*‘¨%ØØó	‰JˆB��Bð ˆEÙÜ�ÙØœÑ �ÙØ—‘œÔ$Øà—‘˜“ˆAð! øô$ ò Ø!Ÿwšw�—‘˜’¨DˆØ�	ûðús   ‚BB Â	B6ÂB1Â+B6Â1B6ÚEpollSelectorc                ó>  — 	 t        | «      }|�|dk  rd}t        j                  «       5 }t        |   }|j	                  ||«       	 |j                  |«      }|s| j                  t        «       Œ*|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                  r|	j                  d   nd}
|
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   g        r	   )r   r   ÚepollÚ_epoll_evmasksr   Úpollr   r   ÚEPOLLOUTr?   ÚEPOLLINrA   Úmodifyr   r   )r   r   r    r!   rY   ÚevmaskÚfileevsr2   r$   r%   r&   s              r'   Ú
wait_epollra     s  € ð Ü�‹IˆàÐ˜x¨!š|ØˆHä�\‰\Œ^˜uÜ# AÑ&ˆFØ�N‰N˜6 6Ô*ØØŸ*™* XÓ.�ÙØ—H‘HœZÔ(ØØ˜Q‘Z ‘]�Ø�ØœŸ™Ð(Ò(Ü#�EØœŸ™˜Ò'ØœWÑ$�EØ—H‘H˜U“O�Ü'¨Ñ*�Ø—‘˜V VÔ,ð ÷ ˆ^ûô$ ò Ø!Ÿwšw�—‘˜’¨DˆØ�	ûðús5   ‚(C* ªB4CÃC'Ã#C* Ã'C* Ã*	DÃ3DÄDÄDÚPollSelectorc                óB  — 	 t        | «      }|�|dk  rd}nt        |dz  «      }t        j                  «       }t        |   }|j                  ||«       	 |j                  |«      }|s| j                  t        «       Œ*|d   d   }d}|t        j                   z  rt        }|t        j                   z  r	|t        z  }| j                  |«      }t        |   }|j                  ||«       Œ—# t        $ r)}	|	j                  r|	j                  d   nd}
|
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   g     @�@r	   )r   Úintr   r[   Ú_poll_evmasksr   r   r   ÚPOLLOUTr?   ÚPOLLINrA   r^   r   r   )r   r   r    r!   r[   r_   r`   r2   r$   r%   r&   s              r'   Ú	wait_pollrh   H  s	  € ðÜ�‹IˆàÐ˜x¨!š|Ø‰Hä˜8 fÑ,Ó-ˆHä�{‰{‹}ˆÜ˜qÑ!ˆØ�‰�f˜fÔ%ØØ—i‘i Ó)ˆGÙØ—‘œÔ$Øà˜‘˜A‘ˆBØˆEØ”V—^‘^�OÒ#Ü�Ø”V—]‘]�NÒ"ØœÑ �Ø—‘˜“ˆAÜ" 1Ñ%ˆFØ�K‰K˜ Ô'ð øô  ò Ø!Ÿwšw�—‘˜’¨DˆØ�	ûðús   ‚C*C, Ã,	DÃ5DÄDÄDc                 óÈ   — t         j                  j                  d«      } | 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_patchedÚ	ExceptionÚloggerÚwarning)Úmr%   s     r'   Ú_is_select_patchedrr   n  sc   € ô 	�‰�‰˜Ó(€AÙð	NØ×"Ñ" 8Ô,Øð -ñ
 øô ò 	NÜ�N‰NÐHÈ"×MÐMàûð	Nús   £8 ¸	A!ÁAÁA!r   rB   ÚPSYCOPG_WAIT_FUNCÚwait_zHPSYCOPG_WAIT_FUNC should be the name of an available wait function; got Úwin32ÚSelectSelectorr-   )r   z	PQGen[RV]r   rd   r    úfloat | Noner7   r   )r   zPQGenConn[RV]r    rw   r7   r   )r7   Úbool)DÚ__doc__Ú
__future__r   Úosrj   r   ÚloggingÚ	selectorsÚasyncior   r   r   r   r   Ú r
   r;   Úabcr   r   r   r   Ú_enumsr   r   Ú_cmoduler   ÚRr9   ÚWr:   ÚRWÚWAIT_RWÚNONEr   r?   rA   ÚREADY_RWÚ	getLoggerÚ__name__ro   r(   r*   rK   rN   rV   ÚhasattrÚEPOLLONESHOTr]   ÚEPOLLERRr\   rZ   ra   rg   rf   re   rh   rr   Úwait_cÚ__annotations__ÚenvironÚfnameÚ
startswithÚglobalsÚImportErrorrB   ÚplatformÚgetattrrP   r4   r'   Ú<module>r—      s4  ðòõ #ã 	Û 
Û Û Û ß AÓ AÝ %å ß /Ó /ß 0Ý à	�‰€Ø	�‰€Ø
�'‰'€Ø�Z‰Z€
Ø
�'‰'€Ø
�'‰'€Ø�8‰8€à	ˆ×	Ñ	˜8Ó	$€ôôD ôF:ôz7ôzñD ˆ9�oÔ&à�×#Ñ# f§n¡nÑ4°v·±ÑFØ�×#Ñ# f§o¡oÑ5¸¿¹ÑGØ�×$Ñ$Ø�>‰>˜FŸO™OÑ+¨f¯o©oÑ=ñ?ð�Nð €Nô*ñZ ˆ9�nÔ%à�—‘Ø�—‘Ø�—‘ §¡Ñ/ð�Mð €Mô#óLñ* Ø�_‰_€Fð ƒð ˜"Ÿ*™*Ñ$Ø�J‰JÐ*Ñ+€EØ×Ñ˜GÔ$¨±W³YÑ(>ÙðØ�9ðó
ð 	
ñ ‹9�UÑ�Dñ
 �#—,‘, 'Ò)Ñ2DÔ2FØ�Dà×Ñ¡'¨)Ð5EÀtÓ"LÑLà�DáˆY˜Ô'ð �Dð �Dr4   