U
    cc%                     @   s   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 ddlm
Z
 dd	lmZ G d
d dZG dd deZG dd deZG dd deZG dd dZG dd deZeZdS )uV  
.. dialect:: mysql+aiomysql
    :name: aiomysql
    :dbapi: aiomysql
    :connectstring: mysql+aiomysql://user:password@host:port/dbname[?key=value&key=value...]
    :url: https://github.com/aio-libs/aiomysql

.. warning:: The aiomysql dialect is not currently tested as part of
   SQLAlchemy’s continuous integration. As of September, 2021 the driver
   appears to be unmaintained and no longer functions for Python version 3.10,
   and additionally depends on a significantly outdated version of PyMySQL.
   Please refer to the :ref:`asyncmy` dialect for current MySQL/MariaDB asyncio
   functionality.

The aiomysql dialect is SQLAlchemy's second Python asyncio dialect.

Using a special asyncio mediation layer, the aiomysql dialect is usable
as the backend for the :ref:`SQLAlchemy asyncio <asyncio_toplevel>`
extension package.

This dialect should normally be used only with the
:func:`_asyncio.create_async_engine` engine creation function::

    from sqlalchemy.ext.asyncio import create_async_engine
    engine = create_async_engine("mysql+aiomysql://user:pass@hostname/dbname?charset=utf8mb4")


   )MySQLDialect_pymysql   )pool)util)AdaptedConnection)asyncio)await_fallback)
await_onlyc                   @   s   e Zd ZdZdZdd Zedd Zedd Zed	d
 Z	e	j
dd
 Z	edd Zdd Zd#ddZdd Zdd Zdd Zdd Zdd Zdd Zd$dd Zd!d" ZdS )%AsyncAdapt_aiomysql_cursorF)_adapt_connection_connectionawait__cursor_rowsc                 C   s:   || _ |j| _|j| _| j }| | | _g | _d S N)r   r   r   cursor
__aenter__r   r   selfZadapt_connectionr    r   F/tmp/pip-unpacked-wheel-8u86ls_i/sqlalchemy/dialects/mysql/aiomysql.py__init__7   s    
z#AsyncAdapt_aiomysql_cursor.__init__c                 C   s   | j jS r   )r   descriptionr   r   r   r   r   B   s    z&AsyncAdapt_aiomysql_cursor.descriptionc                 C   s   | j jS r   )r   rowcountr   r   r   r   r   F   s    z#AsyncAdapt_aiomysql_cursor.rowcountc                 C   s   | j jS r   r   	arraysizer   r   r   r   r   J   s    z$AsyncAdapt_aiomysql_cursor.arraysizec                 C   s   || j _d S r   r   r   valuer   r   r   r   N   s    c                 C   s   | j jS r   )r   	lastrowidr   r   r   r   r   R   s    z$AsyncAdapt_aiomysql_cursor.lastrowidc                 C   s   g | j d d < d S r   r   r   r   r   r   closeV   s    z AsyncAdapt_aiomysql_cursor.closeNc                 C   s   |  | ||S r   )r   _execute_async)r   	operation
parametersr   r   r   execute`   s    z"AsyncAdapt_aiomysql_cursor.executec                 C   s   |  | ||S r   )r   _executemany_asyncr   r#   Zseq_of_parametersr   r   r   executemanyc   s    
z&AsyncAdapt_aiomysql_cursor.executemanyc                    s   | j j4 I d H d |d kr.| j|I d H }n| j||I d H }| js^t| j I d H | _|W  5 Q I d H R  S Q I d H R X d S r   )r   _execute_mutexr   r%   server_sidelistfetchallr   )r   r#   r$   resultr   r   r   r"   h   s    z)AsyncAdapt_aiomysql_cursor._execute_asyncc                    sH   | j j4 I d H ( | j||I d H W  5 Q I d H R  S Q I d H R X d S r   )r   r)   r   r(   r'   r   r   r   r&   w   s    z-AsyncAdapt_aiomysql_cursor._executemany_asyncc                 G   s   d S r   r   )r   Z
inputsizesr   r   r   setinputsizes{   s    z(AsyncAdapt_aiomysql_cursor.setinputsizesc                 c   s   | j r| j dV  q d S N    r   popr   r   r   r   __iter__~   s    z#AsyncAdapt_aiomysql_cursor.__iter__c                 C   s   | j r| j dS d S d S r/   r1   r   r   r   r   fetchone   s    z#AsyncAdapt_aiomysql_cursor.fetchonec                 C   s8   |d kr| j }| jd| }| j|d  | jd d < |S r/   )r   r   )r   sizeretvalr   r   r   	fetchmany   s
    z$AsyncAdapt_aiomysql_cursor.fetchmanyc                 C   s    | j d d  }g | j d d < |S r   r    )r   r6   r   r   r   r,      s    z#AsyncAdapt_aiomysql_cursor.fetchall)N)N)__name__
__module____qualname__r*   	__slots__r   propertyr   r   r   setterr   r!   r%   r(   r"   r&   r.   r3   r4   r7   r,   r   r   r   r   r
   -   s.   







r
   c                   @   s>   e Zd ZdZdZdd Zdd Zdd Zdd
dZdd Z	d	S )AsyncAdapt_aiomysql_ss_cursorr   Tc                 C   s<   || _ |j| _|j| _| j|jjj}| | | _d S r   )	r   r   r   r   dbapiaiomysqlZSSCursorr   r   r   r   r   r   r      s    z&AsyncAdapt_aiomysql_ss_cursor.__init__c                 C   s$   | j d k	r | | j   d | _ d S r   )r   r   r!   r   r   r   r   r!      s    
z#AsyncAdapt_aiomysql_ss_cursor.closec                 C   s   |  | j S r   )r   r   r4   r   r   r   r   r4      s    z&AsyncAdapt_aiomysql_ss_cursor.fetchoneNc                 C   s   |  | jj|dS )N)r5   )r   r   r7   )r   r5   r   r   r   r7      s    z'AsyncAdapt_aiomysql_ss_cursor.fetchmanyc                 C   s   |  | j S r   )r   r   r,   r   r   r   r   r,      s    z&AsyncAdapt_aiomysql_ss_cursor.fetchall)N)
r8   r9   r:   r;   r*   r   r!   r4   r7   r,   r   r   r   r   r>      s   
r>   c                   @   sZ   e Zd ZeeZdZdd Zdd Zdd Z	dd	 Z
dddZdd Zdd Zdd ZdS )AsyncAdapt_aiomysql_connection)r?   r   r)   c                 C   s   || _ || _t | _d S r   )r?   r   r   Lockr)   )r   r?   
connectionr   r   r   r      s    z'AsyncAdapt_aiomysql_connection.__init__c                 C   s   |  | j|S r   )r   r   ping)r   Z	reconnectr   r   r   rD      s    z#AsyncAdapt_aiomysql_connection.pingc                 C   s
   | j  S r   )r   character_set_namer   r   r   r   rE      s    z1AsyncAdapt_aiomysql_connection.character_set_namec                 C   s   |  | j| d S r   )r   r   
autocommitr   r   r   r   rF      s    z)AsyncAdapt_aiomysql_connection.autocommitFc                 C   s   |rt | S t| S d S r   )r>   r
   )r   r*   r   r   r   r      s    z%AsyncAdapt_aiomysql_connection.cursorc                 C   s   |  | j  d S r   )r   r   rollbackr   r   r   r   rG      s    z'AsyncAdapt_aiomysql_connection.rollbackc                 C   s   |  | j  d S r   )r   r   commitr   r   r   r   rH      s    z%AsyncAdapt_aiomysql_connection.commitc                 C   s   | j   d S r   )r   r!   r   r   r   r   r!      s    z$AsyncAdapt_aiomysql_connection.closeN)F)r8   r9   r:   staticmethodr	   r   r;   r   rD   rE   rF   r   rG   rH   r!   r   r   r   r   rA      s   
rA   c                   @   s   e Zd ZdZeeZdS )&AsyncAdaptFallback_aiomysql_connectionr   N)r8   r9   r:   r;   rI   r   r   r   r   r   r   rJ      s   rJ   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )AsyncAdapt_aiomysql_dbapic                 C   s   || _ || _d| _|   d S )Nformat)r@   pymysqlZ
paramstyle_init_dbapi_attributes)r   r@   rM   r   r   r   r      s    z"AsyncAdapt_aiomysql_dbapi.__init__c                 C   s@   dD ]}t | |t| j| qdD ]}t | |t| j| q"d S )N)WarningErrorInterfaceErrorZ	DataErrorZDatabaseErrorZOperationalErrorrQ   ZIntegrityErrorZProgrammingErrorZInternalErrorZNotSupportedError)NUMBERSTRINGZDATETIMEBINARY	TIMESTAMPBinary)setattrgetattrr@   rM   )r   namer   r   r   rN      s    z0AsyncAdapt_aiomysql_dbapi._init_dbapi_attributesc                 O   sJ   | dd}t|r.t| t| jj||S t| t| jj||S d S Nasync_fallbackF)	r2   r   asboolrJ   r   r@   connectrA   r	   )r   argkwr[   r   r   r   r]      s    
z!AsyncAdapt_aiomysql_dbapi.connectN)r8   r9   r:   r   rN   r]   r   r   r   r   rK      s   rK   c                       sd   e Zd ZdZdZdZeZdZe	dd Z
e	dd Z fddZ fd	d
Zdd Zdd Z  ZS )MySQLDialect_aiomysqlr@   Tc                 C   s   t tdtdS )Nr@   rM   )rK   
__import__)clsr   r   r   r?     s     zMySQLDialect_aiomysql.dbapic                 C   s(   |j dd}t|rtjS tjS d S rZ   )querygetr   r\   r   ZFallbackAsyncAdaptedQueuePoolZAsyncAdaptedQueuePool)rb   urlr[   r   r   r   get_pool_class  s    
z$MySQLDialect_aiomysql.get_pool_classc                    s   t t| j|tddddS )Nuserdb)usernameZdatabase)Z_translate_args)superr`   create_connect_argsdict)r   re   	__class__r   r   rk   &  s    
 
z)MySQLDialect_aiomysql.create_connect_argsc                    s0   t t| |||rdS t| }d|kS d S )NTznot connected)rj   r`   is_disconnectstrlower)r   erC   r   Zstr_erm   r   r   ro   +  s    
  z#MySQLDialect_aiomysql.is_disconnectc                 C   s   ddl m} |jS )Nr0   )CLIENT)Zpymysql.constantsrs   Z
FOUND_ROWS)r   rs   r   r   r   _found_rows_client_flag4  s    z-MySQLDialect_aiomysql._found_rows_client_flagc                 C   s   |j S r   )r   )r   rC   r   r   r   get_driver_connection9  s    z+MySQLDialect_aiomysql.get_driver_connection)r8   r9   r:   ZdriverZsupports_statement_cacheZsupports_server_side_cursorsr>   Z	_sscursorZis_asyncclassmethodr?   rf   rk   ro   rt   ru   __classcell__r   r   rm   r   r`     s   

		r`   N)__doc__rM   r    r   r   Zenginer   Zutil.concurrencyr   r   r	   r
   r>   rA   rJ   rK   r`   dialectr   r   r   r   <module>   s   i#00