a
    lJh                  	   @   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yF   dZY n0 ddlmZm	Z	m
Z
mZ erzddlmZ ed G dd	 d	ejZG d
d dejjZdddeeee	eejef dddZe
e	e	ejdddZdS )z
Utilities.	to_threadopen_connection    N)TYPE_CHECKINGAnyCallableTuple)MySQLConnectionAbstractStreamWriterc                   @   s"   e Zd ZdZejdd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.
    N)writerreturnc                 C   s&   |j }|| _|| _|ddu| _dS )zQReplace stream writer.

        Args:
            writer: Stream Writer.
        Z
sslcontextN)	transportZ_stream_writer
_transportZget_extra_infoZ	_over_ssl)selfr   r    r   K/var/www/shaz/venv/lib/python3.9/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
   5   s   r
   c                   @   s.   e Zd ZdZdddejeedd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                   sT   | 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   )	_protocolZ_client_connected_cbZdrain_loop	start_tlsr   r   )r   r   r   r   r   protocolZnew_transportr   r   r   r   O   s    
zStreamWriter.start_tls)	r   r   r   r   ssl
SSLContextstrintr   r   r   r   r   r	   H   s   
i   )limit)hostportr$   kwdsr   c          	         sb   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>       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   o   s    ()funcargskwargsr   c                    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   r,   contextvarsZcopy_context	functoolspartialrunZrun_in_executor)r2   r3   r4   r(   ctxZ	func_callr   r   r   r      s    
)NN)r   __all__r   r5   r6   r    ImportErrortypingr   r   r   r   Zmysql.connector.aio.abstractsr   appendr
   r-   r	   r"   r#   r.   r   Futurer   r   r   r   r   <module>    s,   

( 