U
    cc'                     @   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G dd deZeZdS )aZ  

.. dialect:: sqlite+aiosqlite
    :name: aiosqlite
    :dbapi: aiosqlite
    :connectstring: sqlite+aiosqlite:///file_path
    :url: https://pypi.org/project/aiosqlite/

The aiosqlite dialect provides support for the SQLAlchemy asyncio interface
running on top of pysqlite.

aiosqlite is a wrapper around pysqlite that uses a background thread for
each connection.   It does not actually use non-blocking IO, as SQLite
databases are not socket-based.  However it does provide a working asyncio
interface that's useful for testing and prototyping purposes.

Using a special asyncio mediation layer, the aiosqlite 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("sqlite+aiosqlite:///filename")

The URL passes through all arguments to the ``pysqlite`` driver, so all
connection arguments are the same as they are for that of :ref:`pysqlite`.

.. _aiosqlite_udfs:

User-Defined Functions
----------------------

aiosqlite extends pysqlite to support async, so we can create our own user-defined functions (UDFs)
in Python and use them directly in SQLite queries as described here: :ref:`pysqlite_udfs`.


   )SQLiteExecutionContext)SQLiteDialect_pysqlite   )pool)util)AdaptedConnection)await_fallback)
await_onlyc                   @   s`   e Zd ZdZdZdd Zdd Zd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_aiosqlite_cursor)_adapt_connection_connectiondescriptionawait__rows	arraysizerowcount	lastrowidFc                 C   s2   || _ |j| _|j| _d| _d| _d | _g | _d S )Nr   )r   r   r   r   r   r   r   )selfZadapt_connection r   H/tmp/pip-unpacked-wheel-8u86ls_i/sqlalchemy/dialects/sqlite/aiosqlite.py__init__G   s    z$AsyncAdapt_aiosqlite_cursor.__init__c                 C   s   g | j d d < d S Nr   r   r   r   r   closeP   s    z!AsyncAdapt_aiosqlite_cursor.closeNc              
   C   s   z|  | j }|d kr,|  || n|  ||| |jrp|j| _d | _| _| js|  | | _	nd | _|j| _|j| _| js|  |
  n|| _W n. tk
r } z| j| W 5 d }~X Y nX d S )Nr   )r   r   cursorexecuter   r   r   server_sidefetchallr   r   _cursor	Exceptionr   _handle_exception)r   	operation
parametersr    errorr   r   r   r   S   s$    
z#AsyncAdapt_aiosqlite_cursor.executec              
   C   s~   zJ|  | j }|  ||| d | _|j| _|j| _|  |  W n. tk
rx } z| j	
| W 5 d }~X Y nX d S r   )r   r   r   executemanyr   r   r   r   r!   r   r"   )r   r#   Zseq_of_parametersr    r%   r   r   r   r&   n   s    z'AsyncAdapt_aiosqlite_cursor.executemanyc                 G   s   d S r   r   )r   Z
inputsizesr   r   r   setinputsizesy   s    z)AsyncAdapt_aiosqlite_cursor.setinputsizesc                 c   s   | j r| j dV  q d S N    r   popr   r   r   r   __iter__|   s    z$AsyncAdapt_aiosqlite_cursor.__iter__c                 C   s   | j r| j dS d S d S r(   r*   r   r   r   r   fetchone   s    z$AsyncAdapt_aiosqlite_cursor.fetchonec                 C   s8   |d kr| j }| jd| }| j|d  | jd d < |S r(   )r   r   )r   sizeretvalr   r   r   	fetchmany   s
    z%AsyncAdapt_aiosqlite_cursor.fetchmanyc                 C   s    | j d d  }g | j d d < |S r   r   )r   r/   r   r   r   r      s    z$AsyncAdapt_aiosqlite_cursor.fetchall)N)N)__name__
__module____qualname__	__slots__r   r   r   r   r&   r'   r,   r-   r0   r   r   r   r   r   r
   9   s   	

r
   c                       sF   e Zd ZdZdZ fddZdd Zdd Zdd
dZdd Z	  Z
S )AsyncAdapt_aiosqlite_ss_cursorr    Tc                    s   t  j|| d | _d S r   )superr   r    )r   argkw	__class__r   r   r      s    z'AsyncAdapt_aiosqlite_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_aiosqlite_ss_cursor.closec                 C   s   |  | j S r   )r   r    r-   r   r   r   r   r-      s    z'AsyncAdapt_aiosqlite_ss_cursor.fetchoneNc                 C   s"   |d kr| j }| | jj|dS )N)r.   )r   r   r    r0   )r   r.   r   r   r   r0      s    z(AsyncAdapt_aiosqlite_ss_cursor.fetchmanyc                 C   s   |  | j S r   )r   r    r   r   r   r   r   r      s    z'AsyncAdapt_aiosqlite_ss_cursor.fetchall)N)r1   r2   r3   r4   r   r   r   r-   r0   r   __classcell__r   r   r9   r   r5      s   
r5   c                   @   st   e Zd ZeeZdZdd Zedd Z	e	j
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S )AsyncAdapt_aiosqlite_connectiondbapir   c                 C   s   || _ || _d S r   r=   )r   r>   
connectionr   r   r   r      s    z(AsyncAdapt_aiosqlite_connection.__init__c                 C   s   | j jS r   )r   isolation_levelr   r   r   r   r@      s    z/AsyncAdapt_aiosqlite_connection.isolation_levelc              
   C   s>   z|| j _W n, tk
r8 } z| | W 5 d }~X Y nX d S r   )r   r@   r!   r"   )r   valuer%   r   r   r   r@      s    c              
   O   sJ   z|  | jj|| W n, tk
rD } z| | W 5 d }~X Y nX d S r   )r   r   create_functionr!   r"   )r   argsr8   r%   r   r   r   rB      s    z/AsyncAdapt_aiosqlite_connection.create_functionFc                 C   s   |rt | S t| S d S r   )r5   r
   )r   r   r   r   r   r      s    z&AsyncAdapt_aiosqlite_connection.cursorc                 O   s   |  | jj||S r   )r   r   r   )r   rC   r8   r   r   r   r      s    z'AsyncAdapt_aiosqlite_connection.executec              
   C   sF   z|  | j  W n, tk
r@ } z| | W 5 d }~X Y nX d S r   )r   r   rollbackr!   r"   r   r%   r   r   r   rD      s    z(AsyncAdapt_aiosqlite_connection.rollbackc              
   C   sF   z|  | j  W n, tk
r@ } z| | W 5 d }~X Y nX d S r   )r   r   commitr!   r"   rE   r   r   r   rF      s    z&AsyncAdapt_aiosqlite_connection.commitc              
   C   sF   z|  | j  W n, tk
r@ } z| | W 5 d }~X Y nX d S r   )r   r   r   r!   r"   rE   r   r   r   r      s    z%AsyncAdapt_aiosqlite_connection.closec                 C   s:   t |tr2|jd dkr2tj| jjd|d n|d S )Nr)   no active connection)from_)
isinstance
ValueErrorrC   r   Zraise_r>   sqliteOperationalErrorrE   r   r   r   r"      s    z1AsyncAdapt_aiosqlite_connection._handle_exceptionN)F)r1   r2   r3   staticmethodr	   r   r4   r   propertyr@   setterrB   r   r   rD   rF   r   r"   r   r   r   r   r<      s   


r<   c                   @   s   e Zd ZdZeeZdS )'AsyncAdaptFallback_aiosqlite_connectionr   N)r1   r2   r3   r4   rM   r   r   r   r   r   r   rP      s   rP   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )AsyncAdapt_aiosqlite_dbapic                 C   s   || _ || _d| _|   d S )NZqmark)	aiosqliterK   Z
paramstyle_init_dbapi_attributes)r   rR   rK   r   r   r   r      s    z#AsyncAdapt_aiosqlite_dbapi.__init__c                 C   s^   dD ]}t | |t| j| qdD ]}t | |t| j| q"dD ]}t | |t| j| q@d S )N)ZDatabaseErrorErrorZIntegrityErrorZNotSupportedErrorrL   ZProgrammingErrorZsqlite_versionZsqlite_version_info)ZPARSE_COLNAMESZPARSE_DECLTYPES)Binary)setattrgetattrrR   rK   )r   namer   r   r   rS      s    
z1AsyncAdapt_aiosqlite_dbapi._init_dbapi_attributesc                 O   sR   | dd}d|d< | jj||}d|_t|r@t| t|S t| t	|S d S )Nasync_fallbackFZcheck_same_threadT)
r+   rR   connectdaemonr   ZasboolrP   r   r<   r	   )r   r7   r8   rY   r?   r   r   r   rZ     s    
z"AsyncAdapt_aiosqlite_dbapi.connectN)r1   r2   r3   r   rS   rZ   r   r   r   r   rQ      s   rQ   c                   @   s   e Zd Zdd ZdS ) SQLiteExecutionContext_aiosqlitec                 C   s   | j jddS )NT)r   )Z_dbapi_connectionr   r   r   r   r   create_server_side_cursor0  s    z:SQLiteExecutionContext_aiosqlite.create_server_side_cursorN)r1   r2   r3   r]   r   r   r   r   r\   /  s   r\   c                       sP   e Zd ZdZdZdZdZeZe	dd Z
e	dd Z fddZd	d
 Z  ZS )SQLiteDialect_aiosqliterR   Tc                 C   s   t tdtdS )NrR   Zsqlite3)rQ   
__import__)clsr   r   r   r>   >  s     zSQLiteDialect_aiosqlite.dbapic                 C   s   |  |rtjS tjS d S r   )Z_is_url_file_dbr   ZNullPoolZ
StaticPool)r`   urlr   r   r   get_pool_classD  s    
z&SQLiteDialect_aiosqlite.get_pool_classc                    s.   t || jjrdt|krdS t |||S )NrG   T)rI   r>   rL   strr6   is_disconnect)r   er?   r   r9   r   r   rd   K  s     
z%SQLiteDialect_aiosqlite.is_disconnectc                 C   s   |j S r   )r   )r   r?   r   r   r   get_driver_connectionS  s    z-SQLiteDialect_aiosqlite.get_driver_connection)r1   r2   r3   ZdriverZsupports_statement_cacheZis_asyncZsupports_server_side_cursorsr\   Zexecution_ctx_clsclassmethodr>   rb   rd   rf   r;   r   r   r9   r   r^   4  s   

r^   N)__doc__baser   Zpysqliter    r   r   Zenginer   Zutil.concurrencyr   r	   r
   r5   r<   rP   rQ   r\   r^   dialectr   r   r   r   <module>   s   ([A:#