U
    ÌZj�&  ã                   @   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 G dd„ dƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZdd„ ZG dd„ dƒ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

.. note:: The asyncmy dialect as of September, 2021 was added to provide
   MySQL/MariaDB asyncio compatibility given that the :ref:`aiomysql` database
   driver has become unmaintained, however asyncmy is itself very new.

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


é   )ÚMySQLDialect_pymysqlé   )Úpool)Úutil)ÚAdaptedConnection)Úasynccontextmanager)Ú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_asyncmy_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   úd/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/sqlalchemy/dialects/mysql/asyncmy.pyÚ__init__3   s    
z"AsyncAdapt_asyncmy_cursor.__init__c                 C   s   | j jS r   )r   Údescription©r   r   r   r   r   =   s    z%AsyncAdapt_asyncmy_cursor.descriptionc                 C   s   | j jS r   )r   Úrowcountr   r   r   r   r   A   s    z"AsyncAdapt_asyncmy_cursor.rowcountc                 C   s   | j jS r   ©r   Ú	arraysizer   r   r   r   r   E   s    z#AsyncAdapt_asyncmy_cursor.arraysizec                 C   s   || j _d S r   r   ©r   Úvaluer   r   r   r   I   s    c                 C   s   | j jS r   )r   Ú	lastrowidr   r   r   r   r    M   s    z#AsyncAdapt_asyncmy_cursor.lastrowidc                 C   s   g | j d d …< d S r   ©r   r   r   r   r   ÚcloseQ   s    zAsyncAdapt_asyncmy_cursor.closeNc                 C   s   |   |  ||¡¡S r   )r   Ú_execute_async)r   Ú	operationÚ
parametersr   r   r   Úexecute[   s    z!AsyncAdapt_asyncmy_cursor.executec                 C   s   |   |  ||¡¡S r   )r   Ú_executemany_async©r   r$   Zseq_of_parametersr   r   r   Úexecutemany^   s    
ÿz%AsyncAdapt_asyncmy_cursor.executemanyc                 Ã   s†   | j  ¡ 4 I d H šd |d kr0| 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   Ú_mutex_and_adapt_errorsr   r&   Úserver_sideÚlistÚfetchallr   )r   r$   r%   Úresultr   r   r   r#   c   s    z(AsyncAdapt_asyncmy_cursor._execute_asyncc                 Ã   sJ   | 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'   r   s    z,AsyncAdapt_asyncmy_cursor._executemany_asyncc                 G   s   d S r   r   )r   Z
inputsizesr   r   r   Úsetinputsizesv   s    z'AsyncAdapt_asyncmy_cursor.setinputsizesc                 c   s   | j r| j  d¡V  q d S ©Né    ©r   Úpopr   r   r   r   Ú__iter__y   s    z"AsyncAdapt_asyncmy_cursor.__iter__c                 C   s   | j r| j  d¡S d S d S r0   r2   r   r   r   r   Úfetchone}   s    z"AsyncAdapt_asyncmy_cursor.fetchonec                 C   s8   |d kr| j }| jd|… }| j|d … | jd d …< |S r0   )r   r   )r   ÚsizeÚretvalr   r   r   Ú	fetchmanyƒ   s
    z#AsyncAdapt_asyncmy_cursor.fetchmanyc                 C   s    | j d d … }g | j d d …< |S r   r!   )r   r7   r   r   r   r-   ‹   s    z"AsyncAdapt_asyncmy_cursor.fetchall)N)N)Ú__name__Ú
__module__Ú__qualname__r+   Ú	__slots__r   Úpropertyr   r   r   Úsetterr    r"   r&   r)   r#   r'   r/   r4   r5   r8   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_asyncmy_ss_cursorr   Tc                 C   s>   || _ |j| _|j| _| j |jjjj¡}|  | ¡ ¡| _	d S r   )
r   r   r   r   ÚdbapiÚasyncmyZcursorsZSSCursorr   r   r   r   r   r   r   •   s    
ÿz%AsyncAdapt_asyncmy_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_asyncmy_ss_cursor.closec                 C   s   |   | j ¡ ¡S r   )r   r   r5   r   r   r   r   r5   ¥   s    z%AsyncAdapt_asyncmy_ss_cursor.fetchoneNc                 C   s   |   | jj|d�¡S )N)r6   )r   r   r8   )r   r6   r   r   r   r8   ¨   s    z&AsyncAdapt_asyncmy_ss_cursor.fetchmanyc                 C   s   |   | j ¡ ¡S r   )r   r   r-   r   r   r   r   r-   «   s    z%AsyncAdapt_asyncmy_ss_cursor.fetchall)N)
r9   r:   r;   r<   r+   r   r"   r5   r8   r-   r   r   r   r   r?   ‘   s   
r?   c                   @   sn   e Zd ZeeƒZdZdd„ Zed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_asyncmy_connection)r@   r   Ú_execute_mutexc                 C   s   || _ || _t ¡ | _d S r   )r@   r   r   ÚLockrC   )r   r@   Ú
connectionr   r   r   r   ³   s    z&AsyncAdapt_asyncmy_connection.__init__c              
   C  sP   | j 4 I d H š2 z
d V  W n  tk
r:   | j d¡‚Y nX W 5 Q I d H R X d S )Nz7network operation failed due to asyncmy attribute error)rC   ÚAttributeErrorr@   ÚInternalErrorr   r   r   r   r*   ¸   s    
ÿz5AsyncAdapt_asyncmy_connection._mutex_and_adapt_errorsc                 C   s   |rt ‚|  |  ¡ ¡S r   )ÚAssertionErrorr   Ú_do_ping)r   Z	reconnectr   r   r   ÚpingÂ   s    z"AsyncAdapt_asyncmy_connection.pingc                 Ã   sF   |   ¡ 4 I d H š& | j d¡I d H W  5 Q I d H R £ S Q I d H R X d S )NF)r*   r   rJ   r   r   r   r   rI   Æ   s    z&AsyncAdapt_asyncmy_connection._do_pingc                 C   s
   | j  ¡ S r   )r   Úcharacter_set_namer   r   r   r   rK   Ê   s    z0AsyncAdapt_asyncmy_connection.character_set_namec                 C   s   |   | j |¡¡ d S r   )r   r   Ú
autocommitr   r   r   r   rL   Í   s    z(AsyncAdapt_asyncmy_connection.autocommitFc                 C   s   |rt | ƒS t| ƒS d S r   )r?   r   )r   r+   r   r   r   r   Ð   s    z$AsyncAdapt_asyncmy_connection.cursorc                 C   s   |   | j ¡ ¡ d S r   )r   r   Úrollbackr   r   r   r   rM   Ö   s    z&AsyncAdapt_asyncmy_connection.rollbackc                 C   s   |   | j ¡ ¡ d S r   )r   r   Úcommitr   r   r   r   rN   Ù   s    z$AsyncAdapt_asyncmy_connection.commitc                 C   s   | j  ¡  d S r   )r   r"   r   r   r   r   r"   Ü   s    z#AsyncAdapt_asyncmy_connection.closeN)F)r9   r:   r;   Ústaticmethodr
   r   r<   r   r   r*   rJ   rI   rK   rL   r   rM   rN   r"   r   r   r   r   rB   ¯   s   
	
rB   c                   @   s   e Zd ZdZeeƒZdS )Ú%AsyncAdaptFallback_asyncmy_connectionr   N)r9   r:   r;   r<   rO   r	   r   r   r   r   r   rP   á   s   rP   c                 C   s   t | ƒS )zReturn x as a binary type.)Úbytes)Úxr   r   r   Ú_Binaryç   s    rS   c                   @   s^   e Zd Zdd„ Zdd„ Ze d¡Ze d¡Ze d¡Z	e d¡Z
e d	¡ZeeƒZd
d„ ZdS )ÚAsyncAdapt_asyncmy_dbapic                 C   s   || _ d| _|  ¡  d S )NÚformat)rA   Z
paramstyleÚ_init_dbapi_attributes)r   rA   r   r   r   r   í   s    z!AsyncAdapt_asyncmy_dbapi.__init__c                 C   s$   dD ]}t | |t| jj|ƒƒ qd S )N)ÚWarningÚErrorÚInterfaceErrorZ	DataErrorZDatabaseErrorZOperationalErrorrY   ZIntegrityErrorZProgrammingErrorrG   ZNotSupportedError)ÚsetattrÚgetattrrA   Úerrors)r   Únamer   r   r   rV   ò   s    z/AsyncAdapt_asyncmy_dbapi._init_dbapi_attributesÚSTRINGÚNUMBERÚBINARYÚDATETIMEÚ	TIMESTAMPc                 O   sJ   |  dd¡}t |¡r.t| t| jj||ŽƒƒS t| t| jj||ŽƒƒS d S ©NÚasync_fallbackF)	r3   r   ÚasboolrP   r	   rA   ÚconnectrB   r
   )r   ÚargÚkwrd   r   r   r   rf   	  s    
þþz AsyncAdapt_asyncmy_dbapi.connectN)r9   r:   r;   r   rV   r   Úsymbolr^   r_   r`   ra   rb   rO   rS   ÚBinaryrf   r   r   r   r   rT   ì   s   




rT   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_asyncmyrA   Tc                 C   s   t tdƒƒS )NrA   )rT   Ú
__import__)Úclsr   r   r   r@   !  s    zMySQLDialect_asyncmy.dbapic                 C   s(   |j  dd¡}t |¡rtjS tjS d S rc   )ÚqueryÚgetr   re   r   ZFallbackAsyncAdaptedQueuePoolZAsyncAdaptedQueuePool)rm   Úurlrd   r   r   r   Úget_pool_class%  s    
z#MySQLDialect_asyncmy.get_pool_classc                    s   t t| ƒj|tddd�d�S )NÚuserÚdb)ÚusernameZdatabase)Z_translate_args)Úsuperrk   Úcreate_connect_argsÚdict)r   rp   ©Ú	__class__r   r   rv   /  s    
 
ÿz(MySQLDialect_asyncmy.create_connect_argsc                    s8   t t| ƒ |||¡rdS t|ƒ ¡ }d|kp2d|kS d S )NTznot connectedznetwork operation failed)ru   rk   Úis_disconnectÚstrÚlower)r   ÚerE   r   Zstr_erx   r   r   rz   4  s    
  ÿÿz"MySQLDialect_asyncmy.is_disconnectc                 C   s   ddl m} |jS )Nr1   )ÚCLIENT)Zasyncmy.constantsr~   Z
FOUND_ROWS)r   r~   r   r   r   Ú_found_rows_client_flag?  s    z,MySQLDialect_asyncmy._found_rows_client_flagc                 C   s   |j S r   )r   )r   rE   r   r   r   Úget_driver_connectionD  s    z*MySQLDialect_asyncmy.get_driver_connection)r9   r:   r;   ZdriverZsupports_statement_cacheZsupports_server_side_cursorsr?   Z	_sscursorZis_asyncÚclassmethodr@   rq   rv   rz   r   r€   Ú__classcell__r   r   rx   r   rk     s   

	rk   N)Ú__doc__Zpymysqlr   Ú r   r   Zenginer   Zutil.concurrencyr   r   r	   r
   r   r?   rB   rP   rS   rT   rk   Údialectr   r   r   r   Ú<module>   s    h2,0