
    i5                         S 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5      r	 " S S\	5      r
 " S	 S
5      rSS jrSS jqS rS rS r\" 5         g)zFDecorators to keep function results in an in-memory and database cache    N   )configutilc                   :    \ rS rSrSrS rS rS rS rS
S jr	Sr
g	)CacheDecorator   zSimplified in-memory cachec                 *    Xl         0 U l        X l        g N)funccachekeyarg)selfr   r   s      =/app/mltbenv/lib/python3.13/site-packages/gallery_dl/cache.py__init__CacheDecorator.__init__   s    	
    c                 D    [         R                  " U R                  U5      $ r
   	functoolspartial__call__)r   instanceclss      r   __get__CacheDecorator.__get__   s      99r   c                     U R                   c  SOXR                      n U R                  U   nU$ ! [         a$    U R                  " U0 UD6=o@R                  U'    U$ f = f)N )r   r   KeyErrorr   )r   argskwargskeyvalues        r   r   CacheDecorator.__call__   si    KK'bT++->	AJJsOE   	A&*ii&@&@@EJJsO	As   0 *AAc                      X R                   U'   g r
   r   r   r!   r"   s      r   updateCacheDecorator.update%   s    

3r   c                 @     U R                   U	 g ! [         a     g f = fr
   )r   r   )r   r!   s     r   
invalidateCacheDecorator.invalidate(   s$    	

3 		s    
)r   r   r   N)r   )__name__
__module____qualname____firstlineno____doc__r   r   r   r'   r*   __static_attributes__ r   r   r   r      s    $
: r   r   c                   *    \ rS rSrSrS rS rS rSrg)MemoryCacheDecorator/   zIn-memory cachec                 <    [         R                  XU5        X0l        g r
   )r   r   maxager   r   r   r7   s       r   r   MemoryCacheDecorator.__init__1   s    F3r   c                 .   U R                   c  SOXR                      n[        [        R                  " 5       5      n U R                  U   u  pVXd::  a0  U R
                  " U0 UD6nX@R                  -   nXV4U R                  U'   W$ ! [         a    Sn NEf = f)Nr   r   )r   inttimer   r   r   r7   )r   r   r    r!   	timestampr"   expiress          r   r   MemoryCacheDecorator.__call__5   s    KK'bT++->		$		!ZZ_NE IIt.v.E++-G#nDJJsO  	G	s   B BBc                 x    U[        [        R                  " 5       5      U R                  -   4U R                  U'   g r
   )r;   r<   r7   r   r&   s      r   r'   MemoryCacheDecorator.updateB   s(    TYY[!1DKK!??

3r   )r7   N)	r,   r-   r.   r/   r0   r   r   r'   r1   r2   r   r   r4   r4   /   s    @r   r4   c                   D    \ rS rSrSrSrSrS rS rS r	S r
S	 rS
 rSrg)DatabaseCacheDecoratorF   zDatabase cacheNTc                 v    UR                    SUR                   3U l        Xl        0 U l        X l        X0l        g )N.)r-   r,   r!   r   r   r   r7   r8   s       r   r   DatabaseCacheDecorator.__init__K   s3    oo&a7	
r   c                 D    [         R                  " U R                  U5      $ r
   r   )r   objobjtypes      r   r   DatabaseCacheDecorator.__get__R   s      44r   c                    U R                   c  SOXR                      n[        [        R                  " 5       5      n U R                  U   u  pVXd:  a  U$  U R
                   SU 3nU R                  5        nUR                  5       n	 U	R                  S5        U	R                  SU45        U	R                  5       n
U
(       a$  U
S   U:  a  U
u  pV[        R                  " U5      nOIU R                  " U0 UD6nX@R                  -   nU	R                  SU[        R                   " U5      U45        S S S 5        WW4U R                  U'   U$ ! [         a     GNf = f! [        R                   a     Nf = f! , (       d  f       NL= f)Nr   -zBEGIN EXCLUSIVEz3SELECT value, expires FROM data WHERE key=? LIMIT 1r   *INSERT OR REPLACE INTO data VALUES (?,?,?))r   r;   r<   r   r   r!   databasecursorexecutesqlite3OperationalErrorfetchonepickleloadsr   r7   dumps)r   r   r    r!   r=   r"   r>   fullkeydbrP   results              r   r   DatabaseCacheDecorator.__call__U   se   KK'bT++->		$		!ZZ_NE" # XXJau%]]_YY[F01 NNE
 __&F&)i/!'U+		4262#kk1@fll517;% .  .

3;  		 ++ 	 _sB   E 7E7	EBE7
EEE41E73E44E77
Fc                 >   [        [        R                  " 5       5      U R                  -   nX#4U R                  U'   U R	                  5        nUR                  SU R                   SU 3[        R                  " U5      U45        S S S 5        g ! , (       d  f       g = f)NrN   rM   )	r;   r<   r7   r   rO   rQ   r!   rU   rW   )r   r!   r"   r>   rY   s        r   r'   DatabaseCacheDecorator.update}   sp    diik"T[[0.

3]]_JJ<HH:Qse$fll5&97C __s   9B
Bc                      U R                   U	 U R                  5        nUR                  SU R                   SU 345        S S S 5        g ! [         a     NHf = f! , (       d  f       g = f)NzDELETE FROM data WHERE key=?rM   )r   r   rO   rQ   r!   )r   r!   rY   s      r   r*   !DatabaseCacheDecorator.invalidate   sd    	

3 ]]_JJ.HH:Qse$& _  		_s   A #A
AA
A)c                     U R                   (       a&  U R                  R                  S5        S[        l         U R                  $ )NzSCREATE TABLE IF NOT EXISTS data (key TEXT PRIMARY KEY, value TEXT, expires INTEGER)F)_initrY   rQ   rC   )r   s    r   rO   DatabaseCacheDecorator.database   s3    ::GGOOF ,1"(wwr   )r   r   r!   r   r7   )r,   r-   r.   r/   r0   rY   ra   r   r   r   r'   r*   rO   r1   r2   r   r   rC   rC   F   s.    	BE5&P	r   rC   c                 6   ^ ^ T (       a	  UU 4S jnU$ U4S jnU$ )Nc                    > [        U TT5      $ r
   )r4   r   r   r7   s    r   wrapmemcache.<locals>.wrap   s    'ff==r   c                    > [        U T5      $ r
   )r   )r   r   s    r   rf   rg      s    !$//r   r2   r7   r   rf   s   `` r   memcacherj      s    	>
 K	0Kr   c                    ^ ^ UU 4S jnU$ )Nc                    > [        U TT5      $ r
   )rC   re   s    r   rf   cache.<locals>.wrap   s    %dFF;;r   r2   ri   s   `` r   r   r      s    <Kr   c                 l   [         R                  nU(       d  gSnUR                  5       n U S:X  a  UR                  S5        O!UR                  SU R	                  5       45        UR
                  nUR                  5         U(       a  UR                  S5        U$ ! [        R                   a     U$ f = f)z$Delete database entries for 'module'Nr   ALLzDELETE FROM datazDDELETE FROM data WHERE key LIKE 'gallery_dl.extractor.' || ? || '.%'VACUUM)	rC   rY   rP   rQ   lowerrowcountcommitrR   rS   )modulerY   rr   rP   s       r   clearru      s    		"	"BHYY[F%U?NN-.NNF! ??
		NN8$O ##  Os   9B B32B3c                     [         R                  " SS[        R                  5      n U [        R                  La  [        R                  " U 5      $ [        R
                  (       a!  [        R                  R                  SS5      nO [        R                  R                  SS5      n[        R                  " [        R                  R                  US5      5      n[        R                  " USS	9  [        R                  R                  US
5      $ )Nr%   fileAPPDATA~XDG_CACHE_HOMEz~/.cachez
gallery-dlT)exist_okzcache.sqlite3)r   getr   SENTINELexpand_pathWINDOWSosenvironpathjoinmakedirs)r   cachedirs     r   _pathr      s    ::j&$--8D4== %%||::>>)S1::>>"2J?X| DEHKK4(77<</22r   c                  D    [        5       n [        R                  " [        R                  " U [        R                  [        R
                  -  S5      5        [        R                  " U SSS9[        l	        g ! [        [        [        R                  4 a	    [        q g f = f)Ni  <   F)timeoutcheck_same_thread)r   r   closeopenO_CREATO_RDONLYrR   connectrC   rY   OSError	TypeErrorrS   rj   r   )dbfiles    r   ra   ra      sp    
 	bkk!95AB$+OOB%%9!Y 8 89 s   A4A7 7%BB)NN)i  N)r0   rR   rU   r<   r   r   r   r   r   r   r4   rC   rj   r   ru   r   ra   r2   r   r   <module>r      sb    M    	   8@> @.R Rj83 r   