o
    ðT·jp)  ã                   @   s8  d dl 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d dlmZ	 d dl
mZ d dlmZ W n eyC   d Z	 ZZY nw d dlmZ e  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ƒZeZeƒ Zeƒ Zeƒ ZG dd„ deƒZG dd„ deƒZG dd„ deƒZ G dd„ de ƒZ!dS )é    N)ÚQueue©ÚEvent)ÚLock)ÚThread)ÚGreenlet)ÚSqliteDatabasezpeewee.sqliteqc                   @   ó   e Zd ZdS )ÚResultTimeoutN©Ú__name__Ú
__module__Ú__qualname__© r   r   úT/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/playhouse/sqliteq.pyr
      ó    r
   c                   @   r	   )ÚWriterPausedNr   r   r   r   r   r      r   r   c                   @   r	   )ÚShutdownExceptionNr   r   r   r   r   r      r   r   c                   @   s|   e Zd ZdZdd„ Zddd„Zddd„Zd	d
„ Zdd„ ZeZ	e
dd„ ƒZe
dd„ ƒZe
dd„ ƒZdd„ Zdd„ Zdd„ ZdS )ÚAsyncCursor)	ÚsqlÚparamsÚtimeoutÚ_eventÚ_cursorÚ_excÚ_idxÚ_rowsÚ_readyc                 C   s:   || _ || _|| _|| _d  | _ | _ | _| _d| _d S ©NF)	r   r   r   r   r   r   r   r   r   )ÚselfÚeventr   r   r   r   r   r   Ú__init__#   s   
zAsyncCursor.__init__Nc                 C   s6   || _ || _d| _|d u r| ¡ ng | _| j ¡  | S )Nr   )r   r   r   Úfetchallr   r   Úset)r   ÚcursorÚexcr   r   r   Ú
set_result+   s   
zAsyncCursor.set_resultc                 C   sJ   |d ur|n| j }| jj|d�s|d urtdƒ‚| jd ur | j‚d| _d S )N)r   zresults not ready, timed out.T)r   r   Úwaitr
   r   r   )r   r   r   r   r   Ú_wait3   s   

zAsyncCursor._waitc                 C   s"   | j s|  ¡  | jd ur| j‚| S ©N)r   r(   r   ©r   r   r   r   Ú__iter__;   s
   
zAsyncCursor.__iter__c                 C   sD   | j s|  ¡  z| j| j }W n	 ty   t‚w |  jd7  _|S )Né   )r   r(   r   r   Ú
IndexErrorÚStopIteration)r   Úobjr   r   r   ÚnextB   s   ÿzAsyncCursor.nextc                 C   ó   | j s|  ¡  | jjS r)   )r   r(   r   Ú	lastrowidr*   r   r   r   r2   N   ó   zAsyncCursor.lastrowidc                 C   r1   r)   )r   r(   r   Úrowcountr*   r   r   r   r4   T   r3   zAsyncCursor.rowcountc                 C   r1   r)   )r   r(   r   Údescriptionr*   r   r   r   r5   Z   r3   zAsyncCursor.descriptionc                 C   s"   | j d ur| j  ¡  d | _ d S d S r)   )r   Úcloser*   r   r   r   r6   `   s   


þzAsyncCursor.closec                 C   s   t | ƒS r)   )Úlistr*   r   r   r   r"   e   s   zAsyncCursor.fetchallc                 C   s.   | j s|  ¡  zt| ƒW S  ty   Y d S w r)   )r   r(   r0   r.   r*   r   r   r   Úfetchoneh   s   
ÿzAsyncCursor.fetchoner)   )r   r   r   Ú	__slots__r!   r&   r(   r+   r0   Ú__next__Úpropertyr2   r4   r5   r6   r"   r8   r   r   r   r   r      s"    





r   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚWriter©ÚdatabaseÚqueuec                 C   s   || _ || _d S r)   r=   )r   r>   r?   r   r   r   r!   y   s   
zWriter.__init__c              	   C   s¤   | j  ¡ }z:	 z|d u r|  ¡ r| j  ¡ }n|  |¡}W n" ty>   t d¡ Y W |d ur<| j  |¡ | j j 	¡  d S d S w q|d urQ| j  |¡ | j j 	¡  w w )NTz*writer received shutdown request, exiting.)
r>   Ú
connectionÚwait_unpauseÚloopr   ÚloggerÚinfoÚ_closeÚ_stateÚreset)r   Úconnr   r   r   Úrun}   s.   

€
€
þüùþz
Writer.runc                 C   sv   | j  ¡ \}}|tu rt d¡ | ¡  dS |tu rtƒ ‚|tu r,t 	d¡ | ¡  d S | 
d tƒ ¡ t d|¡ d S )Nz+writer unpaused - reconnecting to database.Tz-writer received pause, but is already paused.zwriter paused, not handling %s)r?   ÚgetÚUNPAUSErC   rD   r#   ÚSHUTDOWNr   ÚPAUSEÚerrorr&   r   Úwarning)r   Úopr/   r   r   r   rA   �   s   

zWriter.wait_unpausec                 C   s–   | j  ¡ \}}|tu r|  |¡ |S |tu r-t d¡ | j |¡ | jj	 
¡  | ¡  d S |tu r<t d¡ | ¡  |S |tu rCtƒ ‚t d|¡ |S )Nz,writer paused - closing database connection.z0writer received unpause, but is already running.z&writer received unsupported object: %s)r?   rJ   ÚQUERYÚexecuterM   rC   rD   r>   rE   rF   rG   r#   rK   rN   rL   r   )r   rH   rP   r/   r   r   r   rB   ž   s$   
ó

üzWriter.loopc              
   C   sb   t  d|j¡ z| j |j|j¡}W n ty( } z
d }|}W Y d }~nd }~ww d }| ||¡S )Nzreceived query %s)rC   Údebugr   r>   Ú_executer   Ú	Exceptionr&   )r   r/   r$   Úexecute_errr%   r   r   r   rR   ±   s   €þzWriter.executeN)	r   r   r   r9   r!   rI   rA   rB   rR   r   r   r   r   r<   v   s    r<   c                       sŽ   e Zd ZdZ		d‡ fdd„	Zd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d„ Zdd„ Ze Z ZZ‡  ZS ) ÚSqliteQueueDatabasez·SQLite must be configured to use the WAL journal mode when using this feature. WAL mode allows one or more readers to continue reading while another connection writes to the database.FTNc           
         s�   d|d< t ƒ | _|  | dd ¡¡}tt| ƒ}	|	j| _|	j|g|¢R d|i|¤Ž || _	|| _
d| _|  |¡|ƒ| _|  ¡  | j	rF|  ¡  d S d S )NFÚcheck_same_threadÚpragmasT)r   Ú_qlockÚ_validate_journal_modeÚpopÚsuperrW   Úexecute_sqlrT   r!   Ú
_autostartÚ_results_timeoutÚ_is_stoppedÚget_thread_implÚ_thread_helperÚ_create_write_queueÚstart)
r   r>   Ú
use_geventÚ	autostartÚqueue_max_sizeÚresults_timeoutÚargsÚkwargsrY   ÚParent©Ú	__class__r   r   r!   Ä   s   
ÿzSqliteQueueDatabase.__init__c                 C   s   |rt S tS r)   )ÚGreenletHelperÚThreadHelper)r   rf   r   r   r   rb   ä   s   z#SqliteQueueDatabase.get_thread_implc                 C   sR   |sddiS t |tƒstdd„ |D ƒƒ}| dd¡ ¡ dkr#t| jƒ‚d|d< |S )NÚjournal_modeÚwalc                 s   s    � | ]\}}|  ¡ |fV  qd S r)   )Úlower)Ú.0ÚkÚvr   r   r   Ú	<genexpr>ì   s   € z=SqliteQueueDatabase._validate_journal_mode.<locals>.<genexpr>)Ú
isinstanceÚdictrJ   rs   Ú
ValueErrorÚWAL_MODE_ERROR_MESSAGE)r   rY   r   r   r   r[   ç   s   

z*SqliteQueueDatabase._validate_journal_modec                 C   s   | j  ¡ | _d S r)   )rc   r?   Ú_write_queuer*   r   r   r   rd   ó   ó   z'SqliteQueueDatabase._create_write_queuec                 C   s
   | j  ¡ S r)   )r|   Úqsizer*   r   r   r   Ú
queue_sizeö   ó   
zSqliteQueueDatabase.queue_sizec                 C   sR   |  ¡  d¡r|  ||¡S t| j ¡ |||d u r| jn|d�}| j t	|f¡ |S )NÚselect)r    r   r   r   )
rs   Ú
startswithrT   r   rc   r    r`   r|   ÚputrQ   )r   r   r   r   r$   r   r   r   r^   ù   s   üzSqliteQueueDatabase.execute_sqlc                    sp   ˆ j �+ ˆ js	 W d   ƒ dS ‡ fdd„}ˆ j |¡ˆ _ˆ j ¡  dˆ _	 W d   ƒ dS 1 s1w   Y  d S )NFc                     s   t ˆ ˆ jƒ} |  ¡  d S r)   )r<   r|   rI   )Úwriterr*   r   r   rI   	  s   z&SqliteQueueDatabase.start.<locals>.runT)rZ   ra   rc   ÚthreadÚ_writerre   )r   rI   r   r*   r   re     s   þ
$özSqliteQueueDatabase.startc                 C   sÂ   t  d¡ | j�" | jr	 W d   ƒ dS | j td f¡ | j}d| _W d   ƒ n1 s-w   Y  | ¡  | j 	¡ s_| j 
¡ \}}|tu sJ|tu rO| ¡  n|tu rZ| d tƒ ¡ | j 	¡ r;dS )Nzenvironment stop requested.FT)rC   rS   rZ   ra   r|   rƒ   rL   r†   ÚjoinÚemptyrJ   rM   rK   r#   rQ   r&   r   )r   r„   rP   r/   r   r   r   Ústop  s$   
þú


ûzSqliteQueueDatabase.stopc                 C   s0   | j � | jW  d   ƒ S 1 sw   Y  d S r)   )rZ   ra   r*   r   r   r   Ú
is_stopped(  s   $ÿzSqliteQueueDatabase.is_stoppedc                 C   ód   | j �! | jr	 W d   ƒ dS | j ¡ }| j t|f¡ W d   ƒ n1 s'w   Y  | ¡  d S r   )rZ   ra   rc   r    r|   rƒ   rM   r'   ©r   Úevtr   r   r   Úpause,  ó   þ
ûzSqliteQueueDatabase.pausec                 C   r‹   r   )rZ   ra   rc   r    r|   rƒ   rK   r'   rŒ   r   r   r   Úunpause6  r�   zSqliteQueueDatabase.unpausec                 O   s   t dt| ƒ ƒ‚)Nz#This method is not supported by %r.)rz   Útype)r   rj   rk   r   r   r   Ú__unsupported__@  r}   z#SqliteQueueDatabase.__unsupported__)FTNNr)   )NN)r   r   r   r{   r!   rb   r[   rd   r   r^   re   r‰   rŠ   rŽ   r�   r’   ÚatomicÚtransactionÚ	savepointÚ__classcell__r   r   rm   r   rW   ½   s"    ÿ 



rW   c                   @   s4   e Zd ZdZddd„Zdd„ Zddd„Zd	d
„ ZdS )rp   ©rh   Nc                 C   s
   || _ d S r)   r—   )r   rh   r   r   r   r!   H  r€   zThreadHelper.__init__c                 C   ó   t ƒ S r)   r   r*   r   r   r   r    K  ó    zThreadHelper.eventc                 C   ó    |d ur|n| j }t|pdd�S ©Nr   )Úmaxsize)rh   r   ©r   Úmax_sizer   r   r   r?   M  ó   zThreadHelper.queuec                 O   s   t |||d�}d|_|S )N)Útargetrj   rk   T)r   Údaemon)r   Úfnrj   rk   r…   r   r   r   r…   Q  s   zThreadHelper.threadr)   )r   r   r   r9   r!   r    r?   r…   r   r   r   r   rp   E  s    

rp   c                   @   s*   e Zd ZdZdd„ Zd	dd„Zdd„ ZdS )
ro   r   c                 C   r˜   r)   )ÚGEventr*   r   r   r   r    Z  r™   zGreenletHelper.eventNc                 C   rš   r›   )rh   ÚGQueuer�   r   r   r   r?   \  rŸ   zGreenletHelper.queuec                    s"   ‡ fdd„}t |g|¢R i |¤ŽS )Nc                     s   t  ¡  ˆ | i |¤ŽS r)   )ÚgeventÚsleep)Úaru   ©r¢   r   r   Úwrapa  s   z#GreenletHelper.thread.<locals>.wrap)ÚGThread)r   r¢   rj   rk   r©   r   r¨   r   r…   `  s   zGreenletHelper.threadr)   )r   r   r   r9   r    r?   r…   r   r   r   r   ro   W  s
    
ro   )"Úloggingr?   r   Ú	threadingr   r   r   r¥   r   rª   Úgevent.eventr£   Úgevent.queuer¤   ÚImportErrorÚpeeweer   Ú	getLoggerrC   rU   r
   r   r   Úobjectr   r.   rL   rQ   rM   rK   r<   rW   rp   ro   r   r   r   r   Ú<module>   s8    ÿ
QG 	