U
    !Jjt                     @  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
 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	rNd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  d eZ%G d!d" d"ee%Z&G d#d$ d$eeZ'G d%d& d&e'Z(G d'd( d(eZ)G d)d* d*eZ*e*Z+d+S ),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                   @  s   e Zd ZdZdS )AsyncAdapt_asyncmy_cursor N)__name__
__module____qualname__	__slots__r    r    r    /var/www/api.dyntland.com/public_html/python_social_comments/venv/lib/python3.8/site-packages/sqlalchemy/dialects/mysql/asyncmy.pyr   ?   s   r   c                   @  s    e Zd ZdZdddddZdS )AsyncAdapt_asyncmy_ss_cursorr    r   r   
connectionreturnc                 C  s   | | jjjjjS N)cursorZ_adapt_connectiondbapiasyncmyZcursorsZSSCursorselfr(   r    r    r%   _make_new_cursorH   s    z-AsyncAdapt_asyncmy_ss_cursor._make_new_cursorN)r!   r"   r#   r$   r0   r    r    r    r%   r&   C   s   r&   c                   @  s   e Zd ZdZeZeZdddddZd dd	d
ddZ	d	dddZ
ddddZdd	dddZddddZd	dddZd	dddZd	dddZdS )!AsyncAdapt_asyncmy_connectionr    	Exceptionr   )errorr)   c                 C  s    t |tr| jd||d S )Nz7network operation failed due to asyncmy attribute error)
isinstanceAttributeErrorr,   InternalErrorr/   r3   r    r    r%   _handle_exceptionX   s    
z/AsyncAdapt_asyncmy_connection._handle_exceptionFboolNone)	reconnectr)   c                 C  s   |rt | |  S r*   )AssertionErrorawait__do_ping)r/   r;   r    r    r%   ping`   s    z"AsyncAdapt_asyncmy_connection.pingr)   c              
     s   zR| j 4 I d H 4 | jjr0| jjddI d H  n| j I d H  W 5 Q I d H R X W n, tk
r~ } z| | W 5 d }~X Y nX d S )NF)r;   )Z_execute_mutexr,   _send_false_to_ping_connectionr?   r2   r8   r7   r    r    r%   r>   d   s    $z&AsyncAdapt_asyncmy_connection._do_pingzOptional[str]c                 C  s
   | j  S r*   )rB   character_set_namer/   r    r    r%   rC   n   s    z0AsyncAdapt_asyncmy_connection.character_set_namer   )valuer)   c                 C  s   |  | j| d S r*   )r=   rB   
autocommit)r/   rE   r    r    r%   rF   q   s    z(AsyncAdapt_asyncmy_connection.autocommitc                 C  s
   | j  S r*   )rB   get_autocommitrD   r    r    r%   rG   t   s    z,AsyncAdapt_asyncmy_connection.get_autocommitc                 C  s   |  | j  d S r*   )r=   rB   ensure_closedrD   r    r    r%   closew   s    z#AsyncAdapt_asyncmy_connection.closec                   s   | j  I d H  d S r*   )rB   rH   rD   r    r    r%   _terminate_graceful_closez   s    z7AsyncAdapt_asyncmy_connection._terminate_graceful_closec                 C  s   | j   d S r*   )rB   rI   rD   r    r    r%   _terminate_force_close}   s    z4AsyncAdapt_asyncmy_connection._terminate_force_closeN)F)r!   r"   r#   r$   r   Z_cursor_clsr&   Z_ss_cursor_clsr8   r?   r>   rC   rF   rG   rI   rJ   rK   r    r    r    r%   r1   P   s   
r1   c                   @  s   e Zd ZdZeeZdS )%AsyncAdaptFallback_asyncmy_connectionr    N)r!   r"   r#   r$   staticmethodr   r=   r    r    r    r%   rL      s   rL   c                   @  s   e Zd ZddddZddddZed	Zed
ZedZ	edZ
edZeeZddddddZejddddZdS )AsyncAdapt_asyncmy_dbapir   )r-   c                 C  s   || _ d| _|   d S )Nformat)r-   Z
paramstyle_init_dbapi_attributes)r/   r-   r    r    r%   __init__   s    z!AsyncAdapt_asyncmy_dbapi.__init__r:   r@   c                 C  s$   dD ]}t | |t| jj| qd S )N)WarningErrorInterfaceErrorZ	DataErrorZDatabaseErrorZOperationalErrorrT   ZIntegrityErrorZProgrammingErrorr6   ZNotSupportedError)setattrgetattrr-   errors)r/   namer    r    r%   rP      s    z/AsyncAdapt_asyncmy_dbapi._init_dbapi_attributesSTRINGNUMBERBINARYDATETIME	TIMESTAMPr   r1   )argkwr)   c                 O  sR   | dd}| d| jj}t|r:t| t|||S t| t|||S d S )Nasync_fallbackFZasync_creator_fn)	popr-   connectr   asboolrL   r   r1   r   )r/   r^   r_   r`   Z
creator_fnr    r    r%   rb      s    
z AsyncAdapt_asyncmy_dbapi.connectr9   c              	   C  s8   zt djj}W n ttfk
r*   Y dS X t|S dS )zdetermine if asyncmy has deprecated, changed the default of,
        or removed the 'reconnect' argument of connection.ping().

        See #13306 and #10492

        zasyncmy.connectionTN)
__import__r(   
ConnectionImportErrorr5   r
   )r/   re   r    r    r%   rA      s
    	z,AsyncAdapt_asyncmy_dbapi._send_false_to_pingN)r!   r"   r#   rQ   rP   r   symbolrY   rZ   r[   r\   r]   rM   bytesBinaryrb   r   Zmemoized_propertyrA   r    r    r    r%   rN      s   




rN   c                      s   e Zd ZdZdZdZeZdZdZ	e
ddddZe
ddd	d
dZdddddZddd	 fddZddddd fddZddddZdddd d!Z  ZS )"MySQLDialect_asyncmyr-   Tr   r@   c                 C  s   t tdS )Nr-   )rN   rd   )clsr    r    r%   import_dbapi   s    z!MySQLDialect_asyncmy.import_dbapir   type)urlr)   c                 C  s(   |j dd}t|rtjS tjS d S )Nr`   F)querygetr   rc   r   ZFallbackAsyncAdaptedQueuePoolZAsyncAdaptedQueuePool)rk   rn   r`   r    r    r%   get_pool_class   s    
z#MySQLDialect_asyncmy.get_pool_classr   r:   )dbapi_connectionr)   c                 C  s   |   d S r*   )	terminate)r/   rr   r    r    r%   do_terminate   s    z!MySQLDialect_asyncmy.do_terminater   c                   s   t  j|tddddS )Nuserdb)usernameZdatabase)Z_translate_args)supercreate_connect_argsdict)r/   rn   	__class__r    r%   ry      s     
z(MySQLDialect_asyncmy.create_connect_argszDBAPIModule.Errorz7Optional[Union[PoolProxiedConnection, DBAPIConnection]]zOptional[DBAPICursor]r9   )er(   r+   r)   c                   s4   t  |||rdS t| }d|kp.d|kS d S )NTznot connectedznetwork operation failed)rx   is_disconnectstrlower)r/   r}   r(   r+   Zstr_er{   r    r%   r~      s
    z"MySQLDialect_asyncmy.is_disconnectintc                 C  s   ddl m} |jS )Nr   )CLIENT)Zasyncmy.constantsr   Z
FOUND_ROWS)r/   r   r    r    r%   _found_rows_client_flag   s    z,MySQLDialect_asyncmy._found_rows_client_flagr   r'   c                 C  s   |j S r*   )rB   r.   r    r    r%   get_driver_connection   s    z*MySQLDialect_asyncmy.get_driver_connection)r!   r"   r#   ZdriverZsupports_statement_cacheZsupports_server_side_cursorsr&   Z	_sscursorZis_asyncZhas_terminateclassmethodrl   rq   rt   ry   r~   r   r   __classcell__r    r    r{   r%   rj      s   rj   N),__doc__
__future__r   typesr   typingr   r   r   r   r   Zpymysqlr
   r    r   r   Zconnectors.asyncior   r   r   r   r   r   Zutil.concurrencyr   r   r   r   Zengine.interfacesr   r   r   r   r   Z
engine.urlr   r   r&   r1   rL   rN   rj   dialectr    r    r    r%   <module>   sR   
 
 2=8