
    oAi 	                     T    d Z ddlZddlmZ ddlmZ ddlmZ ddlm	Z	  G d d      Z
y)	z=
Database-level locking for preventing concurrent execution.
    N)date)transaction)CronExecution)ConcurrentExecutionErrorc                   ,    e Zd ZdZdedefdZd Zd Zy)DatabaseLockz+Context manager for database-level locking.	task_codeexecution_datec                      || _         || _        y )N)r	   r
   )selfr	   r
   s      N/home/cursorai/projects/django-cronjob-utils/src/django_cronjob_utils/locks.py__init__zDatabaseLock.__init__   s    ",    c           	         t        j                         | _        | j                  j                          	 t        j
                  j                         j                  | j                  | j                  d      j                         }|rW| j                  j                  d d d        d | _        t        d| j                   d| j                   d|j                   d      	 | S # t        $ r2 | j                  r$| j                  j                  d d d        d | _         t        $ r@ | j                  r2 | j                  j                  t        j                            d | _         w xY w)NF)r	   r
   	completedzTask z already running for z (started at ))r   atomic_transaction	__enter__r   objectsselect_for_updatefilterr	   r
   first__exit__r   started	Exceptionsysexc_info)r   runnings     r   r   zDatabaseLock.__enter__   sT    (..0##%	#++==?FF..#22 G  eg	  !!**4t<$(!.DNN++@ATAT@U V##*??"316 	 *  ( 	  !!**4t<$(! 	  *!!**CLLN;$(!	s   B+C# #BE%c                     t        | d      r2| j                  %| j                  j                  |||       d | _        y y y )Nr   )hasattrr   r   )r   exc_typeexc_valexc_tbs       r   r   zDatabaseLock.__exit__8   s@    4(T->->-J&&x&A $D .K(r   N)	__name__
__module____qualname____doc__strr   r   r   r    r   r   r   r      s#    5-# -t -#J%r   r   )r(   r   datetimer   	django.dbr   django_cronjob_utils.modelsr   django_cronjob_utils.exceptionsr   r   r*   r   r   <module>r/      s%      ! 5 D0% 0%r   