o
    iR                     @  s<  d dl mZ d dlZd dlZd dlZd dlmZ d dl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 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 edZd'ddZG dd dZG dd dZeG dd dZG d d! d!Zd(d%d&ZdS ))    )annotationsN)	dataclass)Any)Callable)	Coroutine)Deque)List)Optional)TypeVar   )Client)InArgs)InStatement)LibsqlError)Transactioncreate_client)	ResultSetTargsr   kwargsreturn
ClientSyncc                    s@   t  }z| fdd}t||W S  ty   |   w )Nc                     s   t  i S Nr    r   r   r   F/home/ubuntu/.local/lib/python3.10/site-packages/libsql_client/sync.py<lambda>   s    z$create_client_sync.<locals>.<lambda>)_AsyncExecutorsubmit_funcr   	Exceptionclose)r   r   executorclientr   r   r   create_client_sync   s   r$   c                   @  st   e Zd ZU ded< ded< d(ddZd)d*ddZd+ddZd,ddZd-ddZe	d.ddZ
d/d d!Zd0d&d'Zd	S )1r   r   	_executorr   _clientr"   r#   c                 C     || _ || _d S r   )r%   r&   )selfr"   r#   r   r   r   __init__)      
zClientSync.__init__Nstmtr   r   r   r   r   c                 C     | j | j||S r   )r%   submit_coror&   executer(   r+   r   r   r   r   r.   -      zClientSync.executestmtsList[InStatement]List[ResultSet]c                 C  s   | j | j|S r   )r%   r-   r&   batch)r(   r1   r   r   r   r4   0      zClientSync.batchTransactionSyncc                 C  s   | j | jj}t| j |S r   )r%   r   r&   transactionr6   )r(   r7   r   r   r   r7   3   s   zClientSync.transactionNonec                 C  s   | j | jj d S r   )r%   close_with_coror&   r!   r(   r   r   r   r!   7   r5   zClientSync.closeboolc                 C  s
   | j  S r   )r%   	is_closedr:   r   r   r   closed:   s   
zClientSync.closedc                 C     | S r   r   r:   r   r   r   	__enter__>      zClientSync.__enter__exc_typer   exc_valexc_tbc                 C     |    d S r   r!   r(   rA   rB   rC   r   r   r   __exit__A      zClientSync.__exit__)r"   r   r#   r   r   r+   r   r   r   r   r   )r1   r2   r   r3   r   r6   r   r8   r   r;   )r   r   rA   r   rB   r   rC   r   r   r8   )__name__
__module____qualname____annotations__r)   r.   r4   r7   r!   propertyr=   r?   rG   r   r   r   r   r   %   s   
 




c                   @  st   e Zd ZU ded< ded< d$ddZd%d&ddZd'ddZd'ddZd'ddZe	d(ddZ
d)ddZd*d"d#Zd	S )+r6   r   r%   r   _transactionr"   r7   c                 C  r'   r   )r%   rS   )r(   r"   r7   r   r   r   r)   I   r*   zTransactionSync.__init__Nr+   r   r   r   r   r   c                 C  r,   r   )r%   r-   rS   r.   r/   r   r   r   r.   M   r0   zTransactionSync.executer8   c                 C     | j | j S r   )r%   r-   rS   rollbackr:   r   r   r   rU   P      zTransactionSync.rollbackc                 C  rT   r   )r%   r-   rS   commitr:   r   r   r   rW   S   rV   zTransactionSync.commitc                 C  s   | j | jjdd  d S )Nc                   S  s   d S r   r   r   r   r   r   r   W       z'TransactionSync.close.<locals>.<lambda>)r%   submit_func_unless_closedrS   r!   r:   r   r   r   r!   V   s   zTransactionSync.closer;   c                   s    j  fdddd S )Nc                     s    j jS r   )rS   r=   r   r:   r   r   r   \   s    z(TransactionSync.closed.<locals>.<lambda>c                   S  s   dS )NTr   r   r   r   r   r   \   rX   )r%   rY   r:   r   r:   r   r=   Y   s   zTransactionSync.closedc                 C  r>   r   r   r:   r   r   r   r?   _   r@   zTransactionSync.__enter__rA   r   rB   rC   c                 C  rD   r   rE   rF   r   r   r   rG   b   rH   zTransactionSync.__exit__)r"   r   r7   r   r   rI   rK   rL   rJ   rM   )rN   rO   rP   rQ   r)   r.   rU   rW   r!   rR   r=   r?   rG   r   r   r   r   r6   E   s   
 




r6   c                   @  s   e Zd ZU ded< ded< dS )
_QueueItemzCoroutine[Any, Any, Any]	coroutinezconcurrent.futures.FuturefutureN)rN   rO   rP   rQ   r   r   r   r   rZ   f   s   
 rZ   c                   @  s   e Zd ZU ded< ded< ded< ded< d	ed
< ded< d1ddZd1ddZd1ddZd2ddZd3ddZd4ddZ	d5d"d#Z
d6d&d'Zd7d*d+Zd1d,d-Zd8d.d/Zd0S )9r   zthreading.Thread_threadasyncio.AbstractEventLoop_loopzthreading.Lock_lockr;   _closedzDeque[Optional[_QueueItem]]_queuezOptional[asyncio.Future[None]]_wakerr   r8   c                 C  sJ   t j| jdd| _t | _t  | _d| _	t
 | _d | _| j  d S )Nlibsql_client)targetnameF)	threadingThread_runr]   asyncionew_event_loopr_   Lockr`   ra   collectionsdequerb   rc   startr:   r   r   r   r)   u   s   


z_AsyncExecutor.__init__c                 C  sF   t | j | j|   t| j | j| j  | j  d S r   )rj   set_event_loopr_   run_until_complete_run_on_loop_cancel_all_tasksshutdown_asyncgensr!   r:   r   r   r   ri      s
   
z_AsyncExecutor._runc              
     s   	 |   I d H }|d u rn&z|j|jI d H  W n ty2 } z|j| W Y d }~nd }~ww q| j$ d| _| jD ]}|d urM|jt	dd q>| j
  W d    d S 1 s^w   Y  d S )NTClient is closedCLIENT_CLOSED)_dequeue_itemr\   
set_resultr[   r    set_exceptionr`   ra   rb   r   clear)r(   itemer   r   r   rr      s,   	
"z_AsyncExecutor._run_on_loopOptional[_QueueItem]c                   sz   	 | j * t| jdkr| j W  d    S | jd u s J | j }|| _W d    n1 s2w   Y  |I d H  q)NTr   )r`   lenrb   popleftrc   r_   create_future)r(   wakerr   r   r   rw      s   

z_AsyncExecutor._dequeue_itemr{   c                   sH   | j | | jd }| _|d ur"| d fdd}| j| d S d S )Nr   r8   c                     s     d  d S r   )rx   r   waker_r   r   resolve_waker   s   z=_AsyncExecutor._enqueue_item_with_lock.<locals>.resolve_wakerrK   )rb   appendrc   r_   call_soon_threadsafe)r(   r{   r   r   r   r   r   _enqueue_item_with_lock   s   z&_AsyncExecutor._enqueue_item_with_lockcoroCoroutine[Any, Any, T]r   c                 C  s^   | j   | jrtddtj }| t|| W d    | S 1 s&w   Y  | S )Nru   rv   )	r`   ra   r   
concurrentfuturesFuturer   rZ   result)r(   r   futr   r   r   r-      s   


z_AsyncExecutor.submit_corofuncCallable[[], T]c                   s   d fdd}|  | S )Nr   r   c                          S r   r   r   r   r   r   r         z(_AsyncExecutor.submit_func.<locals>.coror   r   )r-   )r(   r   r   r   r   r   r      s   z_AsyncExecutor.submit_funcon_open	on_closedc                   sx   d fdd}| j & | jr| W  d    S tj }| t| | W d    | S 1 s3w   Y  | S )Nr   r   c                     r   r   r   r   r   r   r   on_open_coro   r   z>_AsyncExecutor.submit_func_unless_closed.<locals>.on_open_coror   )r`   ra   r   r   r   r   rZ   r   )r(   r   r   r   r   r   r   r   rY      s   

z(_AsyncExecutor.submit_func_unless_closed	coro_func'Callable[[], Coroutine[Any, Any, None]]c                 C  sz   | j ' | jr	 W d    d S tj }| t| | | d  W d    n1 s-w   Y  | j  |	  d S r   )
r`   ra   r   r   r   r   rZ   r]   joinr   )r(   r   r   r   r   r   r9      s   

z_AsyncExecutor.close_with_coroc                 C  s   ddd}|  | d S )Nr   r8   c                     s   d S r   r   r   r   r   r   noop   s   z"_AsyncExecutor.close.<locals>.nooprK   )r9   )r(   r   r   r   r   r!      s   
z_AsyncExecutor.closec                 C  s0   | j  | jW  d    S 1 sw   Y  d S r   )r`   ra   r:   r   r   r   r<      s   $z_AsyncExecutor.is_closedNrK   )r   r}   )r{   r}   r   r8   )r   r   r   r   )r   r   r   r   )r   r   r   r   r   r   )r   r   r   r8   rL   )rN   rO   rP   rQ   r)   ri   rr   rw   r   r-   r   rY   r9   r!   r<   r   r   r   r   r   l   s$   
 










r   loopr^   r8   c                 C  st   t | }|s	d S |D ]}|  q| t j|ddi |D ]}| r&q| d ur7| d| |d qd S )Nreturn_exceptionsTz2unhandled exception during _AsyncExecutor shutdown)message	exceptiontask)rj   	all_taskscancelrq   gather	cancelledr   call_exception_handler)r   	to_cancelr   r   r   r   rs      s$   

rs   )r   r   r   r   r   r   )r   r^   r   r8   ) 
__future__r   rj   rm   r   dataclassesr   rg   typingr   r   r   r   r   r	   r
   r#   r   r   r   r   r   r   r   r   r   r$   r   r6   rZ   r   rs   r   r   r   r   <module>   s8    

 !v