o
    -˜ŽjQ  ã                   @   sn   d 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Zddl	m
Z
 dZdZi Zddd	„ZG d
d„ deƒZdS )z;
Simple perf tests for aiosqlite and the asyncio run loop.
é    N)ÚIsolatedAsyncioTestCaseé   )Úsetup_loggerz:memory:g       @c                    s   ˆpˆ j ‰‡ ‡fdd„}|S )ab  
    Decorator for perf testing a block of async code.

    Expects the wrapped function to return an async generator.
    The generator should do setup, then yield when ready to start perf testing.
    The decorator will then pump the generator repeatedly until the target
    time has been reached, then close the generator and print perf results.
    c               
   Ÿ   sÖ   �ˆ | i |¤Ž}|  d ¡I d H  d}t ¡ }	 |d7 }t ¡ | tk }z|r/|  |¡I d H  n	| ¡ I d H  W n%W n" tyB   Y n ty[ } ztd|› �ƒ W Y d }~d S d }~ww qt ¡ | }||ftˆ< d S )Nr   Tr   zexception occurred: )ÚasendÚtimeÚTARGETÚacloseÚStopAsyncIterationÚ	ExceptionÚprintÚRESULTS)ÚargsÚkwargsÚgenÚcountÚbeforeÚvalueÚeÚduration©ÚfnÚname© úQ/var/www/kodo/Anonymous/send/lib/python3.10/site-packages/aiosqlite/tests/perf.pyÚwrapper"   s0   €ý€þóztimed.<locals>.wrapper)Ú__name__)r   r   r   r   r   r   Útimed   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„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZdd„ ZdS )ÚPerfTestc                 C   s   t dtd›d�ƒ tƒ  d S )Nz Running perf tests for at least z.1fz	s each...)r   r   r   )Úclsr   r   r   Ú
setUpClassB   s   
zPerfTest.setUpClassc              
   C   sr   t ddd›ddd›�ƒ ttƒD ]&}t| \}}|| }| dd¡}t |d›d	|d
›d|d›d|d›d�ƒ qd S )NÚ
z	Perf Testz<25z Iterations  Duration  ÚRatez>11Útest_Ú ú z>10z  z>7.1fzs  z>9.1fz/s)r   Úsortedr   Úreplace)r   r   r   r   Úrater   r   r   ÚtearDownClassG   s   *üzPerfTest.tearDownClassc              	   C  sJ   �	 d V  t  t¡4 I d H š W d   ƒI d H  n1 I d H sw   Y  q©N)Ú	aiosqliteÚconnectÚTEST_DB)Úselfr   r   r   Útest_connection_memoryP   s   €(ÿþzPerfTest.test_connection_memoryc              
   C  sæ   �t jdd��b}|j}| ¡  t |¡4 I d H š"}| d¡I d H  | d¡I d H  | ¡ I d H  W d   ƒI d H  n1 I d H s@w   Y  	 d V  t |¡4 I d H š W d   ƒI d H  n1 I d H scw   Y  qF1 slw   Y  d S )NF)Údeleteú8create table perf (i integer primary key asc, k integer)ú$insert into perf (k) values (2), (3))ÚtempfileÚNamedTemporaryFiler   Úcloser*   r+   ÚexecuteÚcommit)r-   ÚtfÚpathÚdbr   r   r   Útest_connection_fileW   s$   €
ÿ(û(ÿþõzPerfTest.test_connection_filec              
   C  s´   �t  t¡4 I d H šC}| d¡I d H  | d¡I d H  | ¡ I d H  	 d V  | d¡4 I d H š}| ¡ I d H  W d   ƒI d H  n1 I d H sGw   Y  q#1 I d H sSw   Y  d S )Nr0   r1   Túselect last_insert_rowid()©r*   r+   r,   r5   r6   Úfetchone©r-   r9   Úcursorr   r   r   Útest_atomicsi   s   €(ÿþûzPerfTest.test_atomicsc              	   C  sv   �t  t¡4 I d H š$}| d¡I d H  | ¡ I d H  	 d V  | d¡I d H  | ¡ I d H  q1 I d H s4w   Y  d S )Nr0   Tú)insert into perf (k) values (1), (2), (3))r*   r+   r,   r5   r6   ©r-   r9   r   r   r   Útest_insertsu   ó   €ýüzPerfTest.test_insertsc              	   C  sŽ   �dd„ }t  t¡4 I d H š,}| d¡I d H  | |¡I d H  | ¡ I d H  	 d V  | d¡I d H  | ¡ I d H  q'1 I d H s@w   Y  d S )Nc                 S   s   | t jkrt jS t jS r)   )Úsqlite3ÚSQLITE_DROP_TABLEÚSQLITE_DENYÚ	SQLITE_OK)Úaction_codeÚarg1Úarg2Údb_nameÚtrigger_namer   r   r   Ú
deny_drops‚   s   
z4PerfTest.test_inserts_authorized.<locals>.deny_dropsr0   TrA   )r*   r+   r,   r5   Úset_authorizerr6   )r-   rN   r9   r   r   r   Útest_inserts_authorized€   s   €ýûz PerfTest.test_inserts_authorizedc              	   C  s”   �t  t¡4 I d H š3}| d¡I d H  | ¡ I d H  	 d V  | d¡I d H }| d¡I d H  | ¡ I d H  | ¡ I d H  q1 I d H sCw   Y  d S )Nr0   Túinsert into perf (k) values (1)r;   r<   r>   r   r   r   Útest_insert_ids‘   s   €ûüzPerfTest.test_insert_idsc              	   C  sv   �t  t¡4 I d H š$}| d¡I d H  | ¡ I d H  	 d V  | d¡I d H  | ¡ I d H  q1 I d H s4w   Y  d S )Nr0   TrQ   )r*   r+   r,   r5   r6   Úexecute_insertrB   r   r   r   Útest_insert_macro_idsž   rD   zPerfTest.test_insert_macro_idsc              	   C  s¦   �t  t¡4 I d H š<}| d¡I d H  tdƒD ]}| d|f ¡I d H  q| ¡ I d H  	 d V  | d¡I d H }t| ¡ I d H ƒdksEJ ‚q-1 I d H sLw   Y  d S ©Nr0   éd   z insert into perf (k) values (%d)Tzselect i, k from perf)r*   r+   r,   r5   Úranger6   ÚlenÚfetchall)r-   r9   Úir?   r   r   r   Útest_select©   s   €ýúzPerfTest.test_selectc              	   C  s˜   �t  t¡4 I d H š5}| d¡I d H  tdƒD ]}| d|f ¡I d H  q| ¡ I d H  	 d V  t| d¡I d H ƒdks>J ‚q-1 I d H sEw   Y  d S rU   )r*   r+   r,   r5   rW   r6   rX   Úexecute_fetchall)r-   r9   rZ   r   r   r   Útest_select_macro¶   s   €þúzPerfTest.test_select_macroc                 ƒ   sê   �t  t¡4 I d H š^‰ ˆ  d¡I d H  tdƒD ]"}|d }ˆ  dg dd„ t||d ƒD ƒ¢¡I d H  ˆ  ¡ I d H  qdtf‡ fdd	„}d
d„ tddƒD ƒD ]}t|d|› �ƒ|ƒI d H  qMW d   ƒI d H  d S 1 I d H snw   Y  d S )Nz]create table ic_perf (i integer primary key asc, k integer, a integer, b integer, c char(16))é€   i   z3insert into ic_perf (k, a, b, c) values(?, 1, 2, ?)c                 S   s   g | ]}|t jf‘qS r   )ÚstringÚascii_lowercase©Ú.0rZ   r   r   r   Ú
<listcomp>Í   s    ÿÿz6PerfTest.test_iterable_cursor_perf.<locals>.<listcomp>Ú
chunk_sizec              	     sd   �	 ˆ   d¡4 I d H š}| |_|2 z	3 d H W }d V  q6 W d   ƒI d H  n1 I d H s,w   Y  q)NTzSELECT * FROM ic_perf)r5   Úiter_chunk_size)rd   r?   Ú_©r9   r   r   Ú	test_perfÕ   s   €ÿ(þÿz5PerfTest.test_iterable_cursor_perf.<locals>.test_perfc                 S   s   g | ]}d | ‘qS )é   r   ra   r   r   r   rc   Ü   s    é   é   ziterable_cursor @ )	r*   r+   r,   r5   rW   Úexecutemanyr6   Úintr   )r-   ÚbatchÚr_startrh   rd   r   rg   r   Útest_iterable_cursor_perfÂ   s*   €
ÿþÿ
þ	ÿ.çz"PerfTest.test_iterable_cursor_perfN)r   Ú
__module__Ú__qualname__Úclassmethodr   r(   r   r.   r:   r@   rC   rP   rR   rT   r[   r]   rp   r   r   r   r   r   A   s0    












r   r)   )Ú__doc__rE   r_   r2   r   Úunittestr   ÚTestCaser*   Úsmoker   r,   r   r   r   r   r   r   r   r   Ú<module>   s   
+