o
    #f9                     @   s   d Z ddgZddlZddlZddlZzddlZW n ey#   dZY nw ddlmZm	Z	m
Z
mZ er7ed G dd dejZG d	d dejjZ	dd
ddededede	deejef f
ddZde
de	de	dejfddZdS )z
Utilities.	to_threadopen_connection    N)TYPE_CHECKINGAnyCallableTupleStreamWriterc                   @   s$   e Zd ZdZdejddfddZdS )StreamReaderProtocolzExtends asyncio.streams.StreamReaderProtocol for adding start_tls().

    The ``start_tls()`` is based on ``asyncio.streams.StreamWriter`` introduced
    in Python 3.11. It provides the same functionality for older Python versions.
    writerreturnNc                 C   s&   |j }|| _|| _|ddu| _dS )zQReplace stream writer.

        Args:
            writer: Stream Writer.
        
sslcontextN)	transport_stream_writer
_transportget_extra_info	_over_ssl)selfr
   r    r   O/home/ubuntu/dev/venv/lib/python3.10/site-packages/mysql/connector/aio/utils.py_replace_writer:   s   z$StreamReaderProtocol._replace_writer)__name__
__module____qualname____doc__asyncior   r   r   r   r   r   r	   3   s    r	   c                	   @   s4   e Zd ZdZddddejdededdfdd	ZdS )
r   zExtends asyncio.streams.StreamWriter for adding start_tls().

    The ``start_tls()`` is based on ``asyncio.streams.StreamWriter`` introduced
    in Python 3.11. It provides the same functionality for older Python versions.
    N)server_hostnamessl_handshake_timeoutssl_contextr   r   r   c                   sV   | j jdu}| j }|  I dH  | jj| j|||||dI dH }|| _||  dS )zUpgrade an existing stream-based connection to TLS.

        Args:
            ssl_context: Configured SSL context.
            server_hostname: Server host name.
            ssl_handshake_timeout: SSL handshake timeout.
        N)server_sider   r   )	_protocol_client_connected_cbdrain_loop	start_tlsr   r   )r   r   r   r   r   protocolnew_transportr   r   r   r#   M   s   
zStreamWriter.start_tls)	r   r   r   r   ssl
SSLContextstrintr#   r   r   r   r   r   F   s    
i   )limithostportr*   kwdsr   c          	         sd   t  }t jj||d}t||d |j fdd| |fi |I dH \}}t| ||}||fS )a  A wrapper for create_connection() returning a (reader, writer) pair.

    This function is based on ``asyncio.streams.open_connection`` and adds a custom
    stream reader.

    MySQL expects TLS negotiation to happen in the middle of a TCP connection, not at
    the start.
    This function in conjunction with ``_StreamReaderProtocol`` and ``_StreamWriter``
    allows the TLS negotiation on an existing connection.

    Args:
        host: Server host name.
        port: Server port.
        limit: The buffer size limit used by the returned ``StreamReader`` instance.
               By default the limit is set to 64 KiB.

    Returns:
        tuple: Returns a pair of reader and writer objects that are instances of
               ``StreamReader`` and ``StreamWriter`` classes.
    )r*   loop)r.   c                      s    S )Nr   r   r$   r   r   <lambda>   s    z!open_connection.<locals>.<lambda>N)r   get_running_loopstreamsStreamReaderr	   create_connectionr   )	r+   r,   r*   r-   r.   readerr   _r
   r   r/   r   r   m   s   (funcargskwargsc                    s@   t  }t }tj|j| g|R i |}|d|I dH S )aQ  Asynchronously run function ``func`` in a separate thread.

    This function is based on ``asyncio.to_thread()`` introduced in Python 3.9, which
    provides the same functionality for older Python versions.

    Returns:
        coroutine: A coroutine that can be awaited to get the eventual result of
                   ``func``.
    N)r   r1   contextvarscopy_context	functoolspartialrunrun_in_executor)r7   r8   r9   r.   ctx	func_callr   r   r   r      s
   
)NN)r   __all__r   r:   r<   r&   ImportErrortypingr   r   r   r   appendr	   r2   r   r(   r)   r3   r   Futurer   r   r   r   r   <module>   s<   
(
 