o
    )f&                     @   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 G d
d dZG dd deZG dd deZG dd deZG dd dZG dd deZeZdS )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")


   )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_aiomysql_cursorF)_adapt_connection_connectionawait__cursor_rowsc                 C   s@   || _ |j| _|j| _| j|jj}| | | _g | _d S N)	r   r   r   cursordbapiCursor
__aenter__r   r   selfadapt_connectionr    r   _/var/www/html/flask-app/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/aiomysql.py__init__3   s   
z#AsyncAdapt_aiomysql_cursor.__init__c                 C      | j jS r   )r   descriptionr   r   r   r   r   >      z&AsyncAdapt_aiomysql_cursor.descriptionc                 C   r   r   )r   rowcountr   r   r   r   r   B   r   z#AsyncAdapt_aiomysql_cursor.rowcountc                 C   r   r   r   	arraysizer   r   r   r   r!   F   r   z$AsyncAdapt_aiomysql_cursor.arraysizec                 C   s   || j _d S r   r    r   valuer   r   r   r!   J   s   c                 C   r   r   )r   	lastrowidr   r   r   r   r$   N   r   z$AsyncAdapt_aiomysql_cursor.lastrowidc                 C   s   g | j d d < d S r   r   r   r   r   r   closeR   s   z AsyncAdapt_aiomysql_cursor.closeNc                 C      |  | ||S r   )r   _execute_async)r   	operation
parametersr   r   r   execute\      z"AsyncAdapt_aiomysql_cursor.executec                 C   r'   r   )r   _executemany_asyncr   r)   seq_of_parametersr   r   r   executemany_   s   
z&AsyncAdapt_aiomysql_cursor.executemanyc              	      sv   | j j4 I d H % | j||I d H }| js"t| j I d H | _|W  d   I d H  S 1 I d H s4w   Y  d S r   )r   _execute_mutexr   r+   server_sidelistfetchallr   )r   r)   r*   resultr   r   r   r(   d   s   0z)AsyncAdapt_aiomysql_cursor._execute_asyncc              	      sV   | j 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-   p   s   0z-AsyncAdapt_aiomysql_cursor._executemany_asyncc                 G   s   d S r   r   )r   
inputsizesr   r   r   setinputsizest   s   z(AsyncAdapt_aiomysql_cursor.setinputsizesc                 c   s$    | j r| j dV  | j sd S d S N    r   popr   r   r   r   __iter__w   s   z#AsyncAdapt_aiomysql_cursor.__iter__c                 C   s   | j r	| j dS d S r8   r:   r   r   r   r   fetchone{   s   z#AsyncAdapt_aiomysql_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_aiomysql_cursor.fetchmanyc                 C   s    | j d d  }g | j d d < |S r   r%   )r   r?   r   r   r   r4      s   z#AsyncAdapt_aiomysql_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_aiomysql_ss_cursorr   Tc                 C   s:   || _ |j| _|j| _| j|jj}| | | _d S r   )r   r   r   r   r   SSCursorr   r   r   r   r   r   r      s
   z&AsyncAdapt_aiomysql_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_aiomysql_ss_cursor.closec                 C      |  | j S r   )r   r   r=   r   r   r   r   r=         z&AsyncAdapt_aiomysql_ss_cursor.fetchoneNc                 C   s   |  | jj|dS )N)r>   )r   r   r@   )r   r>   r   r   r   r@         z'AsyncAdapt_aiomysql_ss_cursor.fetchmanyc                 C   rI   r   )r   r   r4   r   r   r   r   r4      rJ   z&AsyncAdapt_aiomysql_ss_cursor.fetchallr   )
rA   rB   rC   rD   r2   r   r&   r=   r@   r4   r   r   r   r   rG      s    	
rG   c                   @   sd   e Zd ZeeZ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_aiomysql_connection)r   r1   c                 C   s   || _ || _t | _d S r   )r   r   r   Lockr1   )r   r   
connectionr   r   r   r      s   z'AsyncAdapt_aiomysql_connection.__init__c                 C   s   |  | j|S r   )r   r   ping)r   	reconnectr   r   r   rO      r,   z#AsyncAdapt_aiomysql_connection.pingc                 C   s
   | j  S r   )r   character_set_namer   r   r   r   rQ      s   
z1AsyncAdapt_aiomysql_connection.character_set_namec                 C   s   |  | j| d S r   )r   r   
autocommitr"   r   r   r   rR      s   z)AsyncAdapt_aiomysql_connection.autocommitFc                 C   s   |rt | S t| S r   )rG   r
   )r   r2   r   r   r   r      s   z%AsyncAdapt_aiomysql_connection.cursorc                 C      |  | j  d S r   )r   r   rollbackr   r   r   r   rT      rK   z'AsyncAdapt_aiomysql_connection.rollbackc                 C   rS   r   )r   r   commitr   r   r   r   rU      rK   z%AsyncAdapt_aiomysql_connection.commitc                 C   s   | j   d S r   )r   r&   r   r   r   r   	terminate   s   z(AsyncAdapt_aiomysql_connection.terminatereturnNc                 C   rS   r   )r   r   ensure_closedr   r   r   r   r&      rK   z$AsyncAdapt_aiomysql_connection.close)FrW   N)rA   rB   rC   staticmethodr	   r   rD   r   rO   rQ   rR   r   rT   rU   rV   r&   r   r   r   r   rL      s    
rL   c                   @   s   e Zd ZdZeeZdS )&AsyncAdaptFallback_aiomysql_connectionr   N)rA   rB   rC   rD   rZ   r   r   r   r   r   r   r[      s    r[   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
AsyncAdapt_aiomysql_dbapic                 C   s.   || _ || _d| _|   |  \| _| _d S )Nformat)aiomysqlpymysql
paramstyle_init_dbapi_attributes_init_cursors_subclassesr   rH   )r   r^   r_   r   r   r   r      s
   z"AsyncAdapt_aiomysql_dbapi.__init__c                 C   s@   dD ]}t | |t| j| qdD ]}t | |t| j| qd S )N)WarningErrorInterfaceError	DataErrorDatabaseErrorOperationalErrorre   IntegrityErrorProgrammingErrorInternalErrorNotSupportedError)NUMBERSTRINGDATETIMEBINARY	TIMESTAMPBinary)setattrgetattrr^   r_   )r   namer   r   r   ra      s
   z0AsyncAdapt_aiomysql_dbapi._init_dbapi_attributesc                 O   sV   | dd}| d| jj}t|rt| t||i |S t| t||i |S )Nasync_fallbackFasync_creator_fn)	r;   r^   connectr   asboolr[   r   rL   r	   )r   argkwrv   
creator_fnr   r   r   rx      s   
z!AsyncAdapt_aiomysql_dbapi.connectc                 C   s0   G dd d| j j}G dd d| j j}||fS )Nc                   @      e Zd Zdd ZdS )zBAsyncAdapt_aiomysql_dbapi._init_cursors_subclasses.<locals>.Cursorc                       d S r   r   r   connr   r   r   _show_warnings     zQAsyncAdapt_aiomysql_dbapi._init_cursors_subclasses.<locals>.Cursor._show_warningsNrA   rB   rC   r   r   r   r   r   r         r   c                   @   r}   )zDAsyncAdapt_aiomysql_dbapi._init_cursors_subclasses.<locals>.SSCursorc                    r~   r   r   r   r   r   r   r     r   zSAsyncAdapt_aiomysql_dbapi._init_cursors_subclasses.<locals>.SSCursor._show_warningsNr   r   r   r   r   rH     r   rH   )r^   r   rH   )r   r   rH   r   r   r   rb     s   z2AsyncAdapt_aiomysql_dbapi._init_cursors_subclassesN)rA   rB   rC   r   ra   rx   rb   r   r   r   r   r\      s
    r\   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_aiomysqlr^   Tc                 C   s   t tdtdS )Nr^   r_   )r\   
__import__)clsr   r   r   import_dbapi%  s   z"MySQLDialect_aiomysql.import_dbapic                 C   s$   |j dd}t|rtjS tjS )Nrv   F)querygetr   ry   r   FallbackAsyncAdaptedQueuePoolAsyncAdaptedQueuePool)r   urlrv   r   r   r   get_pool_class+  s   
z$MySQLDialect_aiomysql.get_pool_classrW   Nc                 C   s   |   d S r   )rV   )r   dbapi_connectionr   r   r   do_terminate4  s   z"MySQLDialect_aiomysql.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   7  s   z)MySQLDialect_aiomysql.create_connect_argsc                    s(   t  |||r
dS t| }d|v S )NTznot connected)r   is_disconnectstrlower)r   erN   r   str_er   r   r   r   <  s   z#MySQLDialect_aiomysql.is_disconnectc                 C   s   ddl m} |jS )Nr9   )CLIENT)pymysql.constantsr   
FOUND_ROWS)r   r   r   r   r   _found_rows_client_flagC  s   z-MySQLDialect_aiomysql._found_rows_client_flagc                 C   s   |j S r   )r   )r   rN   r   r   r   get_driver_connectionH  s   z+MySQLDialect_aiomysql.get_driver_connectionrY   )rA   rB   rC   driversupports_statement_cachesupports_server_side_cursorsrG   	_sscursoris_asynchas_terminateclassmethodr   r   r   r   r   r   r   __classcell__r   r   r   r   r     s     


r   N)__doc__r_   r    r   r   enginer   util.concurrencyr   r   r	   r
   rG   rL   r[   r\   r   dialectr   r   r   r   <module>   s   h(>1