
    OOIdg              	          d dl Z d dlZd dlZ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	  ej
        d          Z G d de          Z G d de          Z G d d	e          Z G d
 de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d d          Z G d de          ZdeiZddZeeeeeeeeef	D ]Z ee           dS )    N)ThreadPoolExecutorfsspecc                   "    e Zd ZdZdZd Zd ZdS )	BaseCacheag  Pass-though cache: doesn't keep anything, calls every time

    Acts as base class for other cachers

    Parameters
    ----------
    blocksize: int
        How far to read ahead in numbers of bytes
    fetcher: func
        Function of the form f(start, end) which gets bytes from remote as
        specified
    size: int
        How big this file is
    nonec                 0    || _         || _        || _        d S N)	blocksizefetchersize)selfr
   r   r   s       .lib/python3.11/site-packages/fsspec/caching.py__init__zBaseCache.__init__    s    "			    c                 n    |d}|| j         }|| j         k    s||k    rdS |                     ||          S Nr   r   )r   r   )r   startstops      r   _fetchzBaseCache._fetch%   sF    =E<9DDI$3||E4(((r   N)__name__
__module____qualname____doc__namer   r    r   r   r   r      sC          D  
) ) ) ) )r   r   c                   @     e Zd ZdZdZd	 fd	Zd Zd Zd Zd Z	 xZ
S )
	MMapCachezmemory-mapped sparse file cache

    Opens temporary file, which is filled blocks-wise when data is requested.
    Ensure there is enough disc space in the temporary location.

    This cache method might only work on posix
    mmapNc                     t                                          |||           |t                      n|| _        || _        |                                 | _        d S r	   )superr   setblockslocation	_makefilecache)r   r
   r   r   r#   r"   	__class__s         r   r   zMMapCache.__init__:   sN    GT222%~ceee6 ^^%%


r   c                 H   dd l }dd l}| j        dk    rt                      S | j        $t
          j                            | j                  s| j        (|                                }t                      | _
        nt          j        | j        d          }|                    | j        dz
             |                    d           |                                 nt          j        | j        d          }|                     |                                | j                  S )Nr   zwb+      1zrb+)r   tempfiler   	bytearrayr#   ospathexistsTemporaryFiler!   r"   ioopenseekwriteflushfileno)r   r   r*   fds       r   r$   zMMapCache._makefile@   s    9>>;; = t}(E(E }$++--!eeWT]E22GGDIM"""HHTNNNHHJJJJ..Byydi000r   c                 B    t                               d| d|            |d}| j        }| j        k    s||k    rdS | j        z  }| j        z  } fdt	          ||dz             D             }|r|                    d          }| j        z  }t          | j        z    j                  }t                               d| d| d|                                 ||           j        ||<    j	        
                    |           | j        ||         S )	NzMMap cache fetching -r   r   c                 &    g | ]}|j         v|S r   )r"   ).0ir   s     r   
<listcomp>z$MMapCache._fetch.<locals>.<listcomp>`   s%    UUUa@T@T@T@T@Tr   r(   zMMap get block #z ()loggerdebugr   r
   rangepopminr   r%   r"   add)	r   r   endstart_block	end_blockneedr;   sstartsends	   `        r   r   zMMapCache._fetchV   sL   9E99C99:::=E;)CDI#3t~-4>)	UUUU5i!m<<UUU 	 A'Fv.	::DLL@A@@@@$@@AAA&*ll64&@&@DJvd{#KOOA  	 z%)$$r   c                 >    | j                                         }|d= |S )Nr%   )__dict__copyr   states     r   __getstate__zMMapCache.__getstate__m   s!    ""$$'Nr   c                 l    | j                             |           |                                 | _        d S r	   )rJ   updater$   r%   rL   s     r   __setstate__zMMapCache.__setstate__s   s-    U###^^%%


r   )NN)r   r   r   r   r   r   r$   r   rN   rQ   __classcell__r&   s   @r   r   r   /   s          D& & & & & &1 1 1,% % %.  & & & & & & &r   r   c                   ,     e Zd ZdZdZ fdZd Z xZS )ReadAheadCachea!  Cache which reads only when we get beyond a block of data

    This is a much simpler version of BytesCache, and does not attempt to
    fill holes in the cache or keep fragments alive. It is best suited to
    many small reads in a sequential order (e.g., reading lines from a file).
    	readaheadc                 x    t                                          |||           d| _        d| _        d| _        d S )Nr   r   )r    r   r%   r   rC   r   r
   r   r   r&   s       r   r   zReadAheadCache.__init__   s8    GT222

r   c                 J   |d}||| j         k    r| j         }|| j         k    s||k    rdS ||z
  }|| j        k    r*|| j        k    r| j        || j        z
  || j        z
           S | j        |cxk    r| j        k     r4n n1| j        || j        z
  d          }|t	          |          z  }| j        }nd}t          | j         || j        z             }|                     ||          | _        || _        | j        t	          | j                  z   | _        || j        d |         z   S r   )r   r   rC   r%   lenrA   r
   r   )r   r   rC   lparts        r   r   zReadAheadCache._fetch   s9   =E;#	//)CDI#3%KDJ3$(??:edj033CCDDZ5++++48+++++:edj0223DTNAHEE D$)S4>122\\%--

:DJ/dj!n$$r   r   r   r   r   r   r   r   rR   rS   s   @r   rU   rU   y   sX          D    % % % % % % %r   rU   c                   ,     e Zd ZdZdZ fdZd Z xZS )FirstChunkCachezCaches the first block of a file only

    This may be useful for file types where the metadata is stored in the header,
    but is randomly accessed.
    firstc                 \    t                                          |||           d | _        d S r	   )r    r   r%   rX   s       r   r   zFirstChunkCache.__init__   s*    GT222


r   c                    |pd}|p| j         }|| j        k     r| j        _|| j        k    r4|                     d|          }|d | j                 | _        ||d          S |                     d| j                  | _        | j        ||         }|| j        k    r||                     | j        |          z  }|S |                     ||          S Nr   )r   r
   r%   r   )r   r   rC   datar\   s        r   r   zFirstChunkCache._fetch   s    
TY4>!!z!''<<3//D!%&6&6!7DJ<'!\\!T^<<
:eCi(DT^##T^S999K<<s+++r   r]   rS   s   @r   r_   r_      sX          D    , , , , , , ,r   r_   c                   V     e Zd ZdZdZd fd	Zd Zd Zd Zd Z	d	 Z
 fd
Zd Z xZS )
BlockCachea  
    Cache holding memory as a set of blocks.

    Requests are only ever made ``blocksize`` at a time, and are
    stored in an LRU cache. The least recently accessed block is
    discarded when more than ``maxblocks`` are stored.

    Parameters
    ----------
    blocksize : int
        The number of bytes to store in each block.
        Requests are only ever made for ``blocksize``, so this
        should balance the overhead of making a request against
        the granularity of the blocks.
    fetcher : Callable
    size : int
        The total size of the file being cached.
    maxblocks : int
        The maximum number of blocks to cache for. The maximum memory
        use for this cache is then ``blocksize * maxblocks``.
    
blockcache    c                     t                                          |||           t          j        ||z            | _        || _         t          j        |          | j                  | _	        d S r	   )
r    r   mathceilnblocks	maxblocks	functools	lru_cache_fetch_block_fetch_block_cachedr   r
   r   r   rm   r&   s        r   r   zBlockCache.__init__   sb    GT222y	!122"#A9#6y#A#A$BS#T#T   r   c                 N    d                     | j        | j        | j                  S )Nz.<BlockCache blocksize={}, size={}, nblocks={}>formatr
   r   rl   r   s    r   __repr__zBlockCache.__repr__   s'    ?FFNDIt|
 
 	
r   c                 4    | j                                         S z
        The statistics on the block cache.

        Returns
        -------
        NamedTuple
            Returned directly from the LRU Cache used internally.
        rq   
cache_inforv   s    r   r{   zBlockCache.cache_info        '22444r   c                     | j         }|d= |S )Nrq   rJ   rL   s     r   rN   zBlockCache.__getstate__   s    '(r   c                     | j                             |            t          j        |d                   | j                  | _        d S )Nrm   )rJ   rP   rn   ro   rp   rq   rL   s     r   rQ   zBlockCache.__setstate__   sH    U####J9#6u[7I#J#J$
 $
   r   c                     |d}|| j         }|| j         k    s||k    rdS || j        z  }|| j        z  }t          ||dz             D ]}|                     |           |                     ||||          S )Nr   r   r(   start_block_numberend_block_number)r   r
   r?   rq   _read_cache)r   r   rC   r   r   block_numbers         r   r   zBlockCache._fetch   s    =E;)CDI#3 #dn4$.0 ""46F6JKK 	3 	3L$$\22221-	   
 
 	
r   c                    || j         k    r(t          d                    || j                             || j        z  }|| j        z   }t                              d|           t                                          ||          }|S )=
        Fetch the block of data for `block_number`.
        ;'block_number={}' is greater than the number of blocks ({})zBlockCache fetching block %drl   
ValueErrorru   r
   r=   infor    r   )r   r   r   rC   block_contentsr&   s        r   rp   zBlockCache._fetch_block  s     $,&&MTT $,    t~-dn$2LAAAs33r   c                    || j         z  }|| j         z  }||k    r|                     |          }|||         S g }|                    |                     |          |d                    t          |dz   |          D ]*}	|                    |                     |	                     +|                    |                     |          d|                    d                    |          S z
        Read from our block cache.

        Parameters
        ----------
        start, end : int
            The start and end byte positions.
        start_block_number, end_block_number : int
            The start and end block numbers.
        Nr(   r   r
   rq   appendr?   join
r   r   rC   r   r   	start_posend_posblockoutr   s
             r   r   zBlockCache._read_cache$       DN*	&!111,,-?@@E7*++ CJJt//0BCCIJJOPPP
 !&&81&<>N O O C C

433LAABBBB JJt//0@AA(7(KLLL88C== r   rh   r   r   r   r   r   r   rw   r{   rN   rQ   r   rp   r   rR   rS   s   @r   rf   rf      s         , DU U U U U U
 
 

	5 	5 	5  

 
 

 
 
.    " !  !  !  !  !  !  !r   rf   c                   4     e Zd ZdZdZd fd	Zd Zd Z xZS )
BytesCacheaK  Cache which holds data in a in-memory bytes object

    Implements read-ahead by the block size, for semi-random reads progressing
    through the file.

    Parameters
    ----------
    trim: bool
        As we read more data, whether to discard the start of the buffer when
        we are more than a blocksize ahead of it.
    bytesTc                     t                                          |||           d| _        d | _        d | _        || _        d S )Nr   )r    r   r%   r   rC   trim)r   r
   r   r   r   r&   s        r   r   zBytesCache.__init__V  s?    GT222

			r   c                    |d}|| j         }|| j         k    s||k    rdS | j        <|| j        k    r1| j        *|| j        k     r|| j        z
  }| j        |||z   |z
           S | j        rt          | j         || j        z             }n|}||k    s|| j         k    rdS | j        || j        k     r5| j        || j        k    r#|                     ||          | _        || _        n|| j        k     rh| j        |z
  | j        k    r#|                     ||          | _        || _        n|                     || j                  }|| _        || j        z   | _        n||| j        k    rq| j        | j         k    rn`|| j        z
  | j        k    r#|                     ||          | _        || _        n*|                     | j        |          }| j        |z   | _        | j        t          | j                  z   | _        || j        z
  }| j        |||z   |z
           }| j        rT| j        | j        z
  | j        dz   z  }|dk    r4| xj        | j        |z  z  c_        | j        | j        |z  d          | _        |S )Nr   r   r(   )	r   r   rC   r%   r
   rA   r   rZ   r   )r   r   rC   offsetbendnewr   nums           r   r   zBytesCache._fetch]  s    =E;)CDI#3J"##$dh TZ'F:fv|e';;<<> 	ty#"677DDD5==EDI--3J%$*"4"4Hdh eT22DJDJJTZx#~..!\\%66
"

ll5$*55"
 4:-

DH__x$)##tx$.00!\\%66
"

ll48T22!Z#-
:DJ/#j&3,"6679 	@8dj(dnq.@ACQww

dns22

!Z(<(>(>?

r   c                 *    t          | j                  S r	   )rZ   r%   rv   s    r   __len__zBytesCache.__len__  s    4:r   )T)	r   r   r   r   r   r   r   r   rR   rS   s   @r   r   r   G  sm        
 
 D     ; ; ;z      r   r   c                   .     e Zd ZdZdZd fd	Zd Z xZS )AllBytesz!Cache entire contents of the fileallNc                     t                                          |||           ||                     d| j                  }|| _        d S rc   )r    r   r   r   rd   )r   r
   r   r   rd   r&   s        r   r   zAllBytes.__init__  sD    GT222<<<49--D			r   c                      | j         ||         S r	   )rd   )r   r   rC   s      r   r   zAllBytes._fetch  s    ys##r   )NNNNr]   rS   s   @r   r   r     sW        ++D     $ $ $ $ $ $ $r   r   c                   6     e Zd ZdZdZi df fd	Z fdZ xZS )KnownPartsOfAFilea  
    Cache holding known file parts.

    Parameters
    ----------
    blocksize: int
        How far to read ahead in numbers of bytes
    fetcher: func
        Function of the form f(start, end) which gets bytes from remote as
        specified
    size: int
        How big this file is
    data: dict
        A dictionary mapping explicit `(start, stop)` file-offset tuples
        with known bytes.
    strict: bool, default True
        Whether to fetch reads that go beyond a known byte-range boundary.
        If `False`, any read that ends outside a known part will be zero
        padded. Note that zero padding will not be used for reads that
        begin outside a known byte-range.
    partsTc                    t          t          |                               |||           || _        |rt	          t          |                                                    }|d         g}|                    |d                   g}	|dd          D ]\  }
}|d         \  }}|
|k    r-||f|d<   |	dxx         |                    |
|f          z  cc<   C|                    |
|f           |	                    |                    |
|f                     t          t          ||	                    | _        d S || _        d S )Nr   r(   )r    r   r   strictsortedlistkeysr@   r   dictziprd   )r   r
   r   r   rd   r   _old_offsetsoffsetsr"   r   r   start0stop0r&   s                 r   r   zKnownPartsOfAFile.__init__  sA   &&//	7DIII  	 diikk!2!233K"1~&Ghh{1~../F*122 ; ;t 'E>>#)4.GBK2JJJ$((E4="9"99JJJJNNE4=111MM$((E4="9"9::::S&1122DIIIDIIIr   c                     d}| j                                         D ]g\  \  }}}||cxk    r|k     rRn ||z
  }||||z   |z
           }| j        r||cxk    r|k    r"n n|d||z
  t          |          z
  z  z  }|c S |} nh| j        t          d||f d          t          j        d||f d           t          	                    d| d|            |t                                          ||          z   S )Nr       z&Read is outside the known file parts: z. z%. IO/caching performance may be poor!z!KnownPartsOfAFile cache fetching r8   )rd   itemsr   rZ   r   r   warningswarnr=   r>   r    r   )	r   r   r   r   loc0loc1rd   offr&   s	           r   r   zKnownPartsOfAFile._fetch  sp   "&)//"3"3 	 	LT4$ u####t#####dl3te!334{ dd&:&:&:&:d&:&:&:&:&:
 7dUlSXX&=>>CJJJ
 !EE $( <WudmWWWXXX 	3eT] 3 3 3	
 	
 	
 	GGGGGHHHUWW^^E40000r   r]   rS   s   @r   r   r     sl         , D68      ,#1 #1 #1 #1 #1 #1 #1 #1 #1r   r   c                   X    e Zd ZdZ ej        dg d          ZddZd Zd Z	d Z
d	 Zd
S )UpdatableLRUzg
    Custom implementation of LRU cache that allows updating keys

    Used by BackgroudBlockCache
    	CacheInfo)hitsmissesmaxsizecurrsize   c                     t          j                    | _        || _        || _        d| _        d| _        t          j                    | _	        d S rc   )
collectionsOrderedDict_cache_func	_max_size_hits_misses	threadingLock_lock)r   funcmax_sizes      r   r   zUpdatableLRU.__init__  sA    !-//
!
^%%


r   c                    | j         5  || j        v rC| j                            |           | xj        dz  c_        | j        |         cd d d            S 	 d d d            n# 1 swxY w Y    | j        | }| j         5  || j        |<   | xj        dz  c_        t          | j                  | j        k    r| j                            d           d d d            n# 1 swxY w Y   |S )Nr(   Flast)	r   r   move_to_endr   r   r   rZ   r   popitem)r   argsresults      r   __call__zUpdatableLRU.__call__  s   Z 	) 	)t{""''---

a

{4(		) 	) 	) 	) 	) 	) 	) 	)"	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) T"Z 	0 	0 &DKLLALL4;$.00###///		0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 s%   A A""A&)A&>ACC!$C!c                 V    | j         5  || j        v cd d d            S # 1 swxY w Y   d S r	   )r   r   )r   r   s     r   is_key_cachedzUpdatableLRU.is_key_cached&  sx    Z 	' 	'4;&	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	's   	""c                     | j         5  || j        |<   t          | j                  | j        k    r| j                            d           d d d            d S # 1 swxY w Y   d S )NFr   )r   r   rZ   r   r   )r   r   r   s      r   add_keyzUpdatableLRU.add_key*  s    Z 	0 	0 &DK4;$.00###///	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0s   AAAAc                     | j         5  |                     | j        t          | j                  | j        | j                  cd d d            S # 1 swxY w Y   d S )N)r   r   r   r   )r   r   r   rZ   r   r   r   rv   s    r   r{   zUpdatableLRU.cache_info0  s    Z 	 	>>T[))Z|	 "  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   :AAAN)r   )r   r   r   r   r   
namedtupler   r   r   r   r   r{   r   r   r   r   r     s          '&>>> I& & & &  "' ' '0 0 0    r   r   c                   X     e Zd ZdZdZd fd	Zd Zd Zd Zd Z	d	 Z
d fd	Zd Z xZS )BackgroundBlockCachea  
    Cache holding memory as a set of blocks with pre-loading of
    the next block in the background.

    Requests are only ever made ``blocksize`` at a time, and are
    stored in an LRU cache. The least recently accessed block is
    discarded when more than ``maxblocks`` are stored. If the
    next block is not in cache, it is loaded in a separate thread
    in non-blocking way.

    Parameters
    ----------
    blocksize : int
        The number of bytes to store in each block.
        Requests are only ever made for ``blocksize``, so this
        should balance the overhead of making a request against
        the granularity of the blocks.
    fetcher : Callable
    size : int
        The total size of the file being cached.
    maxblocks : int
        The maximum number of blocks to cache for. The maximum memory
        use for this cache is then ``blocksize * maxblocks``.
    
backgroundrh   c                 >   t                                          |||           t          j        ||z            | _        || _        t          | j        |          | _        t          d          | _
        d | _        d | _        t          j                    | _        d S )Nr(   max_workers)r    r   rj   rk   rl   rm   r   rp   rq   r   _thread_executor_fetch_future_block_number_fetch_futurer   r   _fetch_future_lockrr   s        r   r   zBackgroundBlockCache.__init__V  s    GT222y	!122"#/0A9#M#M  2q A A A*.'!"+."2"2r   c                 N    d                     | j        | j        | j                  S )Nz8<BackgroundBlockCache blocksize={}, size={}, nblocks={}>rt   rv   s    r   rw   zBackgroundBlockCache.__repr__a  s'    IPPNDIt|
 
 	
r   c                 4    | j                                         S ry   rz   rv   s    r   r{   zBackgroundBlockCache.cache_infof  r|   r   c                 2    | j         }|d= |d= |d= |d= |d= |S )Nrq   r   r   r   r   r~   rL   s     r   rN   z!BackgroundBlockCache.__getstate__q  s:    '($%.//"&'r   c                     | j                             |           t          | j        |d                   | _        t          d          | _        d | _        d | _        t          j
                    | _        d S )Nrm   r(   r   )rJ   rP   r   rp   rq   r   r   r   r   r   r   r   rL   s     r   rQ   z!BackgroundBlockCache.__setstate__z  sk    U####/0A5CU#V#V  2q A A A*.'!"+."2"2r   c                 D   |d}|| j         }|| j         k    s||k    rdS || j        z  }|| j        z  }d }d }| j        5  | j        | j                                        r`t
                              d           | j                            | j        	                                | j
                   d | _
        d | _        n@t          || j
        cxk    o|k    nc           }|r| j
        }| j        }d | _
        d | _        d d d            n# 1 swxY w Y   |Gt
                              d           | j                            |	                                |           t          ||dz             D ]}|                     |           |dz   }	| j        5  | j        R|	| j        k    rG| j                            |	          s-|	| _
        | j                            | j        |	d          | _        d d d            n# 1 swxY w Y   |                     ||||          S )Nr   r   z3BlockCache joined background fetch without waiting.z(BlockCache waiting for background fetch.r(   asyncr   )r   r
   r   r   doner=   r   rq   r   r   r   boolr?   rl   r   r   submitrp   r   )
r   r   rC   r   r   fetch_future_block_numberfetch_future	must_joinr   end_block_plus_1s
             r   r   zBackgroundBlockCache._fetch  s   =E;)CDI#3 #dn4$.0$(!$ 	2 	2!-%**,, 2KK UVVV,44*1133T5T   7;D3)-D&& !%*:, , , ,+, , , ,! !I
 ! 2 594S1'+'9 ;?7-1*5	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2: #KKBCCC$,,##%%'@  
 ""46F6JKK 	3 	3L$$\2222 ,a/$ 		 		"*$440>>?OPP 5 3C/%)%:%A%A%'7& &"		 		 		 		 		 		 		 		 		 		 		 		 		 		 		 1-	   
 
 	
s&    CDDDAG>>HHsyncc                    || j         k    r(t          d                    || j                             || j        z  }|| j        z   }t                              d||           t                                          ||          }|S )r   r   z!BlockCache fetching block (%s) %dr   )r   r   log_infor   rC   r   r&   s         r   rp   z!BackgroundBlockCache._fetch_block  s     $,&&MTT $,    t~-dn$7<PPPs33r   c                    || j         z  }|| j         z  }||k    r|                     |          }|||         S g }|                    |                     |          |d                    t          |dz   |          D ]*}	|                    |                     |	                     +|                    |                     |          d|                    d                    |          S r   r   r   s
             r   r   z BackgroundBlockCache._read_cache  r   r   r   )r   r   rS   s   @r   r   r   :  s         2 D	3 	3 	3 	3 	3 	3
 
 

	5 	5 	5  3 3 3I
 I
 I
V     " !  !  !  !  !  !  !r   r   Fc                 ~    | j         }|s)|t          v r t          d|dt          |                    | t          |<   dS )z'Register' cache implementation.

    Parameters
    ----------
    clobber: bool, optional
        If set to True (default is False) - allow to overwrite existing
        entry.

    Raises
    ------
    ValueError
    zCache with name z is already known: N)r   cachesr   )clsclobberr   s      r   register_cacher    sL     8D Wtv~~UDUUvd|UUVVVF4LLLr   )F)r   rn   r0   loggingrj   r,   r   r   concurrent.futuresr   	getLoggerr=   objectr   r   rU   r_   rf   r   r   r   r   r   r  r  cr   r   r   <module>r     s           				   				      1 1 1 1 1 1		8	$	$) ) ) ) ) ) ) )BG& G& G& G& G&	 G& G& G&T'% '% '% '% '%Y '% '% '%T, , , , ,i , , ,>B! B! B! B! B! B! B! B!JT T T T T T T Tn$ $ $ $ $y $ $ $R1 R1 R1 R1 R1	 R1 R1 R1j5 5 5 5 5 5 5 5pD! D! D! D! D!9 D! D! D!R 	)
   ( 

  A N1 r   