3
a#                 @   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	 G d	d
 d
Z
G dd de
ZG dd dZG dd deZG dd dZG dd deZeZdS )a  
.. 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

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")

Unicode
-------

Please see :ref:`mysql_unicode` for current recommendations on unicode
handling.


   )MySQLDialect_pymysql   )pool)util)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j }| j|j | _g | _d S )N)r
   r   r   cursor
__aenter__r   r   )selfadapt_connectionr    r   H/tmp/pip-build-6_cqtusv/SQLAlchemy/sqlalchemy/dialects/mysql/aiomysql.py__init__5   s    
z#AsyncAdapt_aiomysql_cursor.__init__c             C   s   | j jS )N)r   description)r   r   r   r   r   @   s    z&AsyncAdapt_aiomysql_cursor.descriptionc             C   s   | j jS )N)r   rowcount)r   r   r   r   r   D   s    z#AsyncAdapt_aiomysql_cursor.rowcountc             C   s   | j jS )N)r   	arraysize)r   r   r   r   r   H   s    z$AsyncAdapt_aiomysql_cursor.arraysizec             C   s   || j _d S )N)r   r   )r   valuer   r   r   r   L   s    c             C   s   | j jS )N)r   	lastrowid)r   r   r   r   r   P   s    z$AsyncAdapt_aiomysql_cursor.lastrowidc             C   s   g | j d d < d S )N)r   )r   r   r   r   closeT   s    z AsyncAdapt_aiomysql_cursor.closeNc             C   s   | j | j||S )N)r   _execute_async)r   	operation
parametersr   r   r   execute^   s    z"AsyncAdapt_aiomysql_cursor.executec             C   s   | j | j||S )N)r   _executemany_async)r   r   seq_of_parametersr   r   r   executemanya   s    z&AsyncAdapt_aiomysql_cursor.executemanyc          
      sr   | j j4 I d H R |d kr.| jj|I d H }n| jj||I d H }| js^t| jj I d H | _|S Q I d H R X d S )N)r
   _execute_mutexr   r   server_sidelistfetchallr   )r   r   r   resultr   r   r   r   f   s    z)AsyncAdapt_aiomysql_cursor._execute_asyncc          
      s6   | j j4 I d H  | jj||I d H S Q I d H R X d S )N)r
   r#   r   r"   )r   r   r!   r   r   r   r    u   s    z-AsyncAdapt_aiomysql_cursor._executemany_asyncc             G   s   d S )Nr   )r   Z
inputsizesr   r   r   setinputsizesy   s    z(AsyncAdapt_aiomysql_cursor.setinputsizesc             c   s   x| j r| j jdV  qW d S )N    )r   pop)r   r   r   r   __iter__|   s    z#AsyncAdapt_aiomysql_cursor.__iter__c             C   s   | j r| j jdS d S d S )Nr)   )r   r*   )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 )Nr)   )r   r   )r   sizeretvalr   r   r   	fetchmany   s
    z$AsyncAdapt_aiomysql_cursor.fetchmanyc             C   s    | j d d  }g | j d d < |S )N)r   )r   r.   r   r   r   r&      s    z#AsyncAdapt_aiomysql_cursor.fetchall)r
   r   r   r   r   )N)N)__name__
__module____qualname__r$   	__slots__r   propertyr   r   r   setterr   r   r   r"   r   r    r(   r+   r,   r/   r&   r   r   r   r   r	   +   s,       


r	   c               @   s>   e Zd Zf ZdZdd Zdd Zdd Zdd	d
Zdd Z	dS )AsyncAdapt_aiomysql_ss_cursorTc             C   s<   || _ |j| _|j| _| jj|jjj}| j|j | _d S )N)	r
   r   r   r   dbapiaiomysqlZSSCursorr   r   )r   r   r   r   r   r   r      s    z&AsyncAdapt_aiomysql_ss_cursor.__init__c             C   s$   | j d k	r | j| j j  d | _ d S )N)r   r   r   )r   r   r   r   r      s    
z#AsyncAdapt_aiomysql_ss_cursor.closec             C   s   | j | jj S )N)r   r   r,   )r   r   r   r   r,      s    z&AsyncAdapt_aiomysql_ss_cursor.fetchoneNc             C   s   | j | jj|dS )N)r-   )r   r   r/   )r   r-   r   r   r   r/      s    z'AsyncAdapt_aiomysql_ss_cursor.fetchmanyc             C   s   | j | jj S )N)r   r   r&   )r   r   r   r   r&      s    z&AsyncAdapt_aiomysql_ss_cursor.fetchall)N)
r0   r1   r2   r3   r$   r   r   r,   r/   r&   r   r   r   r   r6      s   
r6   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_connectionr7   r   r#   c             C   s   || _ || _tj | _d S )N)r7   r   r   Lockr#   )r   r7   
connectionr   r   r   r      s    z'AsyncAdapt_aiomysql_connection.__init__c             C   s   | j | jj|S )N)r   r   ping)r   Z	reconnectr   r   r   r<      s    z#AsyncAdapt_aiomysql_connection.pingc             C   s
   | j j S )N)r   character_set_name)r   r   r   r   r=      s    z1AsyncAdapt_aiomysql_connection.character_set_namec             C   s   | j | jj| d S )N)r   r   
autocommit)r   r   r   r   r   r>      s    z)AsyncAdapt_aiomysql_connection.autocommitFc             C   s   |rt | S t| S d S )N)r6   r	   )r   r$   r   r   r   r      s    z%AsyncAdapt_aiomysql_connection.cursorc             C   s   | j | jj  d S )N)r   r   rollback)r   r   r   r   r?      s    z'AsyncAdapt_aiomysql_connection.rollbackc             C   s   | j | jj  d S )N)r   r   commit)r   r   r   r   r@      s    z%AsyncAdapt_aiomysql_connection.commitc             C   s   | j j  d S )N)r   r   )r   r   r   r   r      s    z$AsyncAdapt_aiomysql_connection.closeN)r7   r   r#   )F)r0   r1   r2   staticmethodr   r   r3   r   r<   r=   r>   r   r?   r@   r   r   r   r   r   r9      s   
r9   c               @   s   e Zd Zf ZeeZdS )&AsyncAdaptFallback_aiomysql_connectionN)r0   r1   r2   r3   rA   r   r   r   r   r   r   rB      s   rB   c               @   s$   e Zd Zdd Zdd Zdd ZdS )AsyncAdapt_aiomysql_dbapic             C   s   || _ || _d| _| j  d S )Nformat)r8   pymysqlZ
paramstyle_init_dbapi_attributes)r   r8   rE   r   r   r   r      s    z"AsyncAdapt_aiomysql_dbapi.__init__c             C   sH   x dD ]}t | |t| j| qW x dD ]}t | |t| j| q(W d S )NWarningErrorInterfaceError	DataErrorDatabaseErrorOperationalErrorIntegrityErrorProgrammingErrorInternalErrorNotSupportedErrorNUMBERSTRINGDATETIMEBINARY	TIMESTAMPBinary)rG   rH   rI   rJ   rK   rL   rI   rM   rN   rO   rP   )rQ   rR   rS   rT   rU   rV   )setattrgetattrr8   rE   )r   namer   r   r   rF      s*                   z0AsyncAdapt_aiomysql_dbapi._init_dbapi_attributesc             O   sJ   |j dd}tj|r.t| t| jj||S t| t| jj||S d S )Nasync_fallbackF)	r*   r   asboolrB   r   r8   connectr9   r   )r   argkwrZ   r   r   r   r\      s    
z!AsyncAdapt_aiomysql_dbapi.connectN)r0   r1   r2   r   rF   r\   r   r   r   r   rC      s   rC   c                   s\   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  ZS )MySQLDialect_aiomysqlr8   Tc             C   s   t tdtdS )Nr8   rE   )rC   
__import__)clsr   r   r   r7     s    zMySQLDialect_aiomysql.dbapic             C   s(   |j jdd}tj|rtjS tjS d S )NrZ   F)querygetr   r[   r   ZFallbackAsyncAdaptedQueuePoolZAsyncAdaptedQueuePool)ra   urlrZ   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   rd   )	__class__r   r   rj   $  s    
z)MySQLDialect_aiomysql.create_connect_argsc                s0   t t| j|||rdS t|j }d|kS d S )NTznot connected)ri   r_   is_disconnectstrlower)r   er;   r   Zstr_e)rl   r   r   rm   )  s
    

z#MySQLDialect_aiomysql.is_disconnectc             C   s   ddl m} |jS )Nr)   )CLIENT)Zpymysql.constantsrq   Z
FOUND_ROWS)r   rq   r   r   r   _found_rows_client_flag2  s    z-MySQLDialect_aiomysql._found_rows_client_flag)r0   r1   r2   ZdriverZsupports_statement_cacheZsupports_server_side_cursorsr6   Z	_sscursorZis_asyncclassmethodr7   re   rj   rm   rr   __classcell__r   r   )rl   r   r_     s   
	r_   N)__doc__rE   r    r   r   Zutil.concurrencyr   r   r   r	   r6   r9   rB   rC   r_   dialectr   r   r   r   <module>!   s   i#0-