§
    YŠtjš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j        Zej        Zej        Z ej!        Z"ej        Z#ej        Z$ej        Z% ej&        e'¦  «        Z(ej)        dk    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¦  «        r8eej1        ej2        z  eej1        ej3        z  e ej1        ej2        z  ej3        z  iZ4ni Z4d,d-d „Z5 e0ed!¦  «        r0eej6        eej7        e ej6        ej7        z  iZ8ej6        ej7        z   Z9ni Z8d,d-d"„Z:d/d$„Z;erej<        Z<d%e=d&<   d'ej>        v rNej>        d'         Z?e? @                    d(¦  «        re? eA¦   «         vr eBd)e?›�¦  «        ‚ eA¦   «         e?         ZCdS erej)        dk    r e;¦   «         se<ZCdS ej         eDed*d¦  «        u re/ZCdS  e0ed!¦  «        re:ZCdS e+ZCdS )0zÒ
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Úwin32ÚfilenoÚintÚreturnÚNonec                ó~   — 	 t          j        | ¦  «         dS # 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)r   Úexs     úM/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/psycopg/waiting.pyÚ_check_fd_closedr    (   sU   € ð	IÝŒH�VÑÔÐÐÐøÝð 	Ið 	Ið 	IÝÔ$Ð%?Ñ@Ô@ÀbÐHøøøøð	Iøøøs   ‚ ˜
<¢7·<c                ó   — d S ©N© )r   s    r   r    r    4   s   € Øˆó    ç        Úgenú	PQGen[RV]ÚintervalÚfloatr   c                óâ  — |€t          d¦  «        ‚	 t          | ¦  «        }t          ¦   «         5 }|                     ||¦  «         	 |                     |¬¦  «        x}s*t          |¦  «         |                      t          ¦  «         ŒC|d         d         }|                      |¦  «        }|                     ||¦  «         Œ|# 1 swxY w Y   dS # 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 anymoreT©Útimeoutr   r	   )
Ú
ValueErrorÚnextr   ÚregisterÚselectr    ÚsendÚ
READY_NONEÚStopIterationÚvalue)	r&   r   r(   ÚsÚselÚrlistÚreadyr   Úrvs	            r   Úwait_selectorr;   8   s1  € ð ÐÝÐ@ÑAÔAÐAðÝ�‰IŒIˆÝÑÔð 	( #Ø�LŠL˜ Ñ#Ô#Ð#ð	(Ø!$§¢°H Ñ!=Ô!=Ð=˜ð å$ VÑ,Ô,Ð,Ø—H’H�ZÑ(Ô(Ð(Øà˜aœ œ�Ø—H’H˜U‘O”O�Ø—’˜V QÑ'Ô'Ð'ð	(ð	(ð 	(ð 	(ð 	(øøøð 	(ð 	(ð 	(ð 	(ð 	(ð 	(øõ ð ð ð Ø”ˆØˆ	ˆ	ˆ	ˆ	ˆ	ˆ	øøøøðøøøs;   “C °BCÃCÃC ÃCÃC Ã
C.ÃC)Ã#C.Ã)C.úPQGenConn[RV]c                óú  — |€t          d¦  «        ‚	 t          | ¦  «        \  }}t          ¦   «         5 }|                     ||¦  «         	 |                     |¬¦  «        x}s|                      t          ¦  «         Œ4|                     |¦  «         |d         d         }|                      |¦  «        \  }}|                     ||¦  «         Œ…# 1 swxY w Y   dS # 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+   Tr,   r   r	   )
r.   r/   r   r0   r1   r2   r3   Ú
unregisterr4   r5   )	r&   r(   r   r6   r7   r8   r9   r   r:   s	            r   Ú	wait_connr?   \   s=  € ð ÐÝÐ@ÑAÔAÐAðÝ˜‘I”I‰	ˆ�ÝÑÔð 
	( #Ø�LŠL˜ Ñ#Ô#Ð#ð(Ø!$§¢°H Ñ!=Ô!=Ð=˜ð Ø—H’H�ZÑ(Ô(Ð(Øà—’˜vÑ&Ô&Ð&Ø˜aœ œ�ØŸHšH U™OœO‘	�˜Ø—’˜V QÑ'Ô'Ð'ð(ð
	(ð 
	(ð 
	(ð 
	(øøøð 
	(ð 
	(ð 
	(ð 
	(ð 
	(ð 
	(øõ ð ð ð Ø”ˆØˆ	ˆ	ˆ	ˆ	ˆ	ˆ	øøøøðøøøs;   “ C ³BCÃCÃC ÃCÃC Ã
C:Ã'C5Ã/C:Ã5C:c              ƒ  ó„  ‡
‡K  — |€t          d¦  «        ‚t          ¦   «         Š
t          ¦   «         }dˆ
ˆfd„}	 t          | ¦  «        }	 |t          z  }|t
          z  }|s|st          j        d	|› �¦  «        ‚‰
                     ¦   «          d
Š|r| 	                    ||t          ¦  «         |r|                     ||t          ¦  «         	 	 t          ‰
                     ¦   «         |¦  «        ƒ d{V —† n# t          $ r Y nw xY w|r|                     |¦  «         |r|                     |¦  «         n4# |r|                     |¦  «         |r|                     |¦  «         w w xY w|                      ‰¦  «        }�Œ6# t&          $ r}t          j        d¦  «        |‚d}~wt*          $ r}|j        }	|	cY d}~S d}~ww xY 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+   Ústater   r   r   c                ó:   •— ‰| z  Š‰                      ¦   «          d S r"   ©Úset©rA   Úevr9   s    €€r   Úwakeupzwait_async.<locals>.wakeup•   s   ø€ à�‰ˆØ
�Š‰Œˆˆˆr$   Túbad poll status: r   r   ©rA   r   r   r   )r.   r   r   r/   ÚWAIT_RÚWAIT_Wr   ÚInternalErrorÚclearÚ
add_readerÚREADY_RÚ
add_writerÚREADY_Wr   Úwaitr   Úremove_readerÚremove_writerr2   ÚOSErrorr   r4   r5   )r&   r   r(   ÚlooprG   r6   ÚreaderÚwriterr   r:   rF   r9   s             @@r   Ú
wait_asyncrY   ~   sE  øøè è € ð ÐÝÐ@ÑAÔAÐAõ 
‰Œ€BÝÑÔ€Dðð ð ð ð ð ð ð
Ý�‰IŒIˆð	 Ø�‘ZˆFØ�‘ZˆFØð ?˜fð ?Ý”oÐ&=¸!Ð&=Ð&=Ñ>Ô>Ð>Ø�HŠH‰JŒJˆJØˆEØð 9Ø—’ ¨µÑ8Ô8Ð8Øð 9Ø—’ ¨µÑ8Ô8Ð8ð	/ðÝ" 2§7¢7¡9¤9¨hÑ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7øÝ#ð ð ð Ø�Dðøøøð ð /Ø×&Ò& vÑ.Ô.Ð.Øð /Ø×&Ò& vÑ.Ô.Ð.øøð ð /Ø×&Ò& vÑ.Ô.Ð.Øð /Ø×&Ò& vÑ.Ô.Ð.Ð.ð/øøøà—’˜‘”ˆAñ+	 øõ. ð Eð Eð EåÔ Ð!;Ñ<Ô<À"ÐDøøøøÝð ð ð Ø”ˆØˆ	ˆ	ˆ	ˆ	ˆ	ˆ	øøøøðøøøs`   ºBF  Ã(C6 Ã5D5 Ã6
DÄ D5 ÄDÄD5 Ä/F  Ä51E&Å&F  Æ 
F?Æ
FÆF?Æ,F:Æ4F?Æ:F?c              ƒ  ó„  ‡
‡K  — |€t          d¦  «        ‚t          ¦   «         Š
t          ¦   «         }dˆ
ˆfd„}	 t          | ¦  «        \  }}	 |t          z  }|t
          z  }|s|st          j        d	|› �¦  «        ‚‰
                     ¦   «          d
Š|r| 	                    ||t          ¦  «         |r|                     ||t          ¦  «         	 |r:	 t          ‰
                     ¦   «         |¦  «        ƒ d{V —† n*# t          $ r Y nw xY w‰
                     ¦   «         ƒ d{V —† |r|                     |¦  «         |r|                     |¦  «         n4# |r|                     |¦  «         |r|                     |¦  «         w w xY w|                      ‰¦  «        \  }}�ŒU# t&          $ r}|j        }	|	cY d}~S d}~ww xY 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+   rA   r   r   r   c                ó4   •— | Š‰                      ¦   «          d S r"   rC   rE   s    €€r   rG   zwait_conn_async.<locals>.wakeupÒ   s   ø€ àˆØ
�Š‰Œˆˆˆr$   TrH   r   rI   )r.   r   r   r/   rJ   rK   r   rL   rM   rN   rO   rP   rQ   r   rR   r   rS   rT   r2   r4   r5   )r&   r(   rV   rG   r   r6   rW   rX   r   r:   rF   r9   s             @@r   Úwait_conn_asyncr\   »   sA  øøè è € ð ÐÝÐ@ÑAÔAÐAõ 
‰Œ€BÝÑÔ€Dðð ð ð ð ð ð ð
Ý˜‘I”I‰	ˆ�ð	(Ø�‘ZˆFØ�‘ZˆFØð ?˜fð ?Ý”oÐ&=¸!Ð&=Ð&=Ñ>Ô>Ð>Ø�HŠH‰JŒJˆJØˆEØð 9Ø—’ ¨µÑ8Ô8Ð8Øð 9Ø—’ ¨µÑ8Ô8Ð8ð/Øð $ðÝ& r§w¢w¡y¤y°(Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;øÝ'ð ð ð Ø˜ðøøøð Ÿ'š'™)œ)�O�O�O�O�O�O�Oàð /Ø×&Ò& vÑ.Ô.Ð.Øð /Ø×&Ò& vÑ.Ô.Ð.øøð ð /Ø×&Ò& vÑ.Ô.Ð.Øð /Ø×&Ò& vÑ.Ô.Ð.Ð.ð/øøøàŸš ™œ‰IˆF�Añ1	(øõ4 ð ð ð Ø”ˆØˆ	ˆ	ˆ	ˆ	ˆ	ˆ	øøøøðøøøsZ   ºBF" ÃE Ã(C; Ã:E Ã;
DÄE ÄDÄE Ä%/F" Å1FÆF" Æ"
F?Æ,F:Æ4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  }	|  
                    |	¦  «        }Œ…# 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#   Tr   r   )r.   r/   r1   rJ   rK   r    r   r   rO   rQ   r2   rU   r4   r5   )r&   r   r(   r6   ÚemptyÚfnlistÚrlÚwlÚxlr9   r   r:   s               r   Úwait_selectrc   û   s>  € ð ÐÝÐ@ÑAÔAÐAðÝ�‰IŒIˆàˆØ�ˆð	 ÝœØ�f™*Ð/��¨%Ø�f™*Ð/��¨%ØØñ	ô ‰JˆB��Bð ð EÝ  Ñ(Ô(Ð(åÔ(Ð)CÑDÔDÐDØˆEØð  Ý�Øð !Ø�Ñ �à—’˜‘”ˆAð#	 øõ& ð Eð Eð EåÔ Ð!;Ñ<Ô<À"ÐDøøøøÝð ð ð Ø”ˆØˆ	ˆ	ˆ	ˆ	ˆ	ˆ	øøøøðøøøs*   “BB- Â-
C,Â7CÃC,ÃC'Ã!C,Ã'C,ÚEpollSelectorc                ó�  — |€t          d¦  «        ‚	 t          | ¦  «        }|dk     rd}t          j        ¦   «         5 }t          |         }|                     ||¦  «         	 |                     |¦  «        x}s*t          |¦  «         |                      t          ¦  «         ŒB|d         d         }d}|t          j
        z  rt          }|t          j        z  r
|t          z  }|                      |¦  «        }t          |         }|                     ||¦  «         Œ¹# 1 swxY w Y   dS # 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%   Tr	   )r.   r/   r1   ÚepollÚ_epoll_evmasksr0   Úpollr    r2   r3   ÚEPOLLINrO   ÚEPOLLOUTrQ   Úmodifyr4   r5   )r&   r   r(   r6   rf   ÚevmaskÚfileevsrF   r9   r   r:   s              r   Ú
wait_epollrn   -  sƒ  € ð  ÐÝÐ@ÑAÔAÐAðÝ�‰IŒ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”O�Ý'¨Ô*�Ø—’˜V VÑ,Ô,Ð,ð-ð	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øõ$ ð ð ð Ø”ˆØˆ	ˆ	ˆ	ˆ	ˆ	ˆ	øøøøðøøøs;   “*D( ½CDÄDÄD( Ä"DÄ#D( Ä(
EÄ2E Ä:EÅ EÚPollSelectorc                óÚ  — |€t          d¦  «        ‚	 t          | ¦  «        }|dk     rd}nt          |dz  ¦  «        }t          j        ¦   «         }t
          |         }|                     ||¦  «         	 |                     |¦  «        x}s|                      t          ¦  «         Œ3|d         d         }d}|t          j	        z  rt          }|t          j        z  r
|t          z  }|s-|t          z  r#t          |¦  «         t          j        d¦  «        ‚|                      |¦  «        }t
          |         }|                     ||¦  «         ŒÙ# 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     @�@Tr	   r   )r.   r/   r   r1   rh   Ú_poll_evmasksr0   r2   r3   ÚPOLLINrO   ÚPOLLOUTrQ   ÚPOLL_BADr    r   r   rk   r4   r5   )r&   r   r(   r6   rh   rl   rm   rF   r9   r   r:   s              r   Ú	wait_pollru   g  s„  € ð ÐÝÐ@ÑAÔAÐAð#Ý�‰IŒIˆà�aŠ<ˆ<ØˆHˆHå˜8 fÑ,Ñ-Ô-ˆHåŒ{‰}Œ}ˆÝ˜qÔ!ˆØ�Š�f˜fÑ%Ô%Ð%ð	(Ø#Ÿyšy¨Ñ2Ô2Ð2�Gð Ø—’�Ñ$Ô$Ð$Øà˜”˜A”ˆBàˆEØ•F”MÑ!ð  Ý�Ø•F”NÑ"ð !Ø�Ñ �àð E˜R¥(™]ð EÝ  Ñ(Ô(Ð(åÔ(Ð)CÑDÔDÐDà—’˜‘”ˆAÝ" 1Ô%ˆFØ�KŠK˜ Ñ'Ô'Ð'ð)	(øõ, ð ð ð Ø”ˆØˆ	ˆ	ˆ	ˆ	ˆ	ˆ	øøøøðøøøs   “D:E Å
E*ÅE%ÅE*Å%E*Úboolc                 óÞ   — t           j                             d¦  «        x} rK	 |                      d¦  «        rdS n2# t          $ r%}t
                               d|¦  «         Y d}~nd}~ww xY wdS )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.monkeyr1   Tz+failed to detect gevent monkey-patching: %sNF)ÚsysÚmodulesÚgetÚis_module_patchedr   ÚloggerÚwarning)Úmr   s     r   Ú_is_select_patchedr   •  s”   € õ ŒK�OŠO˜OÑ,Ô,Ð,€qð Nð	NØ×"Ò" 8Ñ,Ô,ð Ø�tðøåð 	Nð 	Nð 	NÝ�NŠNÐHÈ"ÑMÔMÐMÐMÐMÐMÐMÐMøøøøð	Nøøøð ˆ5s   £; »
A*ÁA%Á%A*r   rR   ÚPSYCOPG_WAIT_FUNCÚwait_zHPSYCOPG_WAIT_FUNC should be the name of an available wait function; got ÚSelectSelector)r   r   r   r   )r%   )r&   r'   r   r   r(   r)   r   r   )r&   r<   r(   r)   r   r   )r   rv   )EÚ__doc__Ú
__future__r   r   rx   r1   ÚloggingÚ	selectorsÚasyncior   r   r   r   r   Ú r
   r   Úabcr   r   r   r   Ú_enumsr   r   Ú_cmoduler   ÚRrJ   ÚWrK   ÚRWÚWAIT_RWÚNONEr3   rO   rQ   ÚREADY_RWÚ	getLoggerÚ__name__r|   Úplatformr    r;   r?   rY   r\   rc   ÚhasattrÚEPOLLONESHOTri   rj   rg   rn   rr   rs   rq   rt   ru   r   Úwait_cÚ__annotations__ÚenvironÚfnameÚ
startswithÚglobalsÚImportErrorrR   Úgetattrr#   r$   r   ú<module>rŸ      s  ððð ð ð #Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø 
€
€
€
Ø €€€Ø €€€Ø Ð Ð Ð Ø AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AØ %Ð %Ð %Ð %Ð %Ð %à Ð Ð Ð Ð Ð Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ø "Ð "Ð "Ð "Ð "Ð "Ø  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð à	Œ€Ø	Œ€Ø
Œ'€ØŒZ€
Ø
Œ'€Ø
Œ'€ØŒ8€à	ˆÔ	˜8Ñ	$Ô	$€ð „<�7ÒÐðIð Ið Ið Ið Iðð ð ð ð!ð !ð !ð !ð !ðHð ð ð ð ðD:ð :ð :ð :ð :ðz:ð :ð :ð :ð :ð@%ð %ð %ð %ð %ðP €7ˆ9�oÑ&Ô&ð à�Ô# f¤nÑ4Ø�Ô# f¤oÑ5Ø�Ô$ v¤~Ñ5¸¼ÑGð€N€Nð €Nð,ð ,ð ,ð ,ð ,ð^ €7ˆ9�nÑ%Ô%ð à�”Ø�”Ø�” ¤Ñ/ð€Mð
 ” ¤Ñ/Ð0€H€Hà€Mð+ð +ð +ð +ð +ð\ð ð ð ð( ð ØŒ_€Fð €€�ð ˜"œ*Ð$Ð$ØŒJÐ*Ô+€EØ×Ò˜GÑ$Ô$ð 
¨°W°W±Y´YÐ(>Ð(>ØˆkðØðð ñ
ô 
ð 	
ð ˆ7‰9Œ9�UÔ€D€D€Dð
 ð �#”, 'Ò)Ð)Ð2DÐ2DÑ2FÔ2FÐ)Ø€D€D€DàÔ ' '¨)Ð5EÀtÑ"LÔ"LÐLÐLà€D€D€Dà€WˆY˜Ñ'Ô'ð ð €D€D€Dð €D€D€Dr$   