o
    š�žiÃ  ã                   @   s„   d dl Z d dlZd dl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 d dlmZ e e¡Zdd„ ZG dd	„ d	ejƒZdS )
é    N)ÚapiÚmodels)ÚAccessDenied)Ú_CACHES_BY_KEY)ÚSQLc                 C   s   t | ƒo	t| ddƒS )z2 Return whether ``func`` is an autovacuum method. Ú_autovacuumF)ÚcallableÚgetattr)Úfunc© r   úA/home/minischoggi19/odoo/odoo/addons/base/models/ir_autovacuum.pyÚis_autovacuum   s   r   c                   @   s.   e Zd ZdZdZdZdd„ Zejdd„ ƒZ	dS )	ÚIrAutovacuumz; Helper model to the ``@api.autovacuum`` method decorator. zir.autovacuumzAutomatic Vacuumc           
      C   sT  | j  ¡ r| j j d¡stƒ ‚dd„ | j  ¡ D ƒ}t |¡ t 	|¡}|r¤| j d j
t|ƒd�r¦| ¡ \}}}t d||¡ z@t ¡ }||ƒ}| j d  
d¡ t|tƒrqt|ƒdkrq|\}}	t d	||||	¡ |	rq| |||f¡ t d
||t ¡ | ¡ W n ty”   t d||¡ | j j ¡  Y nw |r¨| j d j
t|ƒd�s0dS dS dS dS )z{
        Perform a complete database cleanup by safely calling every
        ``@api.autovacuum`` decorated method.
        Úcron_idc                 S   s.   g | ]}t  |jt¡D ]	\}}|||f‘qqS r   )ÚinspectÚ
getmembersÚ	__class__r   )Ú.0ÚmodelÚattrr
   r   r   r   Ú
<listcomp>#   s    ýþÿz4IrAutovacuum._run_vacuum_cleaner.<locals>.<listcomp>zir.cron)Ú	remainingzCalling %s.%s()é   é   z(%s.%s  vacuumed %r records, remaining %rz%s.%s  took %.2fszFailed %s.%s()N)ÚenvÚis_adminÚcontextÚgetr   ÚvaluesÚrandomÚshuffleÚcollectionsÚdequeÚ_commit_progressÚlenÚpopÚ_loggerÚdebugÚtimeÚ	monotonicÚ
isinstanceÚtupleÚ
appendleftÚ	ExceptionÚ	exceptionÚcrÚrollback)
ÚselfÚall_methodsÚqueuer   r   r
   Ú
start_timeÚresultÚ	func_doneÚfunc_remainingr   r   r   Ú_run_vacuum_cleaner   s8   þ

þþ*ðz IrAutovacuum._run_vacuum_cleanerc              	   C   s@   dgt ¢D ]}d|› �}| jj tdt |¡t |¡ƒ¡ qd S )NÚregistryÚorm_signaling_zZDELETE FROM %s WHERE id < (SELECT max(id)-9 FROM %s) AND date < NOW() - interval '1 hours')r   r   r/   Úexecuter   Ú
identifier)r1   ÚsignalÚtabler   r   r   Ú_gc_orm_signaling@   s   

þúzIrAutovacuum._gc_orm_signalingN)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú_nameÚ_descriptionr8   r   Ú
autovacuumr?   r   r   r   r   r      s    %r   )r!   r   Úloggingr   r(   Úodoor   r   Úodoo.exceptionsr   Úodoo.modules.registryr   Ú
odoo.toolsr   Ú	getLoggerr@   r&   r   ÚAbstractModelr   r   r   r   r   Ú<module>   s   
