o
    i<                     @  s  d dl m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 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eZeeeZeeeZedZedZG dd deZdddZ G dd de	j!Z"dS )    )annotationsN)Any)	Awaitable)Callable)
NamedTuple)Optional)overload)TypeVar)	ParamSpec   )log_obj)
log_prefixPTc                   @  s   e Zd ZU ded< ded< dS )LoopControlzasyncio.AbstractEventLooploopzasyncio.Event
stop_eventN)__name__
__module____qualname____annotations__ r   r   X/home/ubuntu/.local/lib/python3.10/site-packages/libsql_client/dbapi2/_async_executor.pyr      s   
 r   r   strqqueue.Queue[LoopControl]returnNonec                   sL   d d ddfd
d d fdd} d t |   d d S )Nexc_infomsgr   argsobjectr   Optional[BaseException]r   r   c                  s@   rdnd}  | d}t |tj| g|R d|i d S )N  z: r   )_log_prefixloggingDEBUG)r    r   r!   loop_strprefix)r   r   r   r   dbg(   s    z_thread_main.<locals>.dbgc               
     s   t  } t  z=z d t|  |  I d H   d W n ty< } z d||d W Y d }~n
d }~ww W d d S W d d S d w )Nzstarted main()zfinished main()zfailed main(): %sr   )asyncioEventget_running_loop
put_nowaitr   wait	Exception)r   e)r+   r   r   r   r   main2   s    z_thread_main.<locals>.mainzstarted threadzfinished thread)r    r   r!   r"   r   r#   r   r   r   r   )r,   run)r   r   r3   r   )r+   r   r   r   r   _thread_main%   s   
r6   c                      s  e Zd ZU ded< ded< dZd* fdd	Zd*d
dZd+ddZe	e
ZeeejZeeejZeeejZd*ddZejdd dkr^ed,ddZed-ddZed.d dZned/d#dZed0d$dZed1d%dZd2d'dZd2d(d)Z  ZS )3AsyncExecutorzthreading.Lock_lockzOptional[LoopControl]_control)r9   r8   r   r   c                   sv   d | _ td}d| jj dt| dd}t jdt||fd | 	d | 
  t | _| | _ | 	d	 d S )
Nr   < at x>T)daemontargetr!   createdzthread ready)r9   queueQueue	__class__r   idsuper__init__r6   _infstart	threadingLockr8   get)selfr   r   rC   r   r   rF   J   s   



zAsyncExecutor.__init__c                 C  s    |  d | jd u sJ dd S )N	destroyedzThread is still running)rG   r9   )rL   r   r   r   __del__U   s   
zAsyncExecutor.__del__r   c              	   C  s\   t t| }|  rdnd}| jd ur|d| jj 7 }d| jj d| d| jd| d	S )	Nstartedstoppedz loop=r:   r;   z name=r$   r=   )hexrD   is_aliver9   r   rC   r   name)rL   addrsr   r   r   __repr__[   s
   
$zAsyncExecutor.__repr__c                   s     d  j  jd u rtd j\}d  _W d    n1 s$w   Y  d	 fdd}  d | }t||}|      d d S )
Nzshuting down thread...zthread already downr   r   c                     s     d   d S )Nznotifying _stop_event)_dbgsetr   rL   r   r   r   run_in_main_loopp   s   
z0AsyncExecutor.shutdown.<locals>.run_in_main_loopzthread will stopzthread did stopr4   )	rX   r8   r9   RuntimeErrorr,   run_coroutine_threadsaferesultjoinrG   )rL   r   r[   corofuturer   rZ   r   shutdowng   s   



zAsyncExecutor.shutdownN   )   	   fn)Callable[P, Awaitable[asyncio.Future[T]]]r!   P.argskwargsP.kwargsconcurrent.futures.Future[T]c                 O     d S Nr   rL   rf   r!   ri   r   r   r   submit}      zAsyncExecutor.submitCallable[P, Awaitable[T]]c                 O  rl   rm   r   rn   r   r   r   ro      rp   Callable[P, T]c                 O  rl   rm   r   rn   r   r   r   ro      rp   &Callable[P, Awaitable[asyncio.Future]]concurrent.futures.Futurec                 O  rl   rm   r   rn   r   r   r   ro      rp   c                 O  rl   rm   r   rn   r   r   r   ro      rp   c                 O  rl   rm   r   rn   r   r   r   ro      rp   r   c                 O  sB   | j  | j|g|R i |W  d    S 1 sw   Y  d S rm   )r8   _unlocked_submitrn   r   r   r   ro      s   $c                   s<   j d u r	tdd fdd}| }t|j jS )Nzalready downr   r   c                    s   z4 d   i } t| st| r*| I d H } t| st| s d |  | W S  tyM } zj d ||d  d }~ww )Nzcalling: %s, args=%s, kwargs=%sz+finished: %s, args=%s, kwargs=%s, result=%sz&failed: %s, args=%s, kwargs=%s, exc=%sr   )rX   r,   iscoroutineisfuturer1   )rr2   r!   rf   ri   rL   r   r   r[      s6   
z8AsyncExecutor._unlocked_submit.<locals>.run_in_main_loop)r   r   )r9   r\   r,   r]   r   )rL   rf   r!   ri   r[   r`   r   ry   r   ru      s
   
zAsyncExecutor._unlocked_submitr4   )r   r   )rf   rg   r!   rh   ri   rj   r   rk   )rf   rq   r!   rh   ri   rj   r   rk   )rf   rr   r!   rh   ri   rj   r   rk   )rf   rs   r!   rh   ri   rj   r   rt   )rf   rq   r!   rh   ri   rj   r   rt   )rf   rr   r!   rh   ri   rj   r   rt   )rf   rr   r!   rh   ri   rj   r   r   )r   r   r   r   	__slots__rF   rO   rW   	functoolspartial_log_obj_logpartialmethodr'   r(   rX   INFOrG   ERROR_errrb   sysversion_infor   ro   ru   __classcell__r   r   rM   r   r7   E   s6   
 





	r7   )r   r   r   r   r   r   )#
__future__r   r,   concurrent.futures
concurrentr{   r'   rA   r   rI   typingr   r   r   r   r   r   r	   typing_extensionsr
   _utilsr   r   	getLoggerr   _loggerr|   r}   r&   r   r   r   r6   Threadr7   r   r   r   r   <module>   s4    

 