
    jt                       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 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+asyncmy
    :name: asyncmy
    :dbapi: asyncmy
    :connectstring: mysql+asyncmy://user:password@host:port/dbname[?key=value&key=value...]
    :url: https://github.com/long2ice/asyncmy

Using a special asyncio mediation layer, the asyncmy 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+asyncmy://user:pass@hostname/dbname?charset=utf8mb4"
    )

    )annotations)
ModuleType)Any)NoReturn)Optional)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y)AsyncAdapt_asyncmy_cursor N)__name__
__module____qualname__	__slots__r"       H/tmp/pip-target-jj7clzyk/lib/python/sqlalchemy/dialects/mysql/asyncmy.pyr!   r!   ?   s    Ir'   r!   c                       e Zd ZdZ	 	 	 	 ddZy)AsyncAdapt_asyncmy_ss_cursorr"   c                    |j                  | j                  j                  j                  j                  j
                        S N)cursor_adapt_connectiondbapiasyncmycursorsSSCursorself
connections     r(   _make_new_cursorz-AsyncAdapt_asyncmy_ss_cursor._make_new_cursorH   s8       ""((0088AA
 	
r'   N)r5   r   returnr   )r#   r$   r%   r&   r6   r"   r'   r(   r*   r*   C   s     I
0
	
r'   r*   c                  b    e Zd ZdZeZe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
Zy)AsyncAdapt_asyncmy_connectionr"   c                ^    t        |t              r| j                  j                  d      ||)Nz7network operation failed due to asyncmy attribute error)
isinstanceAttributeErrorr/   InternalErrorr4   errors     r(   _handle_exceptionz/AsyncAdapt_asyncmy_connection._handle_exceptionX   s0    e^,****I r'   c                H    |rJ | j                  | j                               S r,   )await__do_ping)r4   	reconnects     r(   pingz"AsyncAdapt_asyncmy_connection.ping`   s    }{{4==?++r'   c                  K   	 | j                   4 d {    | j                  j                  r%| j                  j	                  d       d {    n"| j                  j	                          d {    d d d       d {    y 7 r7 :7 7 # 1 d {  7  sw Y   y xY w# t
        $ r}| j                  |       Y d }~y d }~ww xY ww)NF)rD   )_execute_mutexr/   _send_false_to_ping_connectionrE   	Exceptionr@   r>   s     r(   rC   z&AsyncAdapt_asyncmy_connection._do_pingd   s     	*** 2 2::11**//%/@@@**//111	2 2 2@1	2 2 2 2
  	*""5))	*s   CB$ BB$ 6BB	"B1B2B6B$ BB$ CB$ 	BBB$ B!BB!B$  C!B$ $	C-C>CCCc                6    | j                   j                         S r,   )rI   character_set_namer4   s    r(   rL   z0AsyncAdapt_asyncmy_connection.character_set_namen   s    2244r'   c                X    | j                  | j                  j                  |             y r,   )rB   rI   
autocommit)r4   values     r(   rO   z(AsyncAdapt_asyncmy_connection.autocommitq   s    D$$//67r'   c                6    | j                   j                         S r,   )rI   get_autocommitrM   s    r(   rR   z,AsyncAdapt_asyncmy_connection.get_autocommitt   s    ..00r'   c                V    | j                  | j                  j                                y r,   )rB   rI   ensure_closedrM   s    r(   closez#AsyncAdapt_asyncmy_connection.closew   s    D$$2245r'   c                T   K   | j                   j                          d {    y 7 wr,   )rI   rT   rM   s    r(   _terminate_graceful_closez7AsyncAdapt_asyncmy_connection._terminate_graceful_closez   s     ,,...s   (&(c                8    | j                   j                          y r,   )rI   rU   rM   s    r(   _terminate_force_closez4AsyncAdapt_asyncmy_connection._terminate_force_close}   s     r'   N)r?   rJ   r7   r   )F)rD   boolr7   Noner7   r[   )r7   zOptional[str])rP   r   r7   r[   r7   rZ   )r#   r$   r%   r&   r!   _cursor_clsr*   _ss_cursor_clsr@   rE   rC   rL   rO   rR   rU   rW   rY   r"   r'   r(   r9   r9   P   s@     I+K1N,*5816/!r'   r9   c                       e Zd ZdZ ee      Zy)%AsyncAdaptFallback_asyncmy_connectionr"   N)r#   r$   r%   r&   staticmethodr   rB   r"   r'   r(   ra   ra      s    I.)Fr'   ra   c                     e Zd ZddZddZ ej                  d      Z ej                  d      Z ej                  d      Z	 ej                  d      Z
 ej                  d      Z ee      ZddZej"                  dd	       Zy
)AsyncAdapt_asyncmy_dbapic                @    || _         d| _        | j                          y )Nformat)r0   
paramstyle_init_dbapi_attributes)r4   r0   s     r(   __init__z!AsyncAdapt_asyncmy_dbapi.__init__   s    "##%r'   c           	     h    dD ]-  }t        | |t        | j                  j                  |             / y )N)WarningErrorInterfaceError	DataErrorDatabaseErrorOperationalErrorrm   IntegrityErrorProgrammingErrorr=   NotSupportedError)setattrgetattrr0   errors)r4   names     r(   rh   z/AsyncAdapt_asyncmy_dbapi._init_dbapi_attributes   s4    
 	DD D$(;(;T BC	Dr'   STRINGNUMBERBINARYDATETIME	TIMESTAMPc           
        |j                  dd      }|j                  d| j                  j                        }t        j                  |      rt        | t         ||i |            S t        | t         ||i |            S )Nasync_fallbackFasync_creator_fn)	popr0   connectr   asboolra   r   r9   r   )r4   argkwr~   
creator_fns        r(   r   z AsyncAdapt_asyncmy_dbapi.connect   s     0%8VV.0D0DE
;;~&8z35"56 
 1:s1b12 r'   c                    	 t        d      j                  j                  }t        |      S # t        t
        f$ r Y yw xY w)zdetermine if asyncmy has deprecated, changed the default of,
        or removed the 'reconnect' argument of connection.ping().

        See #13306 and #10492

        zasyncmy.connectionT)
__import__r5   
Connectionr   ImportErrorr<   )r4   r   s     r(   rH   z,AsyncAdapt_asyncmy_dbapi._send_false_to_ping   sE    	@#$89DDOOJ 4J?? ^, 		s   , >>N)r0   r   r\   )r   r   r   r   r7   r9   r]   )r#   r$   r%   ri   rh   r   symbolrx   ry   rz   r{   r|   rb   bytesBinaryr   r   memoized_propertyrH   r"   r'   r(   rd   rd      s    &
D  T[["FT[["FT[["Ft{{:&HK(I% F ""@ #@r'   rd   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 fdZ	 	 	 	 	 	 	 	 d fdZddZ	 	 	 	 dd	Z xZS )MySQLDialect_asyncmyr0   Tc                *    t        t        d            S )Nr0   )rd   r   )clss    r(   import_dbapiz!MySQLDialect_asyncmy.import_dbapi   s    '
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_asyncmy.get_pool_class   s;    '7?;;~&555---r'   c                $    |j                          y r,   )	terminate)r4   dbapi_connections     r(   do_terminatez!MySQLDialect_asyncmy.do_terminate   s    ""$r'   c                <    t         |   |t        dd            S )Nuserdb)usernamedatabase)_translate_args)supercreate_connect_argsdict)r4   r   	__class__s     r(   r   z(MySQLDialect_asyncmy.create_connect_args   s&    w*v!E + 
 	
r'   c                n    t         |   |||      ryt        |      j                         }d|v xs d|v S )NTznot connectedznetwork operation failed)r   is_disconnectstrlower)r4   er5   r-   str_er   s        r(   r   z"MySQLDialect_asyncmy.is_disconnect   s@     7 J7FLLNE5(O,F%,Or'   c                &    ddl m} |j                  S )Nr   )CLIENT)asyncmy.constantsr   
FOUND_ROWS)r4   r   s     r(   _found_rows_client_flagz,MySQLDialect_asyncmy._found_rows_client_flag   s    ,   r'   c                    |j                   S r,   )rI   r3   s     r(   get_driver_connectionz*MySQLDialect_asyncmy.get_driver_connection   s     %%%r'   )r7   r   )r   r   r7   type)r   r   r7   r[   )r   r   r7   r   )r   zDBAPIModule.Errorr5   z7Optional[Union[PoolProxiedConnection, DBAPIConnection]]r-   zOptional[DBAPICursor]r7   rZ   )r7   int)r5   r   r7   r   )r#   r$   r%   driversupports_statement_cachesupports_server_side_cursorsr*   	_sscursoris_asynchas_terminateclassmethodr   r   r   r   r   r   r   __classcell__)r   s   @r(   r   r      s    F##' ,IHM? ? . .%

 L &	
 
!
&)&	&r'   r   N),__doc__
__future__r   typesr   typingr   r   r   r   r	   pymysqlr   r    r   r   connectors.asyncior   r   r   r   r   r   util.concurrencyr   r   r   r   engine.interfacesr   r   r   r   r   
engine.urlr   r!   r*   r9   ra   rd   r   dialectr"   r'   r(   <module>r      s   , #        5 )   = 9 9 < 6  . *<84400:! 7 

 9

/!5/!d*,I *:@6 :@z5&/ 5&p r'   