o
    !2g$                     @   s   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mZm	Z	 d dl
Z
d dl
mZmZmZmZ d dlmZ ddlmZ dd	lmZ G d
d deZdS )    N)Path)IteratorOptionalSequence)ColumnTableeventtext)sqlite   )
SourceHash   )AbstractBackendc                   @   s   e Zd ZdedejddfddZdddZdd	d
Zde	e
 fddZde	e fddZdee fddZdefddZdee ddfddZde
ddfddZdS )SqliteBackend
cache_pathloggerreturnNc                   s   || _ tjd  ddid| _t| jd fdd}| j | _	 t| jdd	d
 }t | _	t
d| j	tdtj| _t
d| j	tdtj| _t
d| j	tdtj| _d S )Nz
sqlite:///timeoutr   )connect_argsconnectc              
      sb   	 z|  d W d S  tjy* } zdt|vr td  |W Y d }~nd }~ww td q)NTzPRAGMA journal_mode=WALdatabase is lockedzError while setting WAL on g?)executesqlite3OperationalErrorstrRuntimeErrortimesleep)dbapi_connectionconnection_recordoer    M/home/garg/my-data/venv/lib/python3.10/site-packages/cachew/backend/sqlite.pyset_sqlite_pragma   s   

z1SqliteBackend.__init__.<locals>.set_sqlite_pragmabeginc                 S   s   |  td d S )NzBEGIN DEFERRED)r   r	   )connr"   r"   r#   do_begin7   s   z(SqliteBackend.__init__.<locals>.do_beginhashvaluecachedata	cache_tmp)r   
sqlalchemycreate_engineenginer   listens_forr   
connectionMetaDatametar   r   String
table_hashBLOBtable_cachetable_cache_tmp)selfr   r   r$   r'   r"   r!   r#   __init__   s   

zSqliteBackend.__init__c                 C   s   | j  | _| j  | S N)r1   r%   transaction	__enter__)r9   r"   r"   r#   r=   G   s   
zSqliteBackend.__enter__c                 G   s$   | j j|  | j  | j  d S r;   )r<   __exit__r1   closer/   dispose)r9   argsr"   r"   r#   r>   N   s   
zSqliteBackend.__exit__c              
   C   s   z| j | j }W n tjjy* } zdt|v rg }n|W Y d }~n	d }~ww | }t	|dks9J |t	|dkrCd }|S |d d }|S )Nzno such table: hashr   r   )
r1   r   r5   selectr-   excr   r   fetchalllen)r9   cursore
old_hashesold_hashr"   r"   r#   get_old_hashS   s    zSqliteBackend.get_old_hashc                 C   s(   | j ttj | j\\}|S r;   )r1   r   r-   rB   funccountselect_fromr7   )r9   totalr"   r"   r#   cached_blobs_totalk   s   $z SqliteBackend.cached_blobs_totalc                 c   sT    | j | j }t|dd }|d u rtd |}n| }|D ]\}|V  q!d S )N_raw_row_iteratorziCursorResult._raw_row_iterator method isn't found. This could lead to degraded cache reading performance.)r1   r   r7   rB   getattrwarningswarn)r9   rowsraw_row_iteratorrow_iteratorblobr"   r"   r#   cached_blobso   s   

zSqliteBackend.cached_blobsc              
   C   s   z$| j j| jdd | jtd | jj| jdd | j| j W dS  tjj	yK } z|j
dkrEdt|v rE| j  W Y d }~dS |d }~ww )NT
checkfirstzDROP TABLE IF EXISTS `table`e3q8r   F)r5   creater1   r   r	   r8   dropr-   rC   r   coder   r?   )r9   rG   r"   r"   r#   get_exclusive_write   s   
z!SqliteBackend.get_exclusive_writechunkc                 C   s:   t | j jtjddd}| j|dd |D  d S )Nqmark)
paramstyle)dialectc                 S   s   g | ]}|fqS r"   r"   ).0cr"   r"   r#   
<listcomp>   s    z-SqliteBackend.flush_blobs.<locals>.<listcomp>)r   r8   insertcompiler
   rc   r1   exec_driver_sql)r9   r`   insert_into_table_cache_tmp_rawr"   r"   r#   flush_blobs   s   zSqliteBackend.flush_blobsnew_hashc                 C   sl   | j | j  | jj| j dd | j td| jj d| jj d | j | j	 
d|ig d S )NTrY   zALTER TABLE `z` RENAME TO ``r)   )r1   r   r5   deleter7   r]   r	   r8   namerg   values)r9   rl   r"   r"   r#   finalize   s   &"zSqliteBackend.finalize)r   r   )r   N)__name__
__module____qualname__r   loggingLoggerr:   r=   r>   r   r   rJ   intrO   r   bytesrX   boolr_   r   rk   rq   r"   r"   r"   r#   r      s    
2
#	r   )ru   r   r   rR   pathlibr   typingr   r   r   r-   r   r   r   r	   sqlalchemy.dialectsr
   commonr   r   r   r"   r"   r"   r#   <module>   s    