a
    Lcòfl,  ã                   @   sš   d Z ddlZddlZddlmZmZ ddlmZ ddlmZm	Z	 ddl
mZmZmZmZmZ ddlmZ G dd	„ d	ƒZG d
d„ de	ƒZG dd„ deƒZdS )zDatabase cache backend.é    N)ÚdatetimeÚtimezone)Úsettings)ÚDEFAULT_TIMEOUTÚ	BaseCache)ÚDatabaseErrorÚconnectionsÚmodelsÚrouterÚtransaction)Únowc                   @   s   e Zd ZdZdd„ ZdS )ÚOptionsz~A class that will quack like a Django model _meta class.

    This allows cache operations to be controlled by the router
    c                 C   s@   || _ d| _d| _d| _d| _d| _d| _d| _d| _d| _	d S )NZdjango_cacheZ
cacheentryzcache entryzcache entriesÚ
CacheEntryFT)
Zdb_tableZ	app_labelZ
model_nameZverbose_nameZverbose_name_pluralZobject_nameZabstractZmanagedÚproxyZswapped)ÚselfÚtable© r   úZ/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/django/core/cache/backends/db.pyÚ__init__   s    zOptions.__init__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r      s   r   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚBaseDatabaseCachec                    s.   t ƒ  |¡ ˆ | _G ‡ fdd„dƒ}|| _d S )Nc                       s   e Zd Ze” ƒZdS )z.BaseDatabaseCache.__init__.<locals>.CacheEntryN)r   r   r   r   Ú_metar   ©r   r   r   r   $   s   r   )Úsuperr   Ú_tableÚcache_model_class)r   r   Úparamsr   ©Ú	__class__r   r   r       s    zBaseDatabaseCache.__init__)r   r   r   r   Ú__classcell__r   r   r    r   r      s   r   c                   @   s’   e Zd ZejZddd„Zddd„Zedfdd„Z	edfdd	„Z
edfd
d„Zefdd„Zddd„Zddd„Zdd„ Zddd„Zdd„ Zdd„ ZdS )ÚDatabaseCacheNc                 C   s   |   |g|¡ ||¡S )N)Úget_manyÚget)r   ÚkeyÚdefaultÚversionr   r   r   r%   3   s    zDatabaseCache.getc                    sZ  |si S ‡ ‡fdd„|D ƒ}t  ˆ j¡}t| }|jj}|ˆ jƒ}| ¡ �X}| d|dƒ|dƒ|dƒ||dƒd 	dgt
|ƒ ¡f t|ƒ¡ | ¡ }	W d   ƒ n1 s¨0    Y  i }
g }tjt ¡ d	�}|j |¡| |¡ }|	D ]f\}}}|D ]}||||ƒ}qò|tƒ k �r| |¡ qä|j |¡}t t | ¡ ¡¡}||
| |¡< qäˆ  |¡ |
S )
Nc                    s   i | ]}ˆ j |ˆd �|“qS ©©r(   ©Úmake_and_validate_key©Ú.0r&   ©r   r(   r   r   Ú
<dictcomp>:   s   z*DatabaseCache.get_many.<locals>.<dictcomp>z*SELECT %s, %s, %s FROM %s WHERE %s IN (%s)Ú	cache_keyÚvalueÚexpiresú, ú%s©Zoutput_field)r
   Údb_for_readr   r   ÚopsÚ
quote_namer   ÚcursorÚexecuteÚjoinÚlenÚlistZfetchallr	   Ú
ExpressionÚDateTimeFieldÚget_db_convertersÚtz_nowÚappendZprocess_clobÚpickleÚloadsÚbase64Ú	b64decodeÚencoder%   Ú_base_delete_many)r   Úkeysr(   Zkey_mapÚdbÚ
connectionr9   r   r:   ÚrowsÚresultZexpired_keysÚ
expressionÚ
convertersr&   r2   r3   Ú	converterr   r/   r   r$   6   sR    ÿ

úÿ	ö&ÿþ
zDatabaseCache.get_manyc                 C   s"   | j ||d�}|  d|||¡ d S )Nr*   Úset©r,   Ú	_base_set©r   r&   r2   Útimeoutr(   r   r   r   rR   d   s    zDatabaseCache.setc                 C   s   | j ||d�}|  d|||¡S )Nr*   ÚaddrS   rU   r   r   r   rW   h   s    zDatabaseCache.addc                 C   s   | j ||d�}|  d|d |¡S )Nr*   ÚtouchrS   )r   r&   rV   r(   r   r   r   rX   l   s    zDatabaseCache.touchc              
   C   sÂ  |   |¡}t | j¡}t| }|jj}|| jƒ}| ¡ ��r}	|	 	d| ¡ |	 
¡ d }
tƒ }|jdd�}|d u rxtj}ntjr„tjnd }tj||d�}|jdd�}|
| jkr¼|  ||	||
¡ t || j¡}t |¡ d¡}�zŽtj|d���j |	 	d|dƒ|d	ƒ||dƒf |g¡ |	 
¡ }|�rd|d
 }tjt  ¡ d�}|j !|¡| !|¡ D ]}||||ƒ}�qP|j "|¡}|�r¤|dk�r¤|	 	d||d	ƒ|dƒf ||g¡ n¤|�rô|dk�sÈ|dk�rô||k �rô|	 	d||dƒ|d	ƒ|dƒf |||g¡ nT|dk�r*|	 	d||dƒ|dƒ|d	ƒf |||g¡ nW d   ƒ W W d   ƒ dS W d   ƒ n1 �s^0    Y  W n" t#�yŒ   Y W d   ƒ dS 0 W d   ƒ dS W d   ƒ n1 �s´0    Y  d S )NzSELECT COUNT(*) FROM %sr   )Úmicrosecond)ÚtzÚlatin1)Úusingz$SELECT %s, %s FROM %s WHERE %s = %%sr1   r3   é   r6   rX   z%UPDATE %s SET %s = %%s WHERE %s = %%srR   rW   z/UPDATE %s SET %s = %%s, %s = %%s WHERE %s = %%sr2   z2INSERT INTO %s (%s, %s, %s) VALUES (%%s, %%s, %%s)FT)$Zget_backend_timeoutr
   Údb_for_writer   r   r8   r9   r   r:   r;   ÚfetchonerB   Úreplacer   Úmaxr   ZUSE_TZr   ÚutcÚfromtimestampÚ_max_entriesÚ_cullrD   ÚdumpsÚpickle_protocolrF   Ú	b64encodeÚdecoder   Zatomicr	   r?   r@   rA   Úadapt_datetimefield_valuer   )r   Úmoder&   r2   rV   rK   rL   r9   r   r:   Únumr   ÚexprZ   ZpickledZ
b64encodedrN   Zcurrent_expiresrO   rQ   r   r   r   rT   p   sª    


üÿø
ÿÿþÿÿýÿÿÿüÿø

üÿøBzDatabaseCache._base_setc                 C   s   | j ||d�}|  |g¡S )Nr*   )r,   rI   )r   r&   r(   r   r   r   ÚdeleteÍ   s    zDatabaseCache.deletec                    s"   ‡ ‡fdd„|D ƒ}ˆ   |¡ d S )Nc                    s   g | ]}ˆ j |ˆd �‘qS r)   r+   r-   r/   r   r   Ú
<listcomp>Ò   ó    z-DatabaseCache.delete_many.<locals>.<listcomp>)rI   )r   rJ   r(   r   r/   r   Údelete_manyÑ   s    zDatabaseCache.delete_manyc                 C   sŽ   |sdS t  | j¡}t| }|jj}|| jƒ}| ¡ �D}| d||dƒd 	dgt
|ƒ ¡f |¡ t|jƒW  d   ƒ S 1 s€0    Y  d S )NFzDELETE FROM %s WHERE %s IN (%s)r1   r4   r5   )r
   r^   r   r   r8   r9   r   r:   r;   r<   r=   ÚboolÚrowcount)r   rJ   rK   rL   r9   r   r:   r   r   r   rI   Õ   s"    

ýÿù	zDatabaseCache._base_delete_manyc              	   C   s¨   | j ||d�}t | j¡}t| }|jj}tƒ jdd d�}| 	¡ �R}| 
d|dƒ|| jƒ|dƒ|dƒf ||j |¡g¡ | ¡ d uW  d   ƒ S 1 sš0    Y  d S )Nr*   r   )rY   Útzinfoz-SELECT %s FROM %s WHERE %s = %%s and %s > %%sr1   r3   )r,   r
   r7   r   r   r8   r9   rB   r`   r:   r;   r   rj   r_   )r   r&   r(   rK   rL   r9   r   r:   r   r   r   Úhas_keyê   s"    
üÿø
zDatabaseCache.has_keyc                 C   s¼   | j dkr|  ¡  n¤t| }|j | j¡}| d||j d¡f |j |¡g¡ |j}|| }|| j	kr¸|| j  }	| |j 
¡ | |	g¡ | ¡ }
|
r¸| d||j d¡f |
d g¡ d S )Nr   zDELETE FROM %s WHERE %s < %%sr3   r1   )Z_cull_frequencyÚclearr   r8   r9   r   r;   rj   rs   rd   Zcache_key_culling_sqlr_   )r   rK   r:   r   rl   rL   r   Zdeleted_countZremaining_numZcull_numZlast_cache_keyr   r   r   re      s:    


þÿú

ÿ
þÿúzDatabaseCache._cullc                 C   s\   t  | j¡}t| }|j | j¡}| ¡ �}| d| ¡ W d   ƒ n1 sN0    Y  d S )NzDELETE FROM %s)	r
   r^   r   r   r8   r9   r   r:   r;   )r   rK   rL   r   r:   r   r   r   rv      s
    
zDatabaseCache.clear)NN)N)N)N)N)r   r   r   rD   ÚHIGHEST_PROTOCOLrg   r%   r$   r   rR   rW   rX   rT   rn   rq   rI   ru   re   rv   r   r   r   r   r#   *   s   

.]


 r#   )r   rF   rD   r   r   Zdjango.confr   Zdjango.core.cache.backends.baser   r   Z	django.dbr   r   r	   r
   r   Zdjango.utils.timezoner   rB   r   r   r#   r   r   r   r   Ú<module>   s   