o
    )f1'                     @   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

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


    )asynccontextmanager   )MySQLDialect_pymysql   )pool)util)AdaptedConnection)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   selfadapt_connectionr    r   ^/var/www/html/flask-app/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/asyncmy.py__init__3   s   

z"AsyncAdapt_asyncmy_cursor.__init__c                 C      | j jS r   )r   descriptionr   r   r   r   r   =      z%AsyncAdapt_asyncmy_cursor.descriptionc                 C   r   r   )r   rowcountr   r   r   r   r   A   r   z"AsyncAdapt_asyncmy_cursor.rowcountc                 C   r   r   r   	arraysizer   r   r   r   r!   E   r   z#AsyncAdapt_asyncmy_cursor.arraysizec                 C   s   || j _d S r   r    r   valuer   r   r   r!   I      c                 C   r   r   )r   	lastrowidr   r   r   r   r%   M   r   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 r   )r   _execute_async)r   	operation
parametersr   r   r   execute[   s   z!AsyncAdapt_asyncmy_cursor.executec                 C   r(   r   )r   _executemany_asyncr   r*   seq_of_parametersr   r   r   executemany^   s   
z%AsyncAdapt_asyncmy_cursor.executemanyc              	      s   | j  4 I d H 3 |d u r| j|I d H }n
| j||I d H }| js1t| j I d H | _|W  d   I d H  S 1 I d H sCw   Y  d S r   )r   _mutex_and_adapt_errorsr   r,   server_sidelistfetchallr   )r   r*   r+   resultr   r   r   r)   c   s   0z(AsyncAdapt_asyncmy_cursor._execute_asyncc              	      sX   | j  4 I d H  | j||I d H W  d   I d H  S 1 I d H s%w   Y  d S r   )r   r1   r   r0   r.   r   r   r   r-   r   s   0z,AsyncAdapt_asyncmy_cursor._executemany_asyncc                 G   s   d S r   r   )r   
inputsizesr   r   r   setinputsizesv   s   z'AsyncAdapt_asyncmy_cursor.setinputsizesc                 c   s$    | j r| j dV  | j sd S d S Nr   r   popr   r   r   r   __iter__y   s   z"AsyncAdapt_asyncmy_cursor.__iter__c                 C   s   | j r	| j dS d S r8   r9   r   r   r   r   fetchone}   s   z"AsyncAdapt_asyncmy_cursor.fetchonec                 C   s8   |d u r| j }| jd| }| j|d  | jd d < |S r8   )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   r>   r   r   r   r4      s   z"AsyncAdapt_asyncmy_cursor.fetchallr   )__name__
__module____qualname__r2   	__slots__r   propertyr   r   r!   setterr%   r'   r,   r0   r)   r-   r7   r;   r<   r?   r4   r   r   r   r   r   '   s0    








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asyncmycursorsSSCursorr   r   r   r   r   r   r      s   
z%AsyncAdapt_asyncmy_ss_cursor.__init__c                 C   s(   | j d ur| | j   d | _ d S d S r   )r   r   r'   r   r   r   r   r'      s   

z"AsyncAdapt_asyncmy_ss_cursor.closec                 C      |  | j S r   )r   r   r<   r   r   r   r   r<         z%AsyncAdapt_asyncmy_ss_cursor.fetchoneNc                 C   s   |  | jj|dS )N)r=   )r   r   r?   )r   r=   r   r   r   r?         z&AsyncAdapt_asyncmy_ss_cursor.fetchmanyc                 C   rK   r   )r   r   r4   r   r   r   r   r4      rL   z%AsyncAdapt_asyncmy_ss_cursor.fetchallr   )
r@   rA   rB   rC   r2   r   r'   r<   r?   r4   r   r   r   r   rF      s    
rF   c                   @   sx   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ddZdS )AsyncAdapt_asyncmy_connection)rG   _execute_mutexc                 C   s   || _ || _t | _d S r   )rG   r   r	   LockrO   )r   rG   
connectionr   r   r   r      s   z&AsyncAdapt_asyncmy_connection.__init__c              	   C  sh   | j 4 I d H  zd V  W n ty   | jdw W d   I d H  d S 1 I d H s-w   Y  d S )Nz7network operation failed due to asyncmy attribute error)rO   AttributeErrorrG   InternalErrorr   r   r   r   r1      s   
.z5AsyncAdapt_asyncmy_connection._mutex_and_adapt_errorsc                 C   s   |rJ |  |  S r   )r   _do_ping)r   	reconnectr   r   r   ping   s   z"AsyncAdapt_asyncmy_connection.pingc              	      sT   |   4 I d H  | jdI d H W  d   I d H  S 1 I d H s#w   Y  d S )NF)r1   r   rV   r   r   r   r   rT      s   0z&AsyncAdapt_asyncmy_connection._do_pingc                 C   s
   | j  S r   )r   character_set_namer   r   r   r   rW      s   
z0AsyncAdapt_asyncmy_connection.character_set_namec                 C   s   |  | j| d S r   )r   r   
autocommitr"   r   r   r   rX      s   z(AsyncAdapt_asyncmy_connection.autocommitFc                 C   s   |rt | S t| S r   )rF   r   )r   r2   r   r   r   r      s   z$AsyncAdapt_asyncmy_connection.cursorc                 C      |  | j  d S r   )r   r   rollbackr   r   r   r   rZ      rM   z&AsyncAdapt_asyncmy_connection.rollbackc                 C   rY   r   )r   r   commitr   r   r   r   r[      rM   z$AsyncAdapt_asyncmy_connection.commitc                 C   s   | j   d S r   )r   r'   r   r   r   r   	terminate   s   z'AsyncAdapt_asyncmy_connection.terminatereturnNc                 C   rY   r   )r   r   ensure_closedr   r   r   r   r'      rM   z#AsyncAdapt_asyncmy_connection.close)Fr]   N)r@   rA   rB   staticmethodr   r   rC   r   r   r1   rV   rT   rW   rX   r   rZ   r[   r\   r'   r   r   r   r   rN      s    
	
rN   c                   @   s   e Zd ZdZeeZdS )%AsyncAdaptFallback_asyncmy_connectionr   N)r@   rA   rB   rC   r`   r
   r   r   r   r   r   ra      s    ra   c                 C   s   t | S )zReturn x as a binary type.)bytes)xr   r   r   _Binary   r   rd   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)rH   
paramstyle_init_dbapi_attributes)r   rH   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InterfaceError	DataErrorDatabaseErrorOperationalErrorrk   IntegrityErrorProgrammingErrorrS   NotSupportedError)setattrgetattrrH   errors)r   namer   r   r   rh      s   z/AsyncAdapt_asyncmy_dbapi._init_dbapi_attributesSTRINGNUMBERBINARYDATETIME	TIMESTAMPc                 O   sV   | dd}| d| jj}t|rt| t||i |S t| t||i |S )Nasync_fallbackFasync_creator_fn)	r:   rH   connectr   asboolra   r
   rN   r   )r   argkwr{   
creator_fnr   r   r   r}     s   
z AsyncAdapt_asyncmy_dbapi.connectN)r@   rA   rB   r   rh   r   symbolrv   rw   rx   ry   rz   r`   rd   Binaryr}   r   r   r   r   re      s    




re   c                       sr   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	d
Z fddZ fddZdd Zdd Z  ZS )MySQLDialect_asyncmyrH   Tc                 C   s   t tdS )NrH   )re   
__import__)clsr   r   r   import_dbapi*  r$   z!MySQLDialect_asyncmy.import_dbapic                 C   s$   |j dd}t|rtjS tjS )Nr{   F)querygetr   r~   r   FallbackAsyncAdaptedQueuePoolAsyncAdaptedQueuePool)r   urlr{   r   r   r   get_pool_class.  s   
z#MySQLDialect_asyncmy.get_pool_classr]   Nc                 C   s   |   d S r   )r\   )r   dbapi_connectionr   r   r   do_terminate7  s   z!MySQLDialect_asyncmy.do_terminatec                    s   t  j|tddddS )Nuserdb)usernamedatabase)_translate_args)supercreate_connect_argsdict)r   r   	__class__r   r   r   :  s   z(MySQLDialect_asyncmy.create_connect_argsc                    s0   t  |||r
dS t| }d|v pd|v S )NTznot connectedznetwork operation failed)r   is_disconnectstrlower)r   erQ   r   str_er   r   r   r   ?  s
   z"MySQLDialect_asyncmy.is_disconnectc                 C   s   ddl m} |jS )Nr   )CLIENT)asyncmy.constantsr   
FOUND_ROWS)r   r   r   r   r   _found_rows_client_flagH  s   z,MySQLDialect_asyncmy._found_rows_client_flagc                 C   s   |j S r   )r   )r   rQ   r   r   r   get_driver_connectionM  s   z*MySQLDialect_asyncmy.get_driver_connectionr_   )r@   rA   rB   driversupports_statement_cachesupports_server_side_cursorsrF   	_sscursoris_asynchas_terminateclassmethodr   r   r   r   r   r   r   __classcell__r   r   r   r   r      s     


	r   N)__doc__
contextlibr   pymysqlr    r   r   enginer   util.concurrencyr	   r
   r   r   rF   rN   ra   rd   re   r   dialectr   r   r   r   <module>   s"   j 7-1