
    j!                       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
 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 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 e
r0d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# ddl$m%Z%  G d  d!e      Z& G d" d#ee&      Z' G d$ d%ee      Z( G d& d'e(      Z) G d( d)e      Z* G d* d+e      Z+e+Z,y,)-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?charset=utf8mb4"
    )

    )annotations)
ModuleType)Any)Dict)Optional)Tuple)TYPE_CHECKING)Union   ) _connection_ping_reconnects_true)MySQLDialect_pymysql   )pool)util)AsyncAdapt_dbapi_connection)AsyncAdapt_dbapi_cursor)AsyncAdapt_dbapi_module)AsyncAdapt_dbapi_ss_cursor)AsyncAdapt_terminate)langhelpers)await_fallback)
await_only)AsyncIODBAPIConnection)AsyncIODBAPICursor)ConnectArgsType)DBAPIConnection)DBAPICursor)DBAPIModule)PoolProxiedConnection)URLc                       e Zd ZdZ	 	 	 	 ddZy)AsyncAdapt_aiomysql_cursor c                `    |j                  | j                  j                  j                        S N)cursor_adapt_connectiondbapiCursorself
connections     I/tmp/pip-target-jj7clzyk/lib/python/sqlalchemy/dialects/mysql/aiomysql.py_make_new_cursorz+AsyncAdapt_aiomysql_cursor._make_new_cursorF   s'       !7!7!=!=!D!DEE    Nr,   r   returnr   __name__
__module____qualname__	__slots__r.   r#   r/   r-   r"   r"   C   s    IF0F	Fr/   r"   c                       e Zd ZdZ	 	 	 	 ddZy)AsyncAdapt_aiomysql_ss_cursorr#   c                    |j                  | j                  j                  j                  j                  j
                        S r%   )r&   r'   r(   aiomysqlcursorsSSCursorr*   s     r-   r.   z.AsyncAdapt_aiomysql_ss_cursor._make_new_cursorQ   s8       ""((1199BB
 	
r/   Nr0   r2   r#   r/   r-   r8   r8   L   s     I
0
	
r/   r8   c                  R    e Zd ZdZeZeZd
ddZddZ	ddZ
ddZddZddZddZy	)AsyncAdapt_aiomysql_connectionr#   c                    |rJ | j                   j                  r,| j                  | j                  j	                  d             y | j                  | j                  j	                                y )NF)	reconnect)r(   _send_false_to_pingawait__connectionping)r+   r@   s     r-   rD   z#AsyncAdapt_aiomysql_connection.pinga   sR    }::))KK((--->?KK((--/0r/   c                6    | j                   j                         S r%   )rC   character_set_namer+   s    r-   rF   z1AsyncAdapt_aiomysql_connection.character_set_nameh   s    2244r/   c                X    | j                  | j                  j                  |             y r%   )rB   rC   
autocommit)r+   values     r-   rI   z)AsyncAdapt_aiomysql_connection.autocommitk   s    D$$//67r/   c                6    | j                   j                         S r%   )rC   get_autocommitrG   s    r-   rL   z-AsyncAdapt_aiomysql_connection.get_autocommitn   s    ..00r/   c                V    | j                  | j                  j                                y r%   )rB   rC   ensure_closedrG   s    r-   closez$AsyncAdapt_aiomysql_connection.closeq   s    D$$2245r/   c                T   K   | j                   j                          d {    y 7 wr%   )rC   rN   rG   s    r-   _terminate_graceful_closez8AsyncAdapt_aiomysql_connection._terminate_graceful_closet   s     ,,...s   (&(c                8    | j                   j                          y r%   )rC   rO   rG   s    r-   _terminate_force_closez5AsyncAdapt_aiomysql_connection._terminate_force_closew   s     r/   N)F)r@   boolr1   None)r1   zOptional[str])rJ   r   r1   rU   r1   rT   r1   rU   )r3   r4   r5   r6   r"   _cursor_clsr8   _ss_cursor_clsrD   rF   rI   rL   rO   rQ   rS   r#   r/   r-   r>   r>   Y   s6     I,K2N15816/!r/   r>   c                       e Zd ZdZ ee      Zy)&AsyncAdaptFallback_aiomysql_connectionr#   N)r3   r4   r5   r6   staticmethodr   rB   r#   r/   r-   r[   r[   |   s    I.)Fr/   r[   c                  V    e Zd ZddZddZd	dZej                  d
d       Z	 	 ddZ	y)AsyncAdapt_aiomysql_dbapic                    || _         || _        d| _        | j                          | j	                         \  | _        | _        y )Nformat)r:   pymysql
paramstyle_init_dbapi_attributes_init_cursors_subclassesr)   r<   )r+   r:   ra   s      r-   __init__z"AsyncAdapt_aiomysql_dbapi.__init__   s:     "##%%)%B%B%D"T]r/   c           	         dD ]#  }t        | |t        | j                  |             % dD ]#  }t        | |t        | j                  |             % y )N)WarningErrorInterfaceError	DataErrorDatabaseErrorOperationalErrorri   IntegrityErrorProgrammingErrorInternalErrorNotSupportedError)NUMBERSTRINGDATETIMEBINARY	TIMESTAMPBinary)setattrgetattrr:   ra   )r+   names     r-   rc   z0AsyncAdapt_aiomysql_dbapi._init_dbapi_attributes   sV    
 	>D D$t <=	>
 	=D D$d ;<	=r/   c           
        |j                  dd      }|j                  d| j                  j                        }t        j                  |      rt        | t         ||i |            S t        | t         ||i |            S )Nasync_fallbackFasync_creator_fn)	popr:   connectr   asboolr[   r   r>   r   )r+   argkwr{   
creator_fns        r-   r~   z!AsyncAdapt_aiomysql_dbapi.connect   s     0%8VV.0E0EF
;;~&9z35"56 
 2:s1b12 r/   c                    	 t        d      j                  j                  }t        |      S # t        t
        f$ r Y yw xY w)zdetermine if aiomysql has deprecated, changed the default of,
        or removed the 'reconnect' argument of connection.ping().

        See #13306 and #10492

        zaiomysql.connectionT)
__import__r,   
Connectionr   ImportErrorAttributeError)r+   r   s     r-   rA   z-AsyncAdapt_aiomysql_dbapi._send_false_to_ping   sG    	@#%j  4J?? ^, 		s   , >>c                     G d d| j                   j                        } G d d| j                   j                        }||fS )Nc                      e Zd Z	 	 	 	 ddZy)BAsyncAdapt_aiomysql_dbapi._init_cursors_subclasses.<locals>.Cursorc                   K   y wr%   r#   r+   conns     r-   _show_warningszQAsyncAdapt_aiomysql_dbapi._init_cursors_subclasses.<locals>.Cursor._show_warnings            Nr   r   r1   rU   r3   r4   r5   r   r#   r/   r-   r)   r          2r/   r)   c                      e Zd Z	 	 	 	 ddZy)DAsyncAdapt_aiomysql_dbapi._init_cursors_subclasses.<locals>.SSCursorc                   K   y wr%   r#   r   s     r-   r   zSAsyncAdapt_aiomysql_dbapi._init_cursors_subclasses.<locals>.SSCursor._show_warnings   r   r   Nr   r   r#   r/   r-   r<   r      r   r/   r<   )r:   r)   r<   )r+   r)   r<   s      r-   rd   z2AsyncAdapt_aiomysql_dbapi._init_cursors_subclasses   s;    	T]])) 		t}}-- 	 xr/   N)r:   r   ra   r   rW   )r   r   r   r   r1   r>   rV   )r1   z-Tuple[AsyncIODBAPICursor, AsyncIODBAPICursor])
r3   r4   r5   re   rc   r~   r   memoized_propertyrA   rd   r#   r/   r-   r^   r^      s;    E=4 ""@ #@" 	6 r/   r^   c                       e Zd ZdZdZdZeZdZdZ	e
d
d       Ze
dd       ZddZ	 d	 	 	 	 	 d fdZ	 	 	 	 	 	 	 	 d fdZddZ	 	 	 	 dd	Z xZS )MySQLDialect_aiomysqlr:   Tc                >    t        t        d      t        d            S )Nr:   ra   )r^   r   )clss    r-   import_dbapiz"MySQLDialect_aiomysql.import_dbapi   s    (z"Jy$9
 	
r/   c                    |j                   j                  dd      }t        j                  |      rt        j
                  S t        j                  S )Nr{   F)querygetr   r   r   FallbackAsyncAdaptedQueuePoolAsyncAdaptedQueuePool)r   urlr{   s      r-   get_pool_classz$MySQLDialect_aiomysql.get_pool_class   s;    '7?;;~&555---r/   c                $    |j                          y r%   )	terminate)r+   dbapi_connections     r-   do_terminatez"MySQLDialect_aiomysql.do_terminate   s    ""$r/   c                <    t         |   |t        dd            S )Nuserdb)usernamedatabase)_translate_args)supercreate_connect_argsdict)r+   r   r   	__class__s      r-   r   z)MySQLDialect_aiomysql.create_connect_args   s(     w*v!E + 
 	
r/   c                b    t         |   |||      ryt        |      j                         }d|v S )NTznot connected)r   is_disconnectstrlower)r+   er,   r&   str_er   s        r-   r   z#MySQLDialect_aiomysql.is_disconnect   s3     7 J7FLLNE"e++r/   c                &    ddl m} |j                  S )Nr   )CLIENT)pymysql.constantsr   
FOUND_ROWS)r+   r   s     r-   _found_rows_client_flagz-MySQLDialect_aiomysql._found_rows_client_flag  s    ,   r/   c                    |j                   S r%   )rC   r*   s     r-   get_driver_connectionz+MySQLDialect_aiomysql.get_driver_connection  s     %%%r/   )r1   r^   )r   r    r1   type)r   r   r1   rU   r%   )r   r    r   zOptional[Dict[str, Any]]r1   r   )r   zDBAPIModule.Errorr,   z7Optional[Union[PoolProxiedConnection, DBAPIConnection]]r&   zOptional[DBAPICursor]r1   rT   )r1   int)r,   r   r1   r   )r3   r4   r5   driversupports_statement_cachesupports_server_side_cursorsr8   	_sscursoris_asynchas_terminateclassmethodr   r   r   r   r   r   r   __classcell__)r   s   @r-   r   r      s    F##' -IHM
 

 . .% EI

)A
	

,
, L
, &	
,
 

,!
&)&	&r/   r   N)-__doc__
__future__r   typesr   typingr   r   r   r   r	   r
   ra   r   r    r   r   connectors.asyncior   r   r   r   r   r   util.concurrencyr   r   r   r   engine.interfacesr   r   r   r   r   
engine.urlr    r"   r8   r>   r[   r^   r   dialectr#   r/   r-   <module>r      s   0 #         5 )   = 9 9 < 6  . *<84400:!F!8 F

 :

 !5 !F*-K *S  7 S l7&0 7&t  r/   