a
    ~ga'                     @   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 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"
    )

    )deque)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 }| | | _t | _d S N)r   r   r   cursor
__aenter__r   r   r   selfadapt_connectionr    r   f/var/www/html/emsaiapi.evdpl.com/venv/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/asyncmy.py__init__6   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   D   s    z"AsyncAdapt_asyncmy_cursor.rowcountc                 C   s   | j jS r   r   	arraysizer   r   r   r   r    H   s    z#AsyncAdapt_asyncmy_cursor.arraysizec                 C   s   || j _d S r   r   r   valuer   r   r   r    L   s    c                 C   s   | j jS r   )r   	lastrowidr   r   r   r   r#   P   s    z#AsyncAdapt_asyncmy_cursor.lastrowidc                 C   s   | j   d S r   )r   clearr   r   r   r   closeT   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'   seq_of_parametersr   r   r   executemanya   s    
z%AsyncAdapt_asyncmy_cursor.executemanyc              	      s   | j  4 I d H f |d u r0| j|I d H }n| j||I d H }| js`t| j I d H | _|W  d   I d H  S 1 I d H s0    Y  d S r   )r   _mutex_and_adapt_errorsr   r)   server_sider   fetchallr   )r   r'   r(   resultr   r   r   r&   f   s    z(AsyncAdapt_asyncmy_cursor._execute_asyncc              	      sV   | j  4 I d H * | j||I d H W  d   I d H  S 1 I d H sH0    Y  d S r   )r   r.   r   r-   r+   r   r   r   r*   u   s    z,AsyncAdapt_asyncmy_cursor._executemany_asyncc                 G   s   d S r   r   )r   
inputsizesr   r   r   setinputsizesy   s    z'AsyncAdapt_asyncmy_cursor.setinputsizesc                 c   s   | j r| j  V  q d S r   r   popleftr   r   r   r   __iter__|   s    z"AsyncAdapt_asyncmy_cursor.__iter__c                 C   s   | j r| j  S d S d S r   r4   r   r   r   r   fetchone   s    
z"AsyncAdapt_asyncmy_cursor.fetchonec                    s4   |d u r| j }| j  fddtt|t D S )Nc                    s   g | ]}   qS r   )r5   ).0_rrr   r   
<listcomp>       z7AsyncAdapt_asyncmy_cursor.fetchmany.<locals>.<listcomp>)r    r   rangeminlenr   sizer   r:   r   	fetchmany   s    z#AsyncAdapt_asyncmy_cursor.fetchmanyc                 C   s   t | j}| j  |S r   )listr   r$   )r   retvalr   r   r   r0      s    

z"AsyncAdapt_asyncmy_cursor.fetchall)N)N)__name__
__module____qualname__r/   	__slots__r   propertyr   r   r    setterr#   r%   r)   r-   r&   r*   r3   r6   r7   rC   r0   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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 r   )r   r   r%   r   r   r   r   r%      s    
z"AsyncAdapt_asyncmy_ss_cursor.closec                 C   s   |  | j S r   )r   r   r7   r   r   r   r   r7      s    z%AsyncAdapt_asyncmy_ss_cursor.fetchoneNc                 C   s   |  | jj|dS )N)rB   )r   r   rC   rA   r   r   r   rC      s    z&AsyncAdapt_asyncmy_ss_cursor.fetchmanyc                 C   s   |  | j S r   )r   r   r0   r   r   r   r   r0      s    z%AsyncAdapt_asyncmy_ss_cursor.fetchall)N)
rF   rG   rH   rI   r/   r   r%   r7   rC   r0   r   r   r   r   rL      s   
rL   c                   @   s|   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dZdS )AsyncAdapt_asyncmy_connection)rM   _execute_mutexc                 C   s   || _ || _t | _d S r   )rM   r   r
   LockrR   )r   rM   
connectionr   r   r   r      s    z&AsyncAdapt_asyncmy_connection.__init__c              	   C  sh   | j 4 I d H @ z
d V  W n ty8   | jdY n0 W d   I d H  qd1 I d H sZ0    Y  d S )Nz7network operation failed due to asyncmy attribute error)rR   AttributeErrorrM   InternalErrorr   r   r   r   r.      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              	      sR   |   4 I d H ( | jdI d H W  d   I d H  S 1 I d H sD0    Y  d S )NF)r.   r   rY   r   r   r   r   rW      s    z&AsyncAdapt_asyncmy_connection._do_pingc                 C   s
   | j  S r   )r   character_set_namer   r   r   r   rZ      s    z0AsyncAdapt_asyncmy_connection.character_set_namec                 C   s   |  | j| d S r   )r   r   
autocommitr!   r   r   r   r[      s    z(AsyncAdapt_asyncmy_connection.autocommitFc                 C   s   |rt | S t| S d S r   )rL   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   r\      s    z&AsyncAdapt_asyncmy_connection.rollbackc                 C   s   |  | j  d S r   )r   r   commitr   r   r   r   r]      s    z$AsyncAdapt_asyncmy_connection.commitc                 C   s   | j   d S r   )r   r%   r   r   r   r   	terminate   s    z'AsyncAdapt_asyncmy_connection.terminateNreturnc                 C   s   |  | j  d S r   )r   r   ensure_closedr   r   r   r   r%      s    z#AsyncAdapt_asyncmy_connection.close)F)rF   rG   rH   staticmethodr   r   rI   r   r   r.   rY   rW   rZ   r[   r   r\   r]   r^   r%   r   r   r   r   rQ      s   
	
rQ   c                   @   s   e Zd ZdZeeZdS )%AsyncAdaptFallback_asyncmy_connectionr   N)rF   rG   rH   rI   rb   r   r   r   r   r   r   rc      s   rc   c                 C   s   t | S )zReturn x as a binary type.)bytes)xr   r   r   _Binary   s    rf   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)rN   
paramstyle_init_dbapi_attributes)r   rN   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OperationalErrorrm   IntegrityErrorProgrammingErrorrV   NotSupportedError)setattrgetattrrN   errors)r   namer   r   r   rj      s    z/AsyncAdapt_asyncmy_dbapi._init_dbapi_attributesSTRINGNUMBERBINARYDATETIME	TIMESTAMPc                 O   sZ   | dd}| d| jj}t|r>t| t||i |S t| t||i |S d S )Nasync_fallbackFasync_creator_fn)	poprN   connectr   asboolrc   r   rQ   r   )r   argkwr}   
creator_fnr   r   r   r     s    
z AsyncAdapt_asyncmy_dbapi.connectN)rF   rG   rH   r   rj   r   symbolrx   ry   rz   r{   r|   rb   rf   Binaryr   r   r   r   r   rg      s   




rg   c                       sv   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	d
Z fddZ fddZdd Zdd Z  ZS )MySQLDialect_asyncmyrN   Tc                 C   s   t tdS )NrN   )rg   
__import__)clsr   r   r   import_dbapi,  s    z!MySQLDialect_asyncmy.import_dbapic                 C   s(   |j dd}t|rtjS tjS d S )Nr}   F)querygetr   r   r   FallbackAsyncAdaptedQueuePoolAsyncAdaptedQueuePool)r   urlr}   r   r   r   get_pool_class0  s    
z#MySQLDialect_asyncmy.get_pool_classNr_   c                 C   s   |   d S r   )r^   )r   dbapi_connectionr   r   r   do_terminate9  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                    s4   t  |||rdS t| }d|v p.d|v S d S )NTznot connectedznetwork operation failed)r   is_disconnectstrlower)r   erT   r   str_er   r   r   r   A  s
    z"MySQLDialect_asyncmy.is_disconnectc                 C   s   ddl m} |jS )Nr   )CLIENT)Zasyncmy.constantsr   
FOUND_ROWS)r   r   r   r   r   _found_rows_client_flagJ  s    z,MySQLDialect_asyncmy._found_rows_client_flagc                 C   s   |j S r   )r   )r   rT   r   r   r   get_driver_connectionO  s    z*MySQLDialect_asyncmy.get_driver_connection)rF   rG   rH   driversupports_statement_cachesupports_server_side_cursorsrL   	_sscursoris_asynchas_terminateclassmethodr   r   r   r   r   r   r   __classcell__r   r   r   r   r   "  s   

	r   N)__doc__collectionsr   
contextlibr   pymysqlr    r   r   enginer	   Zutil.concurrencyr
   r   r   r   rL   rQ   rc   rf   rg   r   dialectr   r   r   r   <module>	   s"   i 7-1