
    *pjq                       % S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	J
r
Jr  S SKJrJrJrJrJrJr  S SKJr  SSKJrJrJrJrJrJr  SSKJr  \(       a+  S S	KJrJ r   S S
K!J"r"  \RF                  S:  a  S SKJ$r$  OS SK%J$r$  \RL                  " S5      r'S\(S'   \RR                  r*S\(S'   \RV                  RX                  S:H  r-S\(S'   \." \S5      =(       a/    \RV                  RX                  S:H  =(       a    \RF                  S:  r/S\(S'   \0\1-  \Rd                  \0   -  \Rd                  \1   -  \3-  \4-  \5\Rl                     -  S-  r7S\(S'   \8\4\44   r9S\(S'   Sr:S\(S'   Sr;S\(S '    " S! S"\Rx                  5      r=\=" 5       r>S#\(S$'    " S% S&5      r?\?" 5       r@S#\(S''    " S( S)5      rA\A" 5       rBS#\(S*'    " S+ S,\Rl                  5      rC " S- S.\55      rD " S/ S0\DS19rES9S2 jrF\
S:S3 j5       rGS;S4 jrHS<S5 jrIS=S6 jrJ\" \@5        \" \B5        \" \E5        \-(       a  \R                  " \I5        \." \S5      (       a  \R                  " \HS79  S0S8/rMg)>    )annotationsN)contextmanagersuppress)TYPE_CHECKINGClassVarFinalLiteral	TypeAliascast)WeakValueDictionary   )AcquireReturnProxy_ensure_current_process_fork_transition_raise_chained_errors_register_fork_class_register_fork_object)Timeout)Callable	Generator)Unused)      )SelffilelockzFinal[logging.Logger]_LOGGERzFinal[Callable[[], int]]_GETPIDpypyzFinal[bool]_IS_PYPYregister_at_forkcpython)r      _NEEDS_CONNECTION_ESCROWr
   _ConnectionParameter_DatabaseIdentityi5wz
Final[int]_MAX_SQLITE_TIMEOUT_MSF   _UNSAFE_FORK_EXIT_STATUSc                  $    \ rS rSr% SrS\S'   Srg)_SQLiteTransitionContext2   r   intdepth N)__name__
__module____qualname____firstlineno__r-   __annotations____static_attributes__r.       P/var/www/html/pdf-tiff/venv/lib/python3.13/site-packages/filelock/_read_write.pyr*   r*   2   s    E3Nr5   r*   r   _SQLITE_TRANSITION_CONTEXTc                  6    \ rS rSrSS jr  SS jrSS jrSrg)	_ConnectionEscrow9   c                F    [         R                  " 5       U l        S U l        g N)	threadingRLock_lock
_functionsselfs    r6   __init___ConnectionEscrow.__init__:   s    __&
txr5   c                :   [         (       d  g U R                     U R                  c  SS KnUR	                  S UR
                  5      nUR                  UR                  R                  UR                  5      R                  nUR                  UR                  R                  UR                  5      R                  nUb  Uc  Sn[        U5      e[        SU" U5      5      [        SU" U5      5      4U l        U R                  sS S S 5        $ ! , (       d  f       g = f)Nr   z+CPython reference functions have no addressz$Callable[[sqlite3.Connection], None])r#   r?   r@   ctypes
PYFUNCTYPE	py_objectr   	pythonapi	Py_IncRefc_void_pvalue	Py_DecRefRuntimeError)rB   rF   function_typeincrement_addressdecrement_addressmsgs         r6   	functions_ConnectionEscrow.functions>   s     ('ZZ& & 1 1$8H8H I$*KK0@0@0J0JFOO$\$b$b!$*KK0@0@0J0JFOO$\$b$b!$,0A0IGC&s++?O`Aab?O`Aab# ?? ZZs   C)D
Dc                8    [         R                  " 5       U l        g r<   )r=   r>   r?   rA   s    r6   _reset_after_fork_in_child,_ConnectionEscrow._reset_after_fork_in_childS   s    __&
r5   )r@   r?   NreturnNone)rY   Xtuple[Callable[[sqlite3.Connection], None], Callable[[sqlite3.Connection], None]] | None)r/   r0   r1   r2   rC   rS   rV   r4   r.   r5   r6   r9   r9   9   s    y#	a#*'r5   r9   _CONNECTION_ESCROWc                  Z    \ rS rSrS
S jrSS jrSS jrS
S jrS
S jr\	SS j5       r
Srg	)_ForkedDatabaseRegistryZ   c                    [         R                  " 5       U l        [        5       U l        [        5       U l        SU l        SU l        g NF)r=   r>   r?   set_paths_identities_sqlite_used_all_paths_poisonedrA   s    r6   rC    _ForkedDatabaseRegistry.__init__[   s3    __&
),365!#( r5   c                <   U R                  U5      nU R                     U R                  nU=(       d.    XR                  ;   =(       d    US L=(       a    X R                  ;   nS S S 5        W(       a  W(       a  SOSU< S3n[        U5      eg ! , (       d  f       N1= f)NzOReadWriteLock is unavailable in a PyPy fork child; exec or exit before using itzSQLite database zD was active across fork(); exec or exit before using it in the child)identityr?   rf   rc   rd   rN   )rB   pathri   all_paths_poisonedpoisonedrR   s         r6   raise_if_poisoned)_ForkedDatabaseRegistry.raise_if_poisonedb   s    ==&ZZ!%!9!9"tdkk&9thd>R>sW_cscsWs  
  & b'x/st 
 s##  Zs   AB
Bc                x    U R                   R                  U5        Ub  U R                  R                  U5        g g r<   )rc   addrd   )rB   rj   ri   s      r6   poison_after_fork)_ForkedDatabaseRegistry.poison_after_forkq   s1      *  r5   c                v    [         (       a  U R                     SU l        S S S 5        g g ! , (       d  f       g = fNT)r   r?   re   rA   s    r6   note_sqlite_use'_ForkedDatabaseRegistry.note_sqlite_usev   s(    8$(!  s   *
8c                    [         R                  " 5       U l        U R                  =(       d    [        =(       a    U R
                  U l        SU l        g ra   )r=   r>   r?   rf   r   re   rA   s    r6   rV   2_ForkedDatabaseRegistry._reset_after_fork_in_child{   s6    __&
#'#;#;#_@^TM^M^ !r5   c                t     U R                  5       nUR                  UR                  4$ ! [         a     g f = fr<   )statOSErrorst_devst_ino)rj   stat_results     r6   ri    _ForkedDatabaseRegistry.identity   s?    	))+K !!;#5#555  		s   * 
77)rf   rd   r?   rc   re   NrX   )rj   pathlib.PathrY   rZ   )rj   r   ri   _DatabaseIdentity | NonerY   rZ   )rj   r   rY   r   )r/   r0   r1   r2   rC   rm   rq   ru   rV   staticmethodri   r4   r.   r5   r6   r^   r^   Z   s/    )$+
)
"
 6 6r5   r^   _FORKED_DATABASESc                  t   ^  \ rS rSr% S\S'   S\S'         SU 4S jjrSS jr    SS jrSS	 jrS
r	U =r
$ )_ForkSafeConnection   r,   _creator_pidz+Callable[[sqlite3.Connection], None] | None_decrement_escrowc                R   > [         TU ]  U 5      n[        5       Ul        S Ul        U$ r<   )super__new__r   r   r   )cls_args_kwargs
connection	__class__s       r6   r   _ForkSafeConnection.__new__   s+    
 W_S)
"))
'+
$r5   c                R   [        5          [        5       U R                  :w  a
   S S S 5        g [        5          [        R
                  R                  U 5        U R                  =nb  S U l        U" U 5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = fr<   )_sqlite_transitionr   r   r   sqlite3
Connectioncloser   )rB   	decrements     r6   r   _ForkSafeConnection.close   s~    !yD--- "! "#""((.!%!7!77ID-1D*dO	 $ "! $# "!s'   B
B>B6B
B	B
B&c                0    Ub  Uu  p#U" U 5        X0l         g g r<   r   )rB   rS   	incrementr   s       r6   acquire_escrow"_ForkSafeConnection.acquire_escrow   s$    
  #, IdO%." !r5   c                    [        [        R                  [        5         U R	                  5         S S S 5        g ! , (       d  f       g = fr<   )r   r   ErrorrN   r   rA   s    r6   __del___ForkSafeConnection.__del__   s%    gmm\2JJL 322s	   9
Ar   )r   r$   r   r$   rY   r   rX   )rS   r[   rY   rZ   )r/   r0   r1   r2   r3   r   r   r   r   r4   __classcell__r   s   @r6   r   r      sV    BB$ ( 
	$/k/ 
/ r5   r   c                     ^  \ rS rSr% SrS\S'   S\S'   S\S'   S	\S
'    SSSS.         SU 4S jjjjrSS jrSrU =r	$ )_ReadWriteLockMeta   z
Resolve singleton instances for ``is_singleton=True`` construction.

This logic lives here rather than in ReadWriteLock.get_lock so ``ReadWriteLock(path)`` returns cached instances
without a 2-arg ``super()`` call that type checkers cannot verify.

0WeakValueDictionary[pathlib.Path, ReadWriteLock]
_instanceszthreading.RLock_instances_lockr,   _instances_pidzset[pathlib.Path]_instances_under_constructionTblockingis_singletonc          	       > [        5         U R                  [        5       :w  a  U R                  5         [        5       nU(       d+  [        T
U ]  XX4S9n[        5       U:w  a  Sn[        U5      eU$ [        R                  " U5      R                  5       nU R                     XR                  ;  a  XR                  ;   a  SU< 3n[        U5      eU R                  n	U	R                  U5         [        T
U ]  XX4S9n[        5       U:X  a  U	R                  U5        [        5       U:w  a  Sn[        U5      eX`R                  U'   OU R                  U   nUR                  U:w  d  UR                   U:w  a-  SUR                   SUR                    SU SU 3n[#        U5      eUsS S S 5        $ ! [        5       U:X  a  U	R                  U5        f f = f! , (       d  f       g = f)Nr   z5ReadWriteLock construction cannot continue after forkz2Singleton lock construction is already active for z$Singleton lock created with timeout=z, blocking=z, cannot be changed to timeout=)r   r   r   _reset_class_after_forkr   __call__rN   pathlibPathresolver   r   r   rp   discardtimeoutr   
ValueError)r   	lock_filer   r   r   construction_pidinstancerR   
normalizedconstruction_registryr   s             r6   r   _ReadWriteLockMeta.__call__   s    	 !*'')"9w'	X'iHy,,M"3''O\\),446
  /!B!BBNym\C&s++(+(I(I%%))*5B$w/	X/qHy$44-55jA9 00QC&s++-5z*>>*57*h.?.?8.K:8;K;K:LKX`XiXiWj k55<I[
T  !o%3 !  y$44-55jA 5 ! s&    AG.F,<B&G,"GG
Gc                    [        5       U l        [        R                  " 5       U l        [        5       U l        [        5       U l        g r<   )	r   r   r=   r>   r   r   r   rb   r   )r   s    r6   r   *_ReadWriteLockMeta._reset_class_after_fork   s/    ,.'oo/$Y,/E)r5   r.   )
r   str | os.PathLike[str]r   floatr   boolr   r   rY   ReadWriteLockrX   )
r/   r0   r1   r2   __doc__r3   r   r   r4   r   r   s   @r6   r   r      sz     A@$$#44
 -
 !-)- -
 - - 
- -^2 2r5   r   c                  L  ^  \ rS rSr% Sr\" 5       rS\S'   \R                  " 5       r
\" 5       r\" 5       rS\S'   S'U 4S jjr\ S(SS	.       S)S
 jjj5       r S(SSS.         S*S jjjrS(SS	.S+S jjjrS(SS	.S+S jjjr\S,SS	.S-S jjj5       r\S,SS	.S-S jjj5       rSS.S.S jjrS'S jrS/S jrS'S jrS'S jrS'S jr\S0S j5       rS'S jr S1S jr!            S2S jr"S3S jr#          S4S jr$S5S  jr%S'S! jr&S6S" jr'S7S# jr(S8S$ jr)S9S% jr*S&r+U =r,$ ):r      a8  
Cross-process read-write lock backed by SQLite.

Allows concurrent shared readers or a single exclusive writer. The lock is reentrant within the same mode (multiple
``acquire_read`` calls nest, as do multiple ``acquire_write`` calls from the same thread), but upgrading from read
to write or downgrading from write to read raises :class:`RuntimeError`. Write locks are pinned to the thread that
acquired them.

By default, ``is_singleton=True``: calling ``ReadWriteLock(path)`` with the same resolved path returns the same
instance. The path is handed to :func:`sqlite3.connect` as given, so a ``.db`` extension is a convention rather
than a requirement; the filesystem must be one the active SQLite VFS supports.

:param lock_file: path to the SQLite database file used as the lock
:param timeout: maximum wait time in seconds; ``-1`` means block indefinitely
:param blocking: if ``False``, raise :class:`~filelock.Timeout` immediately when the lock is unavailable
:param is_singleton: if ``True``, reuse existing instances for the same resolved path

.. versionadded:: 3.21.0

r   r   zClassVar[set[pathlib.Path]]r   c                   > [         TU ]  5         [        5       U l        [        R
                  " 5       U l        [        5       U l        [        5       U l
        [        U 5        g r<   )r   __init_subclass__r   r   r=   r>   r   r   r   rb   r   r   )r   r   s    r6   r   ReadWriteLock.__init_subclass__  sC    !#,.'oo/$Y,/E)S!r5   Tr   c                   U " XUS9$ )a  
Return the singleton :class:`ReadWriteLock` for *lock_file*.

:param lock_file: path to the SQLite database file used as the lock
:param timeout: maximum wait time in seconds; ``-1`` means block indefinitely
:param blocking: if ``False``, raise :class:`~filelock.Timeout` immediately when the lock is unavailable

:returns: the singleton lock instance

:raises ValueError: if an instance already exists for this path with different *timeout* or *blocking* values

r   r.   )r   r   r   r   s       r6   get_lockReadWriteLock.get_lock  s      999r5   r   c                  [         R                  " U5      U l        [        R                  " U5      R                  5       U l        [        R                  U R                  5        X l	        X0l
        [        R                  " 5       U l        [        R                  " 5       U l        SU l        S U l        S U l        [%        5       U l        S U l        SU l        S U l        SU l        [1        5       U l        SU l        [7        U 5        [9        5          [;        5          U R=                  SS9nUR?                  5         S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nr   TFg      @sqlite_timeout) osfspathr   r   r   r   _canonical_pathr   rm   r   r   r=   Lock_transaction_lock_internal_lock_lock_level_current_mode_write_thread_idrb   _acquisition_thread_ids_con _connection_transaction_released_connection_identity_closedr   r   _fork_invalidatedr   r   r   _open_connectionr   )rB   r   r   r   r   validation_connections         r6   rC   ReadWriteLock.__init__,  s	    9-&||I6>>@++D,@,@A !*!1'nn.>B,014$04	04->B!#I!&d#!3!5$($9$9$9$M!!'') "6!5!5s$   E E:E
E	E
E*c               "    U R                  SXS9$ )a  
Acquire a shared read lock.

If this instance already holds a read lock, the lock level is incremented (reentrant). Attempting to acquire a
read lock while holding a write lock raises :class:`RuntimeError` (downgrade not allowed).

:param timeout: maximum wait time in seconds; ``-1`` means block indefinitely
:param blocking: if ``False``, raise :class:`~filelock.Timeout` immediately when the lock is unavailable

:returns: a proxy that can be used as a context manager to release the lock

:raises RuntimeError: if a write lock is already held on this instance
:raises Timeout: if the lock cannot be acquired within *timeout* seconds

readr   _acquirerB   r   r   s      r6   acquire_readReadWriteLock.acquire_readJ  s      }}VW}@@r5   c               "    U R                  SXS9$ )a.  
Acquire an exclusive write lock.

If this instance already holds a write lock from the same thread, the lock level is incremented (reentrant).
Attempting to acquire a write lock while holding a read lock raises :class:`RuntimeError` (upgrade not allowed).
Write locks are pinned to the acquiring thread: a different thread trying to re-enter also raises
:class:`RuntimeError`.

:param timeout: maximum wait time in seconds; ``-1`` means block indefinitely
:param blocking: if ``False``, raise :class:`~filelock.Timeout` immediately when the lock is unavailable

:returns: a proxy that can be used as a context manager to release the lock

:raises RuntimeError: if a read lock is already held, or a write lock is held by a different thread
:raises Timeout: if the lock cannot be acquired within *timeout* seconds

writer   r   r   s      r6   acquire_writeReadWriteLock.acquire_write\  s    $ }}Wg}AAr5   Nc             #     #    Uc  U R                   nUc  U R                  nU R                  XS9   Sv   U R                  5         g! U R                  5         f = f7f)aU  
Context manager that acquires and releases a shared read lock.

Falls back to instance defaults for *timeout* and *blocking* when ``None``.

:param timeout: maximum wait time in seconds, or ``None`` to use the instance default
:param blocking: if ``False``, raise :class:`~filelock.Timeout` immediately; ``None`` uses the instance default

Nr   )r   r   r   releaser   s      r6   	read_lockReadWriteLock.read_lockp  sO      ?llG}}H'5	LLNDLLN   .AA AAAc             #     #    Uc  U R                   nUc  U R                  nU R                  XS9   Sv   U R                  5         g! U R                  5         f = f7f)aZ  
Context manager that acquires and releases an exclusive write lock.

Falls back to instance defaults for *timeout* and *blocking* when ``None``.

:param timeout: maximum wait time in seconds, or ``None`` to use the instance default
:param blocking: if ``False``, raise :class:`~filelock.Timeout` immediately; ``None`` uses the instance default

Nr   )r   r   r   r   r   s      r6   
write_lockReadWriteLock.write_lock  sO      ?llG}}H76	LLNDLLNr   F)forcec                   [        5          [        5         U R                  (       a
   SSS5        gU R                  S5        U R	                  USS9  SSS5        g! , (       d  f       g= f)aD  
Release one level of the current lock.

When the lock level reaches zero the underlying SQLite transaction is rolled back, releasing the database lock.

:param force: if ``True``, release the lock completely regardless of the current lock level

:raises RuntimeError: if no lock is currently held and *force* is ``False``

Nr   Fr   r   r   r   
_inherited_raise_if_acquiring_release)rB   r   s     r6   r   ReadWriteLock.release  sN     #%   $$Y/MMUM3     A!A
A)c                    [        5          [        5         U R                  (       a
   SSS5        gU R                  S5        U R	                  SSS9  SSS5        g! , (       d  f       g= f)z
Release the lock (if held) and close the underlying SQLite connection.

After calling this method, the lock instance is no longer usable.

Nr   Tr   r   rA   s    r6   r   ReadWriteLock.close  sN     #%   $$W-MMDM1  r   c                  U R                      U R                     U R                  S:X  ab  U(       a-  U R                  c   U(       a  SU l         S S S 5        S S S 5        g U(       d'  SU R
                   S[        U 5       S3n[        U5      eU(       d7  U R                  S:  a'  U =R                  S-  sl         S S S 5        S S S 5        g  U R                  5         U R                  5         U(       a  SU l        S S S 5        S S S 5        g ! [        R                   a#    U R                  (       a  U R                  5         e f = f! , (       d  f       NQ= f! , (       d  f       g = f)Nr   TzCannot release a lock on  (lock id: z) that is not heldr   )r   r   r   r   r   r   idrN   _finish_connectionr   r   r   _clear_lock_state)rB   r   r   rR   s       r6   r   ReadWriteLock._release  s   ##T%8%81$TYY.'+ &9## 5dnn5E[QSTXQYPZZlmC&s++T--1  A%  &9##'')
 ""$#) &9## == 88**, &9%8##sM   E4EEAE:EDE:E7EE
E	E
E$c                .    SU l         S U l        S U l        g )Nr   )r   r   r   rA   s    r6   r  ReadWriteLock._clear_lock_state  s    ! $r5   c                    [        5       [        U SS 5      :X  aI  [        U SS 5      =nb8  [        [        R                  [
        5         UR                  5         S S S 5        g g g ! , (       d  f       g = f)Nr   r   )r   getattrr   r   r   rN   r   )rB   r   s     r6   r   ReadWriteLock.__del__  s^    9nd;;wW[]ceiOjAj@w'--6  " 76 Ax;66s   A$$
A2c                P   U R                   b*  [        R                  U R                  U R                  5        S U l         SU l        S U l        [        R                  " 5       U l        [        R                  " 5       U l	        U R                  5         [        5       U l        SU l        g rt   )r   r   rq   r   r   r   r=   r   r   r   r  rb   r   r   rA   s    r6   rV   (ReadWriteLock._reset_after_fork_in_child  s{    99 //0D0DdF_F_`	04-$(!!*!1'nn. '*u$!%r5   c                V    U R                   =(       d    [        5       U R                  :g  $ r<   )r   r   r   rA   s    r6   r   ReadWriteLock._inherited  s     %%Gd6G6G)GGr5   c                    [        5         U R                  (       a  SU R                   S3n[        U5      eU R                  (       a  Sn[
        R                  " U5      eg )NReadWriteLock on 4 was invalidated by fork(); construct a new instancez$Cannot operate on a closed database.)r   r   r   rN   r   r   ProgrammingError)rB   rR   s     r6   _raise_if_unusable ReadWriteLock._raise_if_unusable  sP    !??%dnn%55ijCs##<<8C**3// r5   c          	        [        5          U R                  5         [        5       n[        R                  " 5       nU R
                     U R                  S:  a#  U R                  U5      sS S S 5        sS S S 5        $ XPR                  ;   a  SU R                   S3n[        U5      eU R                  R                  U5        S S S 5         [        R                  " 5       nU R                  X2S9   U R                  5         U R                  UUUUUS9U R                   R#                  5         U R
                     U R                  R%                  U5        S S S 5        sS S S 5        $ ! , (       d  f       N= f! , (       d  f       N)= f! U R                   R#                  5         f = f! U R
                     U R                  R%                  U5        S S S 5        f ! , (       d  f       f = f= f! , (       d  f       g = f)Nr   z Cannot acquire ReadWriteLock on + while acquisition is active in this threadr   r   r   operation_pid
start_time)r   r  r   r=   	get_identr   r   _validate_reentrantr   r   rN   rp   timeperf_counter_acquire_transaction_lock_do_acquire_innerr   r   r   )rB   moder   r   r  	thread_idrR   r  s           r6   r   ReadWriteLock._acquire  s   ##%#IM!++-I$$##a'33D9 %$	    < <<<T^^<LLwxC&s++,,00; %D!..0
...R
5++-11!)&3#- 2  **224((0088C )5   %$, )( **224((0088C )((5  s   <G+!E$(	G+;AE$ G+	$F%."FF%*G+6E5G+$
E2	.G+5
F?G+F""F%%G(2G		G(
G%!G((G++
G9c               b   U R                      U R                  S:  a  U R                  U5      sS S S 5        $  S S S 5        U R                  b  U R	                  5          U R                  UUUUS9  U R                  UUUXE4S9  U R                  U5        U R                      U R                  U5        Xl        SU l        US:X  a  [$        R&                  " 5       U l        S S S 5        [+        U S9$ ! , (       d  f       N= f! [         a  n[        U[        R                  5      (       a%  S[        U5      ;   a  [        U R                  5      nOUn U R	                  5         O,! [        R                   a  n[!        Xx5         S nAOS nAff = fXvLa  US ee S nAff = f! , (       d  f       N= f)Nr   r  )r   	operationzdatabase is lockedr   r   lock)r   r   r  r   r  _open_for_acquisition_configure_and_begin_raise_if_process_changedBaseException
isinstancer   OperationalErrorstrr   r   r   r   r   r=   r  r   r   )	rB   r$  r   r   r  r  erroracquisition_errorcleanup_errors	            r6   r#  ReadWriteLock._do_acquire_inner  s      !#//5 ! # ! 99 ##%	&&!+%	 '  %%!(5	 &  **=9   **=9!% Dw(1(;(;(=% ! "t,,M ! &  	%!9!9::?SWZ[`Wa?a$+DNN$;!$)!H'')== H%&7GGH -'T1	 ! sZ   !C16D !?F 1
C?
FAFE$#F$F8FFFFF 
F.c               :   [        5          [        UU[        R                  " 5       U-
  S9S-  nU R	                  US9nUS[
        R                  U R                  5      sU l        U l	        U l
        U R                  U5        S S S 5        g ! , (       d  f       g = f)Nr   already_waited  r   F)r   timeout_for_sqliter   r!  r   r   ri   r   r   r   r   r-  )rB   r   r   r  r  r   r   s          r6   r+  #ReadWriteLock._open_for_acquisitionD  s    !"%#'#4#4#6#C
   ..n.MJ!**4+?+?@ XDIt<d>W
 **=9 "!!s   A8B
Bc                  [        5          Uu  pV[        SU R                  5      n[        R                  " 5       U-
  n[        X#US9n	U R                  U5        UR                  SU	 S35      R                  5         [        R                  " 5       U-
  n[        X#US9n
U R                  U5        X:w  a  SU
 S3OSnXS:X  a  SOS	-  nUS
:X  a  US-  nUR                  U5      R                  5         S S S 5        g ! , (       d  f       g = f)Nr   r7  zPRAGMA busy_timeout=z; PRAGMA journal_mode=MEMORY;z;  r   zBEGIN EXCLUSIVE TRANSACTION;zBEGIN TRANSACTION;r   z( SELECT name FROM sqlite_schema LIMIT 1;)	r   r   r   r   r!  r:  r-  executescriptr   )rB   r$  r   r   r(  r  r  r   waited
timeout_ms
recomputed
statementss               r6   r,  "ReadWriteLock._configure_and_beginV  s     !(1%M3TYY?J&&(:5F+GW]^J**=9$$';J<Gd%eflln &&(:5F+GW]^J**=9BLBZ/
|2>`bJGO8QeeJv~ HH
$$Z0668- "!!s   C'C;;
D	c                  [        5          [        5       n[        R                  5       n[        5       U:w  a  Sn[	        U5      e[        [        R                  " U R                  5      [        US9nUb  UR                  U5        [        5       U:w  aJ  [        R                  U R                  [        R                  U R                  5      5        Sn[	        U5      eUsS S S 5        $ ! , (       d  f       g = f)Nz9SQLite connection construction cannot continue after fork)factoryr   )r   r   r\   rS   rN   _connectr   r   r   r   r   r   rq   ri   )rB   r   creator_pidrS   rR   r   s         r6   r   ReadWriteLock._open_connectionv  s    !!)K*446IyK'Q"3''!		$../+&J
 $)))4yK'!33((%..t/C/CD R"3'') "!!s   CC))
C7c                ,   [        5          U R                  =nc
   S S S 5        g S nU R                  (       d1  UR                  (       a   UR	                  5         SU l        OSU l         UR                  5         S U l        SU l        S U l	        Ub  Ue S S S 5        g ! [
        R                   a%  nUR                  (       a  e SU l        Un S nANiS nAff = f! [
        R                   a  nUb  [        X$5        e S nAff = f! , (       d  f       g = frt   )
r   r   r   in_transactionrollbackr   r   r   r   r   )rB   r   rollback_errorr2  close_errors        r6   r   ReadWriteLock._finish_connection  s   !"ii'
0 "! 48N88,,E"++- AE=<@D9  "
 DI48D1(,D%)$$ *5 "! #== /%44!@D=).	/ == !-).F' "!s^   D$D
BD*C:DC2CDCDD.C==DD
Dc                   U R                   U:w  aD  US:X  a  SOSnUS:X  a  SOSnSU SU R                   S[        U 5       SU S	U S
3n[        U5      eUS:X  aZ  [        R
                  " 5       =oPR                  :w  a6  SU R                   S[        U 5       SU SU R                   3n[        U5      eU =R                  S-  sl        [        U S9$ )Nr   r   	downgradeupgradezCannot acquire z	 lock on r  z): already holding a z lock (z not allowed)zCannot acquire write lock on z) from thread z while it is held by thread r   r)  )	r   r   r  rN   r=   r  r   r   r   )rB   r$  opposite	directionrR   curs         r6   r  !ReadWriteLock._validate_reentrant  s    %"&&.wfH'+v~9I!$y0@BtH: V%%-Jgi[O  s##7?y':':'< <AVAVV//?{2d8* U"e#?@U@U?VX  s##A!t,,r5   c                   U(       d  U R                   R                  SS9nO:US:X  a  U R                   R                  SS9nOU R                   R                  SUS9nU(       d  [        U R                  5      S eg )NFr   r   Tr  )r   acquirer   r   )rB   r   r   acquireds       r6   r"  'ReadWriteLock._acquire_transaction_lock  sr    --55u5EH]--55t5DH--55tW5UH$..)t3 r5   c                    U R                      [        R                  " 5       U R                  ;   nS S S 5        W(       a  SU SU R                   S3n[        U5      eg ! , (       d  f       N4= f)NzCannot z ReadWriteLock on r  )r   r=   r  r   r   rN   )rB   r(  active_in_current_threadrR   s       r6   r   !ReadWriteLock._raise_if_acquiring  sa      '0':':'<@\@\'\$ !#I;&88HHstCs## $ ! s   #A
A,c                x    [        5       U:w  d  U R                  (       a  SU R                   S3n[        U5      eg )Nr  r  )r   r   r   rN   )rB   r  rR   s      r6   r-  'ReadWriteLock._raise_if_process_changed  s6    9%%dnn%55ijCs## *9r5   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rX   r   )r   r   r   r   r   r   rY   r   )
r   r   r   r   r   r   r   r   rY   rZ   )r   r   r   r   rY   r   r<   )r   zfloat | Noner   zbool | NonerY   Generator[None])r   r   rY   rZ   )r   r   r   r   rY   rZ   )rY   r   )r$  Literal['read', 'write']r   r   r   r   rY   r   )r$  r`  r   r   r   r   r  r,   r  r   rY   r   )
r   r   r   r   r  r,   r  r   rY   rZ   )
r$  r`  r   r   r   r   r(  ztuple[int, float]rY   rZ   )r   r   rY   r   )r$  r`  rY   r   )r   r   r   r   rY   rZ   )r(  z&Literal['acquire', 'close', 'release']rY   rZ   )r  r,   rY   rZ   )-r/   r0   r1   r2   r   r   r   r3   r=   r>   r   r   r   rb   r   r   classmethodr   rC   r   r   r   r   r   r   r   r   r  r   rV   propertyr   r  r   r#  r+  r,  r   r  r  r"  r   r-  r4   r   r   s   @r6   r   r      s   * DWCXJ@Xoo'OYNAD!#>F" AC:Y]:.:9>:RV:	: :( *
 !*)* *
 * * 
*<AD A A$BT B B( QU  ( RV  ( (- 4$2$.%
#

& H H0D<0-&0- 0-
 0- 0- 0- 
0-d:$9&9 9
 9 %9 
9@.%<-$4$$ $r5   r   )	metaclassc               Z    [         R                  5         [        R                  " U SUSUS9$ )NFr   )check_same_threadrE  cached_statementsr   )r   ru   r   connect)databaserE  r   s      r6   rF  rF    s.    %%'?? r5   c               #     #    [         =R                  S-  sl         S v   [         =R                  S-  sl        g ! [         =R                  S-  sl        f = f7f)Nr   )r7   r-   r.   r5   r6   r   r     sA     $$)$."((A-("((A-(s   A; AAAc                 d    [         R                  (       a  [        R                  " [        5        g g r<   )r7   r-   r   _exitr(   r.   r5   r6   _abort_forked_sqlite_transitionrl    s    !''
)* (r5   c                :    U S:X  a  [         R                  5         g g )Nzsqlite3.connect)r   ru   )eventr   s     r6   _track_sqlite_usero    s    !!))+ "r5   c                   USL a  gU S:X  a  [         $ U S:  a  Sn[        U5      e[        U S:  a  [        X-
  S5      OU S-  5      nU[         :  d  US:  a!  [        R                  SU [         5        [         $ U$ )NFr   r   z+timeout must be a non-negative number or -1r9  z7timeout %s is too large for SQLite, using %s ms instead)r&   r   r,   maxr   warning)r   r   r8  rR   r@  s        r6   r:  r:    s    5"}%%{;o'A+c'2A67VZZ[J**j1nQSZ\rs%%r5   )after_in_childr:  )rh  r1  rE  ztype[_ForkSafeConnection]r   r   rY   r   )rY   r_  rX   )rn  r1  r   r   rY   rZ   )r   r   r   r   r8  r   rY   r,   )N
__future__r   loggingr   r   r   sysr=   r   
contextlibr   r   typingr   r   r   r	   r
   r   weakrefr   _apir   r   r   r   r   r   _errorr   collections.abcr   r   	_typeshedr   version_infor   typing_extensions	getLoggerr   r3   getpidr   implementationnamer   hasattrr#   r1  bytesPathLiker   r,   typer   r$   tupler%   r&   r(   localr*   r7   r9   r\   r^   r   r   r   r   rF  r   rl  ro  r:  addaudithookr    __all__r.   r5   r6   <module>r     s[   "  	   
   / K K '  3 
7"*!(!2!2:!>	 >$&II	! -**//69+ 9B"#k(:(:(?(?9(LkQTQaQadkQk +  %K"++c""R[[%77%?#EWM_M_H``cgg i   %S#X 9 . &7 
 6') * )y  %=$> E >' '< ./ E /,6 ,6^ 34 5 4$',, $NA2 A2HZ$0 Z$z . .+
,
$ ( ) ' ( ] #&'
2!""'FG r5   