o
    ðT·jõ)  ã                
   @   s(  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mZmZmZmZmZmZmZmZmZmZmZmZ d dlmZ zd dlZW n eyn Z zedƒ‚dZ[ww e  d¡Z ddd„Z!ddd„Z"G dd„ deƒZ#G dd„ dee#ƒZ$de_%dS )é    N)ÚPath)ÚDecimalField)ÚImproperlyConfigured)ÚInterfaceError)ÚOP)ÚSqliteDatabase)Ú__exception_wrapper__)Ú_PooledSqliteDatabase)Ú
RowIDFieldÚ
DocIDFieldÚAutoIncrementFieldÚISODateTimeFieldÚJSONPathÚ	JSONBPathÚ	JSONFieldÚ
JSONBFieldÚSearchFieldÚTDecimalFieldÚVirtualModelÚFTSModelÚ	FTS5Model)Úrankzcysqlite is not installedÚpeeweeFc                    s   ‡ ‡fdd„}t |ƒS )Nc                    s   t  ˆ ¡}ˆr|d S |S )Né   )ÚcysqliteÚstatus©ÚselfÚresult©ÚflagÚreturn_highwater© úY/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/playhouse/cysqlite_ext.pyÚgetter%   s   
z__status__.<locals>.getter©Úproperty)r    r!   r$   r"   r   r#   Ú
__status__$   s   r'   c                    s   ‡ ‡‡fdd„}t |ƒS )zÄ
    Expose a sqlite3_dbstatus() call for a particular flag as a property of
    the Database instance. Unlike sqlite3_status(), the dbstatus properties
    pertain to the current connection.
    c                    s>   | j jd u r
tdƒ‚| j j ˆ ¡}ˆr|d S ˆr|d S |S )Nzdatabase connection not opened.r   r   )Ú_stateÚconnr   r   r   ©r    Úreturn_currentr!   r"   r#   r$   0   s   z__dbstatus__.<locals>.getterr%   )r    r!   r+   r$   r"   r*   r#   Ú__dbstatus__*   s   r,   c                       sþ  e Zd ZejZd;‡ fdd„	Zdd„ 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d„Zdd„ Zd<dd„Zdd„ Zdd„ Zdd „ Zd!d"„ Zd=d$d%„Zd&dejdfd'd(„Zd>d*d+„Zd?d,d-„Zd.d/„ Zd0d1„ Zed2d3„ ƒZd@d5d6„Z 		dAd7d8„Z!		dAd9d:„Z"e#ej$ƒZ%e#ej&dƒZ'e#ej(ƒZ)e#ej*ƒZ+e#ej,ƒZ-e#ej.dƒZ/e#ej0ƒZ1e#ej2ƒZ3e#ej4dƒZ5e6ej7ƒZ8e6ej9dƒZ:e6ej;dƒZ<e6ej=dƒZ>e6ej?d4dƒZ@e6ejAd4dƒZBe6ejCd4dƒZDe6ejEd4dƒZFe6ejGd4dƒZHe6ejId4dƒZJ‡  ZKS )BÚCySqliteDatabaseTc                    s|   t t| ƒj|g|¢R i |¤Ž g | _d | _d | _d | _d | _d | _d | _	|r<|  
tjd¡ |  
tjd¡ |  
td¡ d S d S )NÚfts_bm25Ú
fts_luceneÚfts_rank)Úsuperr-   Ú__init__Ú_table_functionsÚ_commit_hookÚ_rollback_hookÚ_update_hookÚ_authorizerÚ_traceÚ	_progressÚregister_functionr   Ú	rank_bm25Úrank_lucener   )r   ÚdatabaseÚrank_functionsÚargsÚkwargs©Ú	__class__r"   r#   r2   >   s   ýzCySqliteDatabase.__init__c                 C   sX   t d u rtdƒ‚t j| jf| jddœ| j¤Ž}z|  |¡ W |S  ty+   | ¡  ‚ w )Nzcysqlite is not installed.T)ÚtimeoutÚ
extensions)	r   r   Ú
Connectionr=   Ú_timeoutÚconnect_paramsÚ_add_conn_hooksÚ	ExceptionÚclose)r   r)   r"   r"   r#   Ú_connectN   s   ÿÿýþzCySqliteDatabase._connectc                    s¸   | j d ur| | j ¡ | jd ur| | j¡ | jd ur!| | j¡ | jd ur,| | j¡ | jd ur7|j	| jŽ  | j
d urB|j| j
Ž  tt| ƒ |¡ | jrX| jD ]	}| |¡ qPd S d S ©N)r4   Úcommit_hookr5   Úrollback_hookr6   Úupdate_hookr7   Ú
authorizerr8   Útracer9   Úprogressr1   r-   rH   r3   Úregister)r   r)   Útable_functionrA   r"   r#   rH   Z   s$   






þz CySqliteDatabase._add_conn_hooksc                 C   s    | j D ]
\}}| ||¡ qd S rL   )Ú_pragmasÚpragma)r   r)   rV   Úvaluer"   r"   r#   Ú_set_pragmasl   s   ÿzCySqliteDatabase._set_pragmasc                 C   ó$   | j  ¡ D ]
\}}| ||¡ qd S rL   )Ú	_attachedÚitemsÚattach)r   r)   ÚnameÚdbr"   r"   r#   Ú_attach_databasesp   ó   ÿz"CySqliteDatabase._attach_databasesc                 C   ó*   | j  ¡ D ]\}\}}| |||¡ qd S rL   )Ú_aggregatesr[   Úcreate_aggregate©r   r)   r]   ÚklassÚ
num_paramsr"   r"   r#   Ú_load_aggregatest   ó   ÿz!CySqliteDatabase._load_aggregatesc                 C   rY   rL   )Ú_collationsr[   Úcreate_collation)r   r)   r]   Úfnr"   r"   r#   Ú_load_collationsx   r`   z!CySqliteDatabase._load_collationsc                 C   s.   | j  ¡ D ]\}\}}}| ||||¡ qd S rL   )Ú
_functionsr[   Úcreate_function)r   r)   r]   rk   rf   Údeterministicr"   r"   r#   Ú_load_functions|   s   ÿz CySqliteDatabase._load_functionsc                 C   ra   rL   )Ú_window_functionsr[   Úcreate_window_functionrd   r"   r"   r#   Ú_load_window_functions€   rh   z'CySqliteDatabase._load_window_functionsNc                 C   sb   t |tƒrt|tjƒstj ||||¡}n|d ur||_| j |¡ |  	¡ s/| 
|  ¡ ¡ d S d S rL   )Ú
isinstanceÚtypeÚ
issubclassr   ÚTableFunctionÚfrom_functionr]   r3   ÚappendÚ	is_closedrS   Ú
connection)r   re   r]   ÚcolumnsÚparamsr"   r"   r#   Úregister_table_function„   s   

ÿÿÿz(CySqliteDatabase.register_table_functionc                 C   s6   t | jƒD ]\}}|j|kr nqdS | j |¡ dS )NFT)Ú	enumerater3   r]   Úpop)r   r]   Úidxre   r"   r"   r#   Úunregister_table_function�   s   
ÿz*CySqliteDatabase.unregister_table_functionc                    s   ‡ ‡‡‡fdd„}|S )Nc                    s   ˆ  | ˆˆ ˆ¡ | S rL   )r~   )Úobj©r|   r]   r}   r   r"   r#   Ú	decoratorš   s   z2CySqliteDatabase.table_function.<locals>.decoratorr"   )r   r]   r|   r}   r…   r"   r„   r#   rT   ™   s   zCySqliteDatabase.table_functionc                 C   ó    || _ |  ¡ s|  ¡  |¡ |S rL   )r4   rz   r{   rM   ©r   rk   r"   r"   r#   Ú	on_commitŸ   ó   zCySqliteDatabase.on_commitc                 C   r†   rL   )r5   rz   r{   rN   r‡   r"   r"   r#   Úon_rollback¥   r‰   zCySqliteDatabase.on_rollbackc                 C   r†   rL   )r6   rz   r{   rO   r‡   r"   r"   r#   Ú	on_update«   r‰   zCySqliteDatabase.on_updatec                 C   r†   rL   )r7   rz   r{   rP   r‡   r"   r"   r#   rP   ±   r‰   zCySqliteDatabase.authorizeré   c                 C   sH   |d u rd | _ n|||f| _ |  ¡ s"|d u rdn| j }|  ¡ j|Ž  |S ©NrL   )r8   rz   r{   rQ   )r   rk   ÚmaskÚ
expand_sqlr?   r"   r"   r#   rQ   ·   s   zCySqliteDatabase.traceé2   c                    s4   t  |pd¡‰‡ ‡‡fdd„}| j|tj|d� |S )Nzpeewee.cysqlite_extc                    s0   |sd S |d }|ˆkrˆ  ˆ d||¡ d S d S )Ni@B zSlow query %0.1fms: %s)Úlog)ÚeventÚsidÚsqlÚnsÚms©Úlevelr‘   Úthreshold_msr"   r#   r8   Ä   s   ÿz/CySqliteDatabase.slow_query_log.<locals>._trace)r�   )ÚloggingÚ	getLoggerrQ   r   ÚSQLITE_TRACE_PROFILE)r   r™   Úloggerr˜   r�   r8   r"   r—   r#   Úslow_query_logÁ   s   zCySqliteDatabase.slow_query_logr   c                 C   sF   |d u rd | _ n||f| _ |  ¡ s!|d u rdn| j }|  ¡ j|Ž  |S r�   )r9   rz   r{   rR   )r   rk   Únr?   r"   r"   r#   rR   Î   s   
zCySqliteDatabase.progressc                 C   sX   |   ¡ r| jstdƒ‚t� |  ¡  |p| jpd¡ W d   ƒ d S 1 s%w   Y  d S )Nz&Error, database connection not opened.Údeferred)rz   Úautoconnectr   r   r{   ÚbeginÚ
_lock_type)r   Ú	lock_typer"   r"   r#   r¢   Ø   s
   "ÿzCySqliteDatabase.beginc                 C   óF   |   ¡ rtdƒ‚t� |  ¡  ¡  W d   ƒ d S 1 sw   Y  d S )Nz,Cannot commit, database connection not open.)rz   r   r   r{   Úcommit©r   r"   r"   r#   r¦   ß   ó
   "ÿzCySqliteDatabase.commitc                 C   r¥   )Nz.Cannot rollback, database connection not open.)rz   r   r   r{   Úrollbackr§   r"   r"   r#   r©   æ   r¨   zCySqliteDatabase.rollbackc                 C   s   |   ¡  ¡ S rL   )r{   Ú
autocommitr§   r"   r"   r#   rª   í   s   zCySqliteDatabase.autocommitFc                 C   ó   |   ¡  |||||¡S rL   )r{   Ú	blob_open)r   ÚtableÚcolumnÚrowidÚ	read_onlyÚdbnamer"   r"   r#   r¬   ñ   s   ÿzCySqliteDatabase.blob_openc                 C   s`   t |tƒr
| ¡ }nt |tjƒr|}nt |ttfƒr%|  t|ƒ||||¡S |  ¡  |||||¡S rL   )	rt   r-   r{   r   rE   Ústrr   Úbackup_to_fileÚbackup)r   ÚdestinationÚpagesr]   rR   Úsrc_namer)   r"   r"   r#   r´   õ   s   

ÿzCySqliteDatabase.backupc                 C   r«   rL   )r{   r³   )r   Úfilenamer¶   r]   rR   r·   r"   r"   r#   r³     s   ÿzCySqliteDatabase.backup_to_file)T)NNN)rŒ   T)r   rL   )FN)NNNN)LÚ__name__Ú
__module__Ú__qualname__r   Úsqlite_version_infoÚserver_versionr2   rK   rH   rX   r_   rg   rl   rp   rs   r~   r‚   rT   rˆ   rŠ   r‹   rP   rQ   rš   ÚWARNINGrž   rR   r¢   r¦   r©   r&   rª   r¬   r´   r³   r'   ÚSQLITE_STATUS_MEMORY_USEDÚmemory_usedÚSQLITE_STATUS_MALLOC_SIZEÚmalloc_sizeÚSQLITE_STATUS_MALLOC_COUNTÚmalloc_countÚSQLITE_STATUS_PAGECACHE_USEDÚpagecache_usedÚ SQLITE_STATUS_PAGECACHE_OVERFLOWÚpagecache_overflowÚSQLITE_STATUS_PAGECACHE_SIZEÚpagecache_sizeÚSQLITE_STATUS_SCRATCH_USEDÚscratch_usedÚSQLITE_STATUS_SCRATCH_OVERFLOWÚscratch_overflowÚSQLITE_STATUS_SCRATCH_SIZEÚscratch_sizer,   ÚSQLITE_DBSTATUS_LOOKASIDE_USEDÚlookaside_usedÚSQLITE_DBSTATUS_LOOKASIDE_HITÚlookaside_hitÚ#SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZEÚlookaside_missÚ#SQLITE_DBSTATUS_LOOKASIDE_MISS_FULLÚlookaside_miss_fullÚSQLITE_DBSTATUS_CACHE_USEDÚ
cache_usedÚSQLITE_DBSTATUS_SCHEMA_USEDÚschema_usedÚSQLITE_DBSTATUS_STMT_USEDÚstatement_usedÚSQLITE_DBSTATUS_CACHE_HITÚ	cache_hitÚSQLITE_DBSTATUS_CACHE_MISSÚ
cache_missÚSQLITE_DBSTATUS_CACHE_WRITEÚcache_writeÚ__classcell__r"   r"   rA   r#   r-   :   s˜    
ÿ
	


ÿ





ÿ
ÿ


ÿ


ÿÿÿÿÿÿÿÿÿr-   c                   @   s   e Zd ZdS )ÚPooledCySqliteDatabaseN)r¹   rº   r»   r"   r"   r"   r#   ræ   )  s    ræ   ÚMATCH)F)FF)&rš   Úpathlibr   r   r   r   r   r   r   r   Úplayhouse.poolr	   Úplayhouse.sqlite_extr
   r   r   r   r   r   r   r   r   r   r   r   r   Úplayhouse.sqlite_udfr   r   ÚImportErrorÚexcr›   r�   r'   r,   r-   ræ   rç   r"   r"   r"   r#   Ú<module>   s0    <€ÿ


 p
