o
    ðT·j;±  ã                   @   s¨  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZm	Z	 d dl
T d dl
mZmZmZ d dl
mZ d dl
mZ d dl
mZ d dlmZ zd dlZW n ey_   dZY nw zd dlZW n eyq   dZY nw zd dlZW n eyƒ   dZY nw e d	¡ZG d
d„ deƒZdZdd„ Z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e!eƒZ"G dd„ de!eƒZ#G dd„ de!eƒZ$G dd„ deƒZ%dd „ Z&G d!d"„ d"eƒZ'G d#d$„ d$e'e(ƒZ)G d%d&„ d&eƒZ*d'd(„ Z+G d)d*„ d*eƒZ,G d+d,„ d,eƒZ-G d-d.„ d.eƒZ.G d/d0„ d0e-ƒZ/G d1d2„ d2e%e0ƒZ1G d3d4„ d4e-ƒZ2G d5d6„ d6e%e3ƒZ4G d7d8„ d8e-ƒZ5G d9d:„ d:eƒZ6G d;d<„ d<eƒZ7G d=d>„ d>e%e8ƒZ9dS )?é    N)ÚgreenletÚ
getcurrent)Ú*)Ú_atomicÚ
_savepointÚ_transaction)Ú_callable_context_manager)Ú__exception_wrapper__)ÚPsycopg3Adapter)ÚJsonzpeewee.pwasyncioc                   @   ó   e Zd ZdS )ÚMissingGreenletBridgeN©Ú__name__Ú
__module__Ú__qualname__© r   r   úV/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/playhouse/pwasyncio.pyr   %   ó    r   aK   Hint: in async code, run queries through the async API, e.g. `await Model.aget(...)`, `await query.aexecute()`, `await db.list(query)`, or wrap synchronous code with `await db.run(fn)`. For lazy foreign-key access use `await obj.afetch(Model.rel_field)`. See https://docs.peewee-orm.com/en/latest/peewee/asyncio.html#sharp-cornersc              
   �   sœ   �t ƒ }d ‰d ‰‡ ‡‡‡‡fdd„}t||d�}|j|_| ¡ }|jsHz
| |I d H ¡}W n tyD } z| |¡}W Y d }~nd }~ww |jr#ˆrLˆ‚ˆS )Nc               
      s@   z
ˆˆ i ˆ¤Ž‰W d S  t y }  z	| ‰W Y d } ~ d S d } ~ ww ©N)ÚBaseException)Úexc©ÚargsÚerrorÚfnÚkwargsÚresultr   r   Úrunner6   s   €ÿzgreenlet_spawn.<locals>.runner)Úparent)r   r   Ú
gr_contextÚswitchÚdeadr   Úthrow)r   r   r   r   r   ÚgÚvaluer   r   r   r   Úgreenlet_spawn1   s&   €€ÿýr&   c                 C   s@   t ƒ }|j}|d u rt | ¡r|  ¡  dt }t|ƒ‚| | ¡S )Nz(await_() called outside greenlet_spawn())r   r   ÚasyncioÚiscoroutineÚcloseÚ_BRIDGE_ERR_HINTr   r!   )Ú	awaitableÚcurrentr   Úerrmsgr   r   r   Úawait_O   s   

r.   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú_State)ÚconnÚclosedÚtransactionsÚctxÚcommit_callbacksÚ_task_idÚ_taskc                 C   s   d | _ d | _|  ¡  d S r   )r5   r6   Úreset©Úselfr   r   r   Ú__init__^   s   z_State.__init__c                 C   s"   d | _ d| _g | _g | _g | _d S ©NT)r0   r1   r2   r3   r4   r8   r   r   r   r7   c   s
   
z_State.resetN)r   r   r   Ú	__slots__r:   r7   r   r   r   r   r/   Z   s    r/   c                   @   sz   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zed
d„ ƒZedd„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZdd„ Zdd„ ZdS )Ú_ConnectionStateNc                 C   s*   t  d¡| _i | _g | _|| _tƒ | _d S )NÚpwasyncio_state)ÚcontextvarsÚ
ContextVarÚ_cvÚ_statesÚ_orphaned_connsÚ_releaseÚsetÚ_release_tasks)r9   Úreleaser   r   r   r:   l   s
   z_ConnectionState.__init__c                 C   s´   t  ¡ }|d u rtdƒ‚t|ƒ}z| j ¡ }|j|kr(|| jvr%|| j|< |W S W n	 ty2   Y nw || jv r>| j| }nt	ƒ }||_||_
|| j|< | | j¡ | j |¡ |S )NzCannot determine current task)r'   Úcurrent_taskÚRuntimeErrorÚidrA   Úgetr5   rB   ÚLookupErrorr/   r6   Úadd_done_callbackÚ_on_task_donerE   )r9   ÚtaskÚtidÚstater   r   r   Ú_currentv   s.   



ûÿ

z_ConnectionState._currentc                 C   s¬   t |ƒ}| j |d ¡}|d urP|jd urR|jsT|j}| ¡  | jd urHzt ¡  	|  
|¡¡}W n	 ty8   Y nw | j |¡ | | jj¡ d S | j |¡ d S d S d S d S r   )rJ   rB   Úpopr0   r1   r7   rD   r'   Úget_running_loopÚcreate_taskÚ_safe_releaserI   rF   ÚaddrM   ÚdiscardrC   Úappend)r9   rO   rP   rQ   r0   Útr   r   r   rN   ”   s$   
ÿÿòz_ConnectionState._on_task_donec                 Ã   s<   �z|   |¡I d H  W d S  ty   tjddd� Y d S w )Nz,Error releasing connection of completed taskT©Úexc_info)rD   Ú	ExceptionÚloggerÚwarning©r9   r0   r   r   r   rV   §   s   €ÿÿz_ConnectionState._safe_releasec                 C   ó
   |   ¡ jS r   )rR   r0   r8   r   r   r   r0   ®   ó   
z_ConnectionState.connc                 C   ra   r   )rR   r1   r8   r   r   r   r1   ²   rb   z_ConnectionState.closedc                 C   ra   r   )rR   r2   r8   r   r   r   r2   ¶   rb   z_ConnectionState.transactionsc                 C   ra   r   )rR   r3   r8   r   r   r   r3   º   rb   z_ConnectionState.ctxc                 C   ra   r   )rR   r4   r8   r   r   r   r4   ¾   rb   z!_ConnectionState.commit_callbacksc                 C   s.   z|   ¡ }W n
 ty   Y d S w | ¡  d S r   )rR   rI   r7   )r9   rQ   r   r   r   r7   Â   s   ÿz_ConnectionState.resetc                 C   s   |   ¡ }||_d|_d S ©NF)rR   r0   r1   )r9   r0   rQ   r   r   r   Úset_connectionÉ   s   
z_ConnectionState.set_connectionr   )r   r   r   r:   rR   rN   rV   Úpropertyr0   r1   r2   r3   r4   r7   rd   r   r   r   r   r=   k   s"    






r=   c                   @   ó,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú_async_transaction_helperc                 Ã   ó   �| j  | j¡I d H S r   ©ÚdbÚrunÚ	__enter__r8   r   r   r   Ú
__aenter__Ð   ó   €z$_async_transaction_helper.__aenter__c                 Ã   ó   �| j  | j|||¡I d H S r   ©rj   rk   Ú__exit__©r9   Úexc_typr   Útbr   r   r   Ú	__aexit__Ó   ó   €z#_async_transaction_helper.__aexit__c                 Ã   rh   r   )rj   rk   Úcommitr8   r   r   r   ÚacommitÖ   rn   z!_async_transaction_helper.acommitc                 Ã   rh   r   )rj   rk   Úrollbackr8   r   r   r   Ú	arollbackÙ   rn   z#_async_transaction_helper.arollbackN)r   r   r   rm   ru   rx   rz   r   r   r   r   rg   Ï   s
    rg   c                   @   r   )Úasync_atomicNr   r   r   r   r   r{   Ý   ó    r{   c                   @   r   )Úasync_transactionNr   r   r   r   r   r}   Þ   r|   r}   c                   @   r   )Úasync_savepointNr   r   r   r   r   r~   ß   r|   r~   c                       s<  e Zd Z‡ fdd„Z‡ fdd„ZdIdd„ZdIdd	„Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ ZdJd5d6„Zd7d8„ Zd9d:„ Zd;d<„ Zd=d>„ Z d?d@„ Z!dIdAdB„Z"dCdD„ Z#dEdF„ Z$e%dGdH„ ƒZ&‡  Z'S )KÚAsyncDatabaseMixinc                    sj   |  dd¡| _|  dd¡| _|  dd¡| _tt| ƒj|fi |¤Ž t| jd�| _	d | _
t ¡ | _d| _d S )NÚ	pool_sizeé
   Úpool_min_sizeé   Úacquire_timeout)rG   F)rS   Ú
_pool_sizeÚ_pool_min_sizeÚ_acquire_timeoutÚsuperr   r:   r=   Ú_release_connÚ_stateÚ_poolr'   ÚLockÚ
_pool_lockÚ_closing©r9   Údatabaser   ©Ú	__class__r   r   r:   ã   s   

zAsyncDatabaseMixin.__init__c                    s"   t  |¡r	tdƒ‚tt| ƒ |¡S )Nz©after_commit() takes a plain callable, and a coroutine would never be awaited. Schedule it instead: after_commit(lambda: asyncio.get_running_loop().create_task(coro())).)r'   ÚiscoroutinefunctionÚ
ValueErrorrˆ   r   Úafter_commit)r9   r   r‘   r   r   r•   î   s   
zAsyncDatabaseMixin.after_commitNc              
   C   sF   zt |  ||pd¡ƒW S  ty" } zd| }t|t ƒ|‚d }~ww )Nr   z,Attempted query outside greenlet runner: %s.)r.   Úaexecute_sqlr   r*   )r9   ÚsqlÚparamsr   r-   r   r   r   Úexecute_sqlö   s   €þzAsyncDatabaseMixin.execute_sqlc              
   Ã   s¸   �|   ||¡ | jrt ¡ nd }z$|  ¡ I d H }t� | ||¡I d H }W d   ƒ n1 s.w   Y  W n tyM } z|d urH|  ||||¡ ‚ d }~ww |d urZ|  |||d ¡ |S r   )	Ú
_log_queryÚquery_hooksÚtimeÚperf_counterÚaconnectr	   Úexecuter]   Ú_notify_hooks)r9   r—   r˜   Ústartr0   r   r   r   r   r   r–   ý   s$   €ÿ€€ýzAsyncDatabaseMixin.aexecute_sqlc                 C   ó   t |  ¡ ƒS r   )r.   rž   r8   r   r   r   Úconnect  ó   zAsyncDatabaseMixin.connectc                 Ã   s„   �| j rtdƒ‚| jj}|d u s| ¡ r@|d ur3z
|  |¡I d H  W n ty2   tjddd� Y nw |  	¡ I d H }| j 
|¡ |S )NzDatabase pool is shutting down.z Error releasing stale connectionTr[   )rŽ   ÚInterfaceErrorrŠ   r0   Ústaler‰   r]   r^   r_   Ú_acquire_conn_asyncrd   r`   r   r   r   rž     s    €
ÿÿzAsyncDatabaseMixin.aconnectc                 C   r¢   r   )r.   Úacloser8   r   r   r   r)   !  r¤   zAsyncDatabaseMixin.closec                 Ã   sP   �|   ¡ r	tdƒ‚| jj}|r&| j ¡  t dt|ƒ¡ |  |¡I d H  d S d S )Nz7Attempting to close database while transaction is open.z Releasing connection %s to pool.)	Úin_transactionÚOperationalErrorrŠ   r0   r7   r^   ÚdebugrJ   r‰   r`   r   r   r   r¨   $  s   €
ýzAsyncDatabaseMixin.aclosec                 Ã   s:   �t |dd ƒ| jur| ¡ I d H  d S |  |¡I d H  d S )Nr‹   )Úgetattrr‹   r)   Ú_pool_releaser`   r   r   r   r‰   .  s   €z AsyncDatabaseMixin._release_connc              	   Ã   s„   �| j 4 I d H š- | jd u r(t� |  ¡ I d H | _W d   ƒ n1 s#w   Y  | jW  d   ƒI d H  S 1 I d H s;w   Y  d S r   )r�   r‹   r	   Ú_create_pool_asyncr8   r   r   r   Ú_ensure_pool5  s   €
ÿ0üzAsyncDatabaseMixin._ensure_poolc                 Ã   s¶   �zt j|  ¡ | jd�I d H }W n t jy    td| j ƒd ‚w zt� |  |¡I d H }W d   ƒ n1 s7w   Y  W n t jyM   td| j ƒd ‚w ||_t	 
dt|ƒ¡ |S )N©Útimeoutz6Timed out connecting to database (acquire_timeout=%s).z>Timed out acquiring connection from pool (acquire_timeout=%s).z!Acquired connection %s from pool.)r'   Úwait_forr¯   r‡   ÚTimeoutErrorrª   r	   Ú_pool_acquirer‹   r^   r«   rJ   ©r9   Úpoolr0   r   r   r   r§   <  s>   €
ÿÿÿþÿÿ€ÿÿþÿz&AsyncDatabaseMixin._acquire_conn_asyncc                 Ã   ó
   �t dƒ‚©NzSubclasses must implement.©ÚNotImplementedErrorr8   r   r   r   r®   R  ó   €z%AsyncDatabaseMixin._create_pool_asyncc                 Ã   r·   r¸   r¹   ©r9   r¶   r   r   r   r´   U  r»   z AsyncDatabaseMixin._pool_acquirec                 Ã   r·   r¸   r¹   r`   r   r   r   r­   X  r»   z AsyncDatabaseMixin._pool_releasec              	   Ã   sx  �d| _ z³| jr²| jjr(t| jjƒ}| jj |¡ tj|ddiŽI d H  | jjst ¡ }t| jj	 
¡ ƒD ]D\}}|j}|d urH| ¡ sH||urHq4|jrp|jsp|j}| ¡  z
|  |¡I d H  W n tyo   tjddd� Y nw | jj	 |d ¡ q4| jjr¢| jj ¡ }z
|  |¡I d H  W n ty�   tjddd� Y nw | jjs}|  ¡ I d H  d | _W d| _ d S W d| _ d S d| _ w )NTÚreturn_exceptionsz,Error releasing connection during pool closer[   z#Error releasing orphaned connectionF)rŽ   r‹   rŠ   rF   ÚlistÚdifference_updater'   ÚgatherrH   rB   Úitemsr6   Údoner0   r1   r7   r‰   r]   r^   r_   rS   rC   Ú_pool_close)r9   Útasksr,   rP   rQ   rO   r0   Úorphanr   r   r   Ú
close_pool[  sT   €ý	
þÿ
ÿÿü
Ó-zAsyncDatabaseMixin.close_poolc                 Ã   r·   r¸   r¹   r8   r   r   r   rÃ   �  r»   zAsyncDatabaseMixin._pool_closec                 Ã   s   �|   | j¡I d H  | S r   )rk   r£   r8   r   r   r   rm   �  s   €zAsyncDatabaseMixin.__aenter__c                 Ã   s   �|   | j¡I d H  d S r   )rk   r)   rr   r   r   r   ru   ”  ó   €zAsyncDatabaseMixin.__aexit__c                 O   ó   t | g|¢R i |¤ŽS r   )r{   ©r9   r   r   r   r   r   Úatomic—  ó   zAsyncDatabaseMixin.atomicc                 O   rÈ   r   )r}   rÉ   r   r   r   Útransactionš  rË   zAsyncDatabaseMixin.transactionc                 C   ó   t | ƒS r   )r~   r8   r   r   r   Ú	savepoint�  ó   zAsyncDatabaseMixin.savepointc                 Ï   ó    �t | jg|¢R i |¤ŽI d H S r   )r&   Úcreate_tablesrÉ   r   r   r   Úacreate_tables   ó   €z!AsyncDatabaseMixin.acreate_tablesc                 Ï   rÐ   r   )r&   Údrop_tablesrÉ   r   r   r   Úadrop_tables£  rÓ   zAsyncDatabaseMixin.adrop_tablesc                 Ã   s   �|  | ¡ |  |j¡I d H S r   )Úbindrk   rŸ   ©r9   Úqueryr   r   r   Úaexecute¦  s   €
zAsyncDatabaseMixin.aexecutec                 Ã   ó   �|   |j¡I d H S r   )rk   rK   r×   r   r   r   rK   ª  ó   €zAsyncDatabaseMixin.getrƒ   c                 Ã   s   �| j |j|d�I d H S )N)Ún)rk   Úfirst)r9   rØ   rÜ   r   r   r   rÝ   ­  rÇ   zAsyncDatabaseMixin.firstc                 Ã   s   �|   t|¡I d H S r   )rk   r¾   r×   r   r   r   r¾   °  rÛ   zAsyncDatabaseMixin.listc                 Ã   rÚ   r   )rk   Úscalarr×   r   r   r   rÞ   ³  rÛ   zAsyncDatabaseMixin.scalarc                 Ã   rÚ   r   )rk   Úcountr×   r   r   r   rß   ¶  rÛ   zAsyncDatabaseMixin.countc                 Ã   rÚ   r   )rk   Úexistsr×   r   r   r   rà   ¹  rÛ   zAsyncDatabaseMixin.existsc                 Ç   s   �| j t|g|¢R Ž I d H S r   )rk   Úprefetch)r9   rØ   Ú
subqueriesr   r   r   Ú	aprefetch¼  rv   zAsyncDatabaseMixin.aprefetchc                 C  sÒ   �|  | ¡ | ¡ \}}|  ¡ I d H }t� | ||pd¡I d H }W d   ƒ n1 s+w   Y  |d ur7||_z)| |¡}| ¡ }tƒ }		 t	t
||	ƒI d H }
|
|	u rSn|
V  qEW | ¡ I d H  d S | ¡ I d H  w )Nr   )rÖ   r—   rž   r	   Úexecute_iterÚ_buffer_sizeÚ_get_cursor_wrapperÚiteratorÚobjectr&   Únextr¨   )r9   rØ   Úbuffer_sizer—   r˜   r0   ÚcursorÚwrapperÚrow_iterÚ	_sentinelÚrowr   r   r   Úiterate¿  s*   €
ÿ
ü"zAsyncDatabaseMixin.iteratec                 Ï   s   �t |g|¢R i |¤ŽI d H S r   )r&   )r9   r   r   r   r   r   r   rk   Ù  s   €zAsyncDatabaseMixin.runc                 C   s    z| j jW S  ty   Y dS w r;   )rŠ   r1   rI   r8   r   r   r   Ú	is_closedÜ  s
   
ÿzAsyncDatabaseMixin.is_closedc                    s6   t ˆ dƒsG ‡ fdd„dƒ}tdtfd|iƒˆ _ˆ jS )NÚ_Modelc                       s   e Zd Z” ZdS )z&AsyncDatabaseMixin.Model.<locals>.MetaN)r   r   r   r�   r   r8   r   r   ÚMetaå  s    ró   ÚAsyncBaseModel)ÚhasattrÚtypeÚ
AsyncModelrò   )r9   ró   r   r8   r   ÚModelâ  s   
zAsyncDatabaseMixin.Modelr   )rƒ   )(r   r   r   r:   r•   r™   r–   r£   rž   r)   r¨   r‰   r¯   r§   r®   r´   r­   rÆ   rÃ   rm   ru   rÊ   rÌ   rÎ   rÒ   rÕ   rÙ   rK   rÝ   r¾   rÞ   rß   rà   rã   rð   rk   rñ   re   rø   Ú__classcell__r   r   r‘   r   r   â   sJ    


2

r   c                 C   sT   | j j}t|tƒr|j}|d u rtd| j ƒ‚t|tƒs(td| jt|ƒjf ƒ‚|S )NzG%s is not bound to a database. Async methods require an Async database.z`%s is not bound to an asyncio-compatible database (%s). Async methods require an Async database.)	Ú_metar�   Ú
isinstanceÚProxyÚobjr¥   r   r   rö   )Úmodelrj   r   r   r   Ú_aio_databaseê  s   
ÿ
þrÿ   c                   @   s˜   e Zd Zedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZed	d
„ ƒZedd„ ƒZ	edd„ ƒZ
eddd„ƒZeddd„ƒZddd„Zddd„Zdd„ ZdS )ÚAsyncModelMixinc                 Ë   ó    �t | ƒj| jfi |¤ŽI d H S r   )rÿ   rk   Úcreate)ÚclsrØ   r   r   r   Úacreateú  s   €zAsyncModelMixin.acreatec                 Ï   ó&   �t | ƒj| jg|¢R i |¤ŽI d H S r   )rÿ   rk   rK   ©r  rØ   Úfiltersr   r   r   Úagetþ  ó   €$zAsyncModelMixin.agetc                 Ï   r  r   )rÿ   rk   Úget_or_noner  r   r   r   Úaget_or_none  r	  zAsyncModelMixin.aget_or_nonec                 Ã   ó   �t | ƒ | j|¡I d H S r   )rÿ   rk   Ú	get_by_id©r  Úpkr   r   r   Ú
aget_by_id  ó   €zAsyncModelMixin.aget_by_idc                 Ë   r  r   )rÿ   rk   Úget_or_create)r  r   r   r   r   Úaget_or_create
  s   €zAsyncModelMixin.aget_or_createc                 Ã   ó   �t | ƒ | j||¡I d H S r   )rÿ   rk   Ú	set_by_id)r  Úkeyr%   r   r   r   Ú
aset_by_id  s   €zAsyncModelMixin.aset_by_idc                 Ã   r  r   )rÿ   rk   Údelete_by_idr  r   r   r   Úadelete_by_id  r  zAsyncModelMixin.adelete_by_idNc                 Ã   r  r   )rÿ   rk   Úbulk_create)r  Ú
model_listÚ
batch_sizer   r   r   Úabulk_create  s   €
ýzAsyncModelMixin.abulk_createc                 Ã   s   �t | ƒ | j|||¡I d H S r   )rÿ   rk   Úbulk_update)r  r  Úfieldsr  r   r   r   Úabulk_update  s   €
üzAsyncModelMixin.abulk_updateFc                 Ã   ó    �t t| ƒƒ | j||¡I d H S r   )rÿ   rö   rk   Úsave)r9   Úforce_insertÚonlyr   r   r   Úasave'  s   €
ýzAsyncModelMixin.asavec                 Ã   r!  r   )rÿ   rö   rk   Údelete_instance)r9   Ú	recursiveÚdelete_nullabler   r   r   Úadelete_instance.  s   €
ýz AsyncModelMixin.adelete_instancec                 Ã   s~   �t |tƒr| jj| }t |tƒstdƒ‚|j| jv r!| j|j S |js0tdt	| ƒj
|jf ƒ‚tt	| ƒƒ t| |j¡I d H S )Nz%afetch() accepts a foreign-key field.z'%s.%s is declared with lazy_load=False.)rû   Ústrrú   ÚcombinedÚForeignKeyFieldr”   ÚnameÚ__rel__Ú	lazy_loadrö   r   rÿ   rk   r¬   )r9   Úfieldr   r   r   Úafetch4  s   €

ÿzAsyncModelMixin.afetchr   )FN)FF)r   r   r   Úclassmethodr  r  r  r  r  r  r  r  r   r%  r)  r1  r   r   r   r   r   ù  s,    








r   c                   @   r   )r÷   Nr   r   r   r   r   r÷   B  r   r÷   c                   @   sP   e Zd Z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S )ÚCursorAdapteréd   Nc                 C   sd   |pg | _ d| _|| _|d ur|nt| j ƒ| _|pg | _|| _|| _|p&| j| _	t
 ¡ | _d| _d S )Nr   F)Ú_rowsÚ_idxÚ	lastrowidÚlenÚrowcountÚdescriptionÚ_fetch_manyÚ_cleanupÚDEFAULT_BUFFER_SIZErå   ÚcollectionsÚdequeÚ_bufferÚ
_exhausted)r9   Úrowsr7  r9  r:  Ú
fetch_manyÚcleanuprê   r   r   r   r:   I  s   



zCursorAdapter.__init__c                 C   sD   | j d ur	|  ¡ S | jt| jƒkrd S | j| j }|  jd7  _|S ©Nrƒ   )r;  Ú_lazy_fetchoner6  r8  r5  )r9   rï   r   r   r   ÚfetchoneY  s   
zCursorAdapter.fetchonec                 C   sh   | j s/| jrd S t� t|  | j¡ƒ}W d   ƒ n1 sw   Y  |s)d| _d S | j  |¡ | j  ¡ S r;   )r@  rA  r	   r.   r;  rå   ÚextendÚpopleft)r9   rB  r   r   r   rF  b  s   ÿ
zCursorAdapter._lazy_fetchonec                 C   s   | j d ur	t| ƒS | jS r   )r;  r¾   r5  r8   r   r   r   Úfetchalln  s   
zCursorAdapter.fetchallc                 C   s   | j d ur	t| ƒS t| jƒS r   )r;  Ú_lazy_cursor_iterÚiterr5  r8   r   r   r   Ú__iter__s  s   

zCursorAdapter.__iter__c                 C   s   d S r   r   r8   r   r   r   r)   x  s   zCursorAdapter.closec                 Ã   s@   �| j d urz|   ¡ I d H  W d | _ d | _d S d | _ d | _w d S r   )r<  r;  r8   r   r   r   r¨   {  s   €

ÿûzCursorAdapter.aclose)NNNNNNN)r   r   r   r=  r:   rG  rF  rJ  rM  r)   r¨   r   r   r   r   r3  F  s    
þ	r3  c                 c   s    � 	 |   ¡ }|d u rd S |V  qr   )rG  )rë   rï   r   r   r   rK  „  s   €ürK  c                   @   s&   e Zd Zdd„ Zddd„Zdd„ ZdS )	ÚDummyCursorc                 C   s
   || _ d S r   ©r0   r`   r   r   r   r:   �  ó   
zDummyCursor.__init__Nc                 C   s   t |  ||¡ƒS r   )r.   Ú_async_execute©r9   r—   r˜   r   r   r   rŸ   �  s   zDummyCursor.executec                 Ã   s   �| j  ||¡I d H S r   )r0   rŸ   rR  r   r   r   rQ  “  rn   zDummyCursor._async_executer   )r   r   r   r:   rŸ   rQ  r   r   r   r   rN  Œ  s    
rN  c                   @   sT   e 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d„Z
dd„ ZdS )ÚAsyncConnectionWrapperg      @c                 C   s   || _ t ¡ | _d| _d S rc   )r0   r'   rŒ   Ú_lockÚ
_streamingr`   r   r   r   r:   �  s   

zAsyncConnectionWrapper.__init__c                 Ã   sX   �| j r"zt | j ¡ | j¡I d H  W d S  tjy!   tdƒd ‚w | j ¡ I d H  d S )NzzConnection is busy streaming results from iterate(). Run the query from another task, or exhaust or aclose() the iterator.)rU  r'   r²   rT  ÚacquireÚstreaming_timeoutr³   r¥   r8   r   r   r   Ú_acquire_lock¢  s   €ÿÿýÿz$AsyncConnectionWrapper._acquire_lockNc                 Ã   s<   �|   ¡ I d H  z|  ||¡I d H W | j ¡  S | j ¡  w r   )rX  Ú_executerT  rG   rR  r   r   r   rŸ   ²  s
   €zAsyncConnectionWrapper.executec                 Ã   r·   r¸   r¹   rR  r   r   r   rY  ¹  r»   zAsyncConnectionWrapper._executec                 C   rÍ   r   )rN  r8   r   r   r   rë   ¼  rÏ   zAsyncConnectionWrapper.cursorc                 C   s
   | j d u S r   rO  r8   r   r   r   r¦   ¿  s   
zAsyncConnectionWrapper.stalec                 Ã   r·   r¸   r¹   rR  r   r   r   rä   Ä  r»   z#AsyncConnectionWrapper.execute_iterc                 Ã   ó&   �| j r| j  ¡ I d H  d | _ d S d S r   )r0   r)   r8   r   r   r   r)   Ç  s
   €
þzAsyncConnectionWrapper.closer   )r   r   r   rW  r:   rX  rŸ   rY  rë   r¦   rä   r)   r   r   r   r   rS  —  s    

rS  c                   @   sP   e Zd Zdd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S )ÚAsyncSqlitePoolé   Nc                 K   s0   || _ || _|| _|| _tj|d�| _d| _d S )N)ÚmaxsizeF)Ú	_databaser…   Ú_on_connectÚ_connect_paramsr'   ÚQueueÚ_queueÚ_closed)r9   r�   r€   Ú
on_connectÚconnect_paramsr   r   r   r:   Î  s   
zAsyncSqlitePool.__init__c                 Ã   s0   �t | jƒD ]}|  ¡ I d H }| j |¡ q| S r   )Úranger…   Ú_create_connectionrb  Ú
put_nowait)r9   Ú_r0   r   r   r   Ú
initialize×  s
   €zAsyncSqlitePool.initializec                 Ã   sD   �t j| jfdd i| j¤ŽI d H }| jd ur|  |¡I d H  t|ƒS ©NÚisolation_level)Ú	aiosqliter£   r^  r`  r_  ÚAsyncSqliteConnectionr`   r   r   r   rg  Ý  s   €ÿþý
z"AsyncSqlitePool._create_connectionc                 Ã   s*   �| j rtdƒ‚tj| j ¡ |d�I d H S )NzPool is closed.r°   )rc  r¥   r'   r²   rb  rK   )r9   r±   r   r   r   rV  æ  s   €zAsyncSqlitePool.acquirec                 C   s
   |  ¡  S r   )r¦   r`   r   r   r   Ú_conn_is_validë  rP  zAsyncSqlitePool._conn_is_validc                 Ã   s:   �z
|  ¡ I d H  W d S  ty   tjddd� Y d S w )NzError closing pooled connectionTr[   )r)   r]   r^   r_   r`   r   r   r   Ú_close_connî  s   €ÿzAsyncSqlitePool._close_connc                 Ã   sÈ   �| j r|  |¡I d H  d S |  |¡}|r6|jjr6z
|j ¡ I d H  W n ty5   tjddd� d}Y nw |sG|  |¡I d H  |  	¡ I d H }z	| j
 |¡ W d S  tjyc   |  |¡I d H  Y d S w )NúError rolling back connectionTr[   F)rc  rp  ro  r0   r©   ry   r]   r^   r_   rg  rb  rh  r'   Ú	QueueFull)r9   r0   Úvalidr   r   r   rG   ô  s(   €
þþzAsyncSqlitePool.releasec                 Ã   sB   �d| _ 	 z| j ¡ }W n tjy   Y d S w |  |¡I d H  qr;   )rc  rb  Ú
get_nowaitr'   Ú
QueueEmptyrp  r`   r   r   r   r)     s   €ÿûzAsyncSqlitePool.close)r\  Nr   )r   r   r   r:   rj  rg  rV  ro  rp  rG   r)   r   r   r   r   r[  Í  s    
	
	r[  c                   @   s(   e Zd Zdd„ Zddd„Zddd„ZdS )	rn  c                 C   s*   | j d u pt| j ddƒ pt| j ddƒ S )NÚ_runningTÚ_connection)r0   r¬   r8   r   r   r   r¦     s
   
ÿþzAsyncSqliteConnection.staleNc                 Ã   s\   �|pd}| j  ||¡I d H }| ¡ I d H }|j}|j}|j}| ¡ I d H  t||||d�S ©Nr   )r7  r9  r:  )r0   rŸ   rJ  r7  r9  r:  r)   r3  ©r9   r—   r˜   rë   rB  r7  r9  r:  r   r   r   rY    s   €ÿzAsyncSqliteConnection._executec                 ƒ   s†   �ˆ  ¡ I d H  dˆ_zˆj ||pd¡I d H ‰ W n ty)   dˆ_ˆj ¡  ‚ w ˆj‰‡ fdd„}‡ ‡‡fdd„}tˆ j||d�S )	NTr   Fc                 “   ó   �ˆ   | ¡I d H S r   ©Ú	fetchmany©rß   ©rë   r   r   rC  4  ó   €z6AsyncSqliteConnection.execute_iter.<locals>.fetch_manyc                   “   ó6   �zˆ   ¡ I d H  W dˆ_ˆ ¡  d S dˆ_ˆ ¡  w rc   ©r)   rU  rG   r   ©rë   Úlockr9   r   r   rD  7  ó   €ÿ
z3AsyncSqliteConnection.execute_iter.<locals>.cleanup©r:  rC  rD  )	rX  rU  r0   rŸ   r   rT  rG   r3  r:  ©r9   r—   r˜   rC  rD  r   r‚  r   rä   (  s$   €
ýýz"AsyncSqliteConnection.execute_iterr   )r   r   r   r¦   rY  rä   r   r   r   r   rn    s    
rn  c                   @   sl   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )ÚAsyncSqliteDatabasec                 Ã   sV   �t d u r	tdƒ‚| jdkrd}n| j}t| jf|| j| jdœ| j¤Ž}| ¡ I d H S )Nzaiosqlite is not installedz:memory:rƒ   )r€   rd  r±   )	rm  ÚImproperlyConfiguredr�   r…   r[  Ú_add_conn_hooksÚ_timeoutre  rj  )r9   r€   r¶   r   r   r   r®   E  s   €

þýz&AsyncSqliteDatabase._create_pool_asyncc                 Ã   s®   �| j r|  |¡I d H  | jr|  |¡I d H  | jr"|  |¡I d H  | jr-|  |¡I d H  | jr8|  	|¡I d H  | j
rHtjdkrH|  |¡I d H  | jrU|  |¡I d H  d S d S )N)é   é   r   )Ú	_attachedÚ_attach_databasesÚ_pragmasÚ_set_pragmasÚ_aggregatesÚ_load_aggregatesÚ_collationsÚ_load_collationsÚ
_functionsÚ_load_functionsÚ_window_functionsrm  Úsqlite_version_infoÚ_load_window_functionsÚ_extensionsÚ_load_extensionsr`   r   r   r   r‰  T  s"   €
ÿz#AsyncSqliteDatabase._add_conn_hooksc                 Ã   s2   �| j  ¡ D ]\}}| d||f ¡I d H  qd S )NzATTACH DATABASE "%s" AS "%s")r�  rÁ   rŸ   )r9   r0   r-  rj   r   r   r   rŽ  e  ó   €ÿz%AsyncSqliteDatabase._attach_databasesc                 Ã   s.   �| j D ]\}}| d||f ¡I d H  qd S )NzPRAGMA %s = %s;)r�  rŸ   )r9   r0   Úpragmar%   r   r   r   r�  i  s   €ÿz AsyncSqliteDatabase._set_pragmasc                 Ã   ó8   �| j  ¡ D ]\}\}}| |jj|||¡I d H  qd S r   )r‘  rÁ   rY  Ú_connÚcreate_aggregate©r9   r0   r-  ÚklassÚ
num_paramsr   r   r   r’  m  s   €ÿÿz$AsyncSqliteDatabase._load_aggregatesc                 Ã   s2   �| j  ¡ D ]\}}| |jj||¡I d H  qd S r   )r“  rÁ   rY  rŸ  Úcreate_collation)r9   r0   r-  r   r   r   r   r”  t  rœ  z$AsyncSqliteDatabase._load_collationsc                 Ã   sL   �| j  ¡ D ]\}\}}}|rd|ini }|j|||fi |¤ŽI d H  qd S )NÚdeterministic)r•  rÁ   Úcreate_function)r9   r0   r-  r   Ún_paramsr¥  r   r   r   r   r–  x  s
   €þz#AsyncSqliteDatabase._load_functionsc                 Ã   rž  r   )r—  rÁ   rY  rŸ  Úcreate_window_functionr¡  r   r   r   r™  }  s   €ÿÿz*AsyncSqliteDatabase._load_window_functionsc                 Ã   s2   �|  d¡I d H  | jD ]
}| |¡I d H  qd S r;   )Úenable_load_extensionrš  Úload_extension)r9   r0   Ú	extensionr   r   r   r›  ‚  s
   €
ÿz$AsyncSqliteDatabase._load_extensionsc                 Ã   s   �|j | jd�I d H S ©Nr°   )rV  r‡   r¼   r   r   r   r´   ‡  rn   z!AsyncSqliteDatabase._pool_acquirec                 Ã   s$   �|d ur| j  |¡I d H  d S d S r   )r‹   rG   r`   r   r   r   r­   Š  s   €ÿz!AsyncSqliteDatabase._pool_releasec                 Ã   s    �| j r| j  ¡ I d H  d S d S r   )r‹   r)   r8   r   r   r   rÃ   Ž  s   €ÿzAsyncSqliteDatabase._pool_closeN)r   r   r   r®   r‰  rŽ  r�  r’  r”  r–  r™  r›  r´   r­   rÃ   r   r   r   r   r‡  D  s    r‡  c                   @   s0   e Zd Zd
dd„Zd
dd„Zdd„ Zdd	„ ZdS )ÚAsyncMySQLConnectionNc                 Ã   s€   �|pd}| j  ¡ I d H }z"| ||¡I d H  | ¡ I d H }|j}|j}|j}W | ¡ I d H  n| ¡ I d H  w t||||d�S rx  )	r0   rë   rŸ   rJ  r7  r9  r:  r)   r3  ry  r   r   r   rY  ”  s   € ÿzAsyncMySQLConnection._executec                 ƒ   s˜   �ˆ  ¡ I d H  dˆ_zˆj tj¡I d H ‰ ˆ  ||pd¡I d H  W n ty2   dˆ_ˆj 	¡  ‚ w ˆj‰‡ fdd„}‡ ‡‡fdd„}t
ˆ j||d�S )	NTr   Fc                 “   rz  r   r{  r}  r~  r   r   rC  °  r  z5AsyncMySQLConnection.execute_iter.<locals>.fetch_manyc                   “   r€  rc   r�  r   r‚  r   r   rD  ³  r„  z2AsyncMySQLConnection.execute_iter.<locals>.cleanupr…  )rX  rU  r0   rë   ÚaiomysqlÚSSCursorrŸ   r   rT  rG   r3  r:  r†  r   r‚  r   rä   ¢  s&   €
ýýz!AsyncMySQLConnection.execute_iterc                 Ã   rZ  r   )r0   Úensure_closedr8   r   r   r   r)   ¿  s
   €
þzAsyncMySQLConnection.closec                 C   s   | j d u p| j jS r   )r0   r1   r8   r   r   r   r¦   Å  ó   zAsyncMySQLConnection.staler   )r   r   r   rY  rä   r)   r¦   r   r   r   r   r­  “  s
    

r­  c                   @   rf   )
ÚAsyncMySQLDatabasec                 Ã   sP   �t d u r	tdƒ‚t| jƒ}| d| j¡ t jd| jd| j| j	dœ|¤ŽI d H S )Nzaiomysql is not installedÚconnect_timeoutT)rj   Ú
autocommitÚminsizer]  r   )
r®  rˆ  Údictre  Ú
setdefaultr‡   Úcreate_poolr�   r†   r…   )r9   r˜   r   r   r   r®   Ê  s   €
üûz%AsyncMySQLDatabase._create_pool_asyncc              
   Ã   sj   �zt j| ¡ | jd�I d H }W n ty# } ztt|ƒƒd ‚d }~ww | jd u r1|  | 	¡ ¡| _t
|ƒS r¬  )r'   r²   rV  r‡   rI   r¥   r*  Úserver_versionÚ_extract_server_versionÚget_server_infor­  )r9   r¶   r0   r   r   r   r   r´   Ù  s   €þ€þ
ÿz AsyncMySQLDatabase._pool_acquirec                 Ã   sf   �|r/|j r1|j  ¡ r&z
|j  ¡ I d H  W n ty%   tjddd� Y nw | j |j ¡ d S d S d S )Nrq  Tr[   )r0   Úget_transaction_statusry   r]   r^   r_   r‹   rG   r`   r   r   r   r­   ç  s   €


ÿÿöz AsyncMySQLDatabase._pool_releasec                 Ã   s’   �| j  ¡  ztj| j  ¡ | jd�I d H  W d S  tjyH   | j  ¡  ztj| j  ¡ | jd�I d H  W Y d S  tjyG   t 	d¡ Y Y d S w w )Nr°   z$Timed out finalizing terminated pool)
r‹   r)   r'   r²   Úwait_closedr‡   r³   Ú	terminater^   r_   r8   r   r   r   rÃ   ô  s    €
ÿ
ÿÿùzAsyncMySQLDatabase._pool_closeN)r   r   r   r®   r´   r­   rÃ   r   r   r   r   r²  É  s
    r²  c                   @   s<   e Zd Zdd„ Zdd„ Zddd„Zddd	„Zed
d„ ƒZdS )ÚAsyncPostgresqlConnectionc                 C   s0   | j d u rdS z| j  ¡ W S  ty   Y dS w r;   )r0   rñ   r]   r8   r   r   r   r¦     s   
þzAsyncPostgresqlConnection.stalec                 Ã   sB   �| j d }| _ |d urt|ddƒd ur| ¡ I d H  d S d S d S )NÚ_conT)r0   r¬   r)   r`   r   r   r   r)     s
   €ÿzAsyncPostgresqlConnection.closeNc                 Ã   s¦   �|r|   |¡}| j |¡I d H }|j|pdŽ I d H }|r)dd„ |d  ¡ D ƒ}ng }| ¡ p0d dd¡}t|ƒdkrH|d  ¡ rHt	|d ƒ}nt|ƒ}t
|||d	�S )
Nr   c                 S   s   g | ]}|f‘qS r   r   )Ú.0Úkr   r   r   Ú
<listcomp>  s    z6AsyncPostgresqlConnection._execute.<locals>.<listcomp>r   Ú ú rƒ   é   )r9  r:  )Ú_translate_placeholdersr0   ÚprepareÚfetchÚkeysÚget_statusmsgÚrsplitr8  ÚisdigitÚintr3  )r9   r—   r˜   ÚstmtÚrecordsr:  Ústatusr9  r   r   r   rY    s   €
ÿz"AsyncPostgresqlConnection._executec                 ƒ   sø   �|rˆ  |¡}ˆ ¡ I d H  dˆ_d ‰z!ˆj ¡ ‰ˆ ¡ I d H  ˆj |¡I d H }|j|p/dŽ I d H ‰ W n' ty\   ˆd urSz	ˆ 	¡ I d H  W n	 t
yR   Y nw dˆ_ˆj ¡  ‚ w ˆj‰‡ fdd„}‡‡‡fdd„}t||dd	„ | ¡ D ƒd
�S )NTr   Fc                 “   rz  r   )rÉ  r}  r~  r   r   rC  J  r  z:AsyncPostgresqlConnection.execute_iter.<locals>.fetch_manyc                   “   sb   �z'z	ˆ  ¡ I d H  W n	 ty   Y nw W dˆ_ˆ  ¡  d S W dˆ_ˆ  ¡  d S dˆ_ˆ  ¡  w rc   )ry   r]   rU  rG   r   )rƒ  r9   Útrr   r   rD  M  s   €ÿÿýÿ
z7AsyncPostgresqlConnection.execute_iter.<locals>.cleanupc                 S   s   g | ]}|j f‘qS r   )r-  )rÁ  Úar   r   r   rÃ  Y  s    z:AsyncPostgresqlConnection.execute_iter.<locals>.<listcomp>)rC  rD  r:  )rÇ  rX  rU  r0   rÌ   r¡   rÈ  rë   r   ry   r]   rT  rG   r3  Úget_attributes)r9   r—   r˜   rÏ  rC  rD  r   )rë   rƒ  r9   rÒ  r   rä   -  s<   €

ÿ
÷	ýz&AsyncPostgresqlConnection.execute_iterc                    s0   d| vr| S t  d¡‰ ‡ fdd„}t d|| ¡S )Nú%rƒ   c                    s   |   d¡dkr	dS dtˆ ƒ S )Nr   z%%rÕ  z$%d)Úgroupré   )Úmatch©Úcounterr   r   Úreplacec  s   zBAsyncPostgresqlConnection._translate_placeholders.<locals>.replacez%%|%s)Ú	itertoolsrß   ÚreÚsub)r—   rÚ  r   rØ  r   rÇ  [  s
   
z1AsyncPostgresqlConnection._translate_placeholdersr   )	r   r   r   r¦   r)   rY  rä   ÚstaticmethodrÇ  r   r   r   r   r¿    s    	

.r¿  c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚAsyncPgAdapterc                    s   t t| ƒ ¡  t| _t| _d S r   )rˆ   rß  r:   r   Ú	json_typeÚ
jsonb_typer8   r‘   r   r   r:   k  s   
zAsyncPgAdapter.__init__)r   r   r   r:   rù   r   r   r‘   r   rß  j  s    rß  c                   @   sd   e Zd Zdd„ Zdd„ Zdd„ Zddd	„Zdd
d„Zdd„ Zddd„Z	ddd„Z
dd„ Zdd„ ZdS )ÚAsyncPgAtomicc                 O   s   || _ ||f| _d S r   )rj   Ú_begin_args)r9   rj   r   r   r   r   r   r:   r  s   zAsyncPgAtomic.__init__c                 C   s    t |  ¡ ƒ | jjj | ¡ | S r   )r.   Ú_abeginrj   rŠ   r2   rY   r8   r   r   r   rl   v  s   zAsyncPgAtomic.__enter__c                 C   sž   | j jj ¡  | j jj }|r|r| j  ¡  |  d¡ d S z|  d¡ W n tyC   |r2| j  ¡  z|  d¡ W ‚  tyB   Y ‚ w w |rM| j  ¡  d S d S rc   )	rj   rŠ   r2   rS   Ú_clear_commit_callbacksry   rw   r]   Ú_run_commit_callbacks)r9   Úexc_typeÚexc_valÚexc_tbÚ	outermostr   r   r   rq   {  s,   

þþù
ÿzAsyncPgAtomic.__exit__Tc                 C   ó   t |  |¡ƒ d S r   )r.   rx   ©r9   Úbeginr   r   r   rw   ’  r±  zAsyncPgAtomic.commitc                 C   rë  r   )r.   rz   rì  r   r   r   ry   •  r±  zAsyncPgAtomic.rollbackc                 Ã   sn   �| j \}}| j ¡ I d H }t� |jj|i |¤Ž| _| j ¡ I d H  W d   ƒ | jS 1 s/w   Y  | jS r   )rã  rj   rž   r	   r0   rÌ   Ú_txr¡   )r9   rÓ  rÂ  r0   r   r   r   rä  ˜  s   €

þýzAsyncPgAtomic._abeginc                 Ã   óP   �t � | j ¡ I d H  W d   ƒ n1 sw   Y  |r&|  ¡ I d H  d S d S r   )r	   rî  rw   rä  rì  r   r   r   rx      ó   €ÿÿzAsyncPgAtomic.acommitc                 Ã   rï  r   )r	   rî  ry   rä  rì  r   r   r   rz   ¦  rð  zAsyncPgAtomic.arollbackc                 Ã   rh   r   ri   r8   r   r   r   rm   ¬  rn   zAsyncPgAtomic.__aenter__c                 Ã   ro   r   rp   )r9   rç  rè  ré  r   r   r   ru   ¯  rv   zAsyncPgAtomic.__aexit__N)T)r   r   r   r:   rl   rq   rw   ry   rä  rx   rz   rm   ru   r   r   r   r   râ  q  s    



râ  c                       sd   e Zd Ze ZZ‡ fdd„Zdd„ Zdd„ Zdd„ Z	d	d
„ Z
dd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚAsyncPostgresqlDatabasec                    s*   |  dd ¡| _tt| ƒj|fi |¤Ž d S rk  )rS   Ú_async_isolation_levelrˆ   rñ  Úinitr�   r‘   r   r   ró  ¶  s   zAsyncPostgresqlDatabase.initc                 Ã   sz   �dd„ }dd„ }|j d||ddd�I d H  d	d
„ }dd„ }|j d||ddd�I d H  | jr;| d| j ¡I d H  d S d S )Nc                 S   s   t | tƒr| S |  d¡S )NÚutf8©rû   ÚbytesÚencode©Úvalr   r   r   Úencode_json½  s   z>AsyncPostgresqlDatabase.register_adapters.<locals>.encode_jsonc                 S   s   t  |  ¡ ¡S r   ©ÚjsonÚloadsÚdecode©Úbvalr   r   r   Údecode_jsonÀ  s   z>AsyncPostgresqlDatabase.register_adapters.<locals>.decode_jsonrü  Ú
pg_catalogÚbinary)ÚencoderÚdecoderÚschemaÚformatc                 S   s    t | tƒr	d|  S d|  d¡ S )Nó   rô  rõ  rø  r   r   r   Úencode_jsonbÇ  s   
z?AsyncPostgresqlDatabase.register_adapters.<locals>.encode_jsonbc                 S   s   t  | dd …  ¡ ¡S rE  rû  rÿ  r   r   r   Údecode_jsonbÌ  rË   z?AsyncPostgresqlDatabase.register_adapters.<locals>.decode_jsonbÚjsonbz=SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL %s)Úset_type_codecrò  rŸ   )r9   r0   rú  r  r	  r
  r   r   r   Úregister_adapters¼  s(   €þþÿÿÿz)AsyncPostgresqlDatabase.register_adaptersc                 Ã   sz   �t d u r	tdƒ‚| jr| j d¡rd| ji}nd| ji}t| jƒ}| d| j¡ t jd| j	| j
| jdœ|¤|¤ŽI d H S )Nzasyncpg is not installed)zpostgresql://zpostgres://Údsnr�   r±   )Úmin_sizeÚmax_sizeró  r   )Úasyncpgrˆ  r�   Ú
startswithr¶  re  r·  r‡   r¸  r†   r…   r  )r9   Ú	db_paramsr˜   r   r   r   r®   Ø  s&   €ÿ

ýüûz*AsyncPostgresqlDatabase._create_pool_asyncc                 Ã   s$   �t j| ¡ | jd�I d H }t|ƒS r¬  )r'   r²   rV  r‡   r¿  rµ   r   r   r   r´   ê  s   €þz%AsyncPostgresqlDatabase._pool_acquirec                 Ã   s”   �|rF|j rHt|j dd ƒ}z|d ur| ¡ I d H  n|j  ¡ r(|j  d¡I d H  W n ty9   tjddd� Y nw | j 	|j ¡I d H  d S d S d S )NÚ	_top_xactÚROLLBACKrq  Tr[   )
r0   r¬   ry   Úis_in_transactionrŸ   r]   r^   r_   r‹   rG   )r9   r0   Útop_xactr   r   r   r­   ð  s   €

€ÿòz%AsyncPostgresqlDatabase._pool_releasec                 Ã   sF   �zt j| j ¡ | jd�I d H  W d S  t jy"   | j ¡  Y d S w r¬  )r'   r²   r‹   r)   r‡   r³   r¾  r8   r   r   r   rÃ     s   €ÿÿz#AsyncPostgresqlDatabase._pool_closec                 O   rÈ   r   ©râ  rÉ   r   r   r   rÊ   	  rË   zAsyncPostgresqlDatabase.atomicc                 O   rÈ   r   r  rÉ   r   r   r   rÌ     rË   z#AsyncPostgresqlDatabase.transactionc                 O   rÈ   r   r  rÉ   r   r   r   rÎ     rË   z!AsyncPostgresqlDatabase.savepoint)r   r   r   rß  Úpsycopg2_adapterÚpsycopg3_adapterró  r  r®   r´   r­   rÃ   rÊ   rÌ   rÎ   rù   r   r   r‘   r   rñ  ³  s    rñ  ):r'   r>  r?   rÛ  rü  ÚloggingrÜ  rœ   r   r   Úpeeweer   r   r   r   r	   r
   Úplayhouse.postgres_extr   rm  ÚImportErrorr  r®  Ú	getLoggerr^   rI   r   r*   r&   r.   rè   r/   r=   rg   r{   r}   r~   r   rÿ   r   rø   r÷   r3  rK  rN  rS  r[  rn  ÚSqliteDatabaser‡  r­  ÚMySQLDatabaser²  r¿  rß  râ  ÚPostgresqlDatabaserñ  r   r   r   r   Ú<module>   sz    ÿÿÿ
ÿd  
I>6I.O6<eB