o
    rqi!2                     @   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mZ d dlmZ d dlmZ e Zeed  dkZ	 G d	d
 d
eZG dd deZdS )    N)movermtree)Dict)	FILE_HASH)MODELSCOPE_ENABLE_DEFAULT_HASH_VALIDATION)compute_hash)
get_loggerFalsetruec                   @   st   e Zd ZdZdZdZdZ	 defddZdd	 Z	d
d Z
dd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )FileSystemCachez.mscz.mdlidz.mvcache_root_locationc                 K   s*   t  | _tj|dd || _|   dS )zBase file system cache interface.

        Args:
            cache_root_location (str): The root location to store files.
            kwargs(dict): The keyword arguments.
        Texist_okN)	threadingRLock_cache_lockosmakedirsr   
load_cache)selfr   kwargs r   c/home/app/PaddleOCR-VL/.venv_paddleocr/lib/python3.10/site-packages/modelscope/hub/utils/caching.py__init__    s   
zFileSystemCache.__init__c                 C   s   | j S N)r   r   r   r   r   get_root_location1   s   z!FileSystemCache.get_root_locationc                 C   sd   g | _ tj| jtj}tj|r0t|d}t	
|| _ W d    d S 1 s)w   Y  d S d S )Nrb)cached_filesr   pathjoinr   r   KEY_FILE_NAMEexistsopenpickleload)r   cache_keys_file_pathfr   r   r   r   4   s   
"zFileSystemCache.load_cachec                 C   s   | j e tj| jtj}tjd| jd\}}z$t	|d}t
| j| W d   n1 s0w   Y  t|| W n$ ty_   zt| W n	 tyR   Y nw tj|r^t|  w W d   dS 1 skw   Y  dS )a  
        Save cache metadata in order to verify that the cached content is consistent with the remote content.

        Example of the cached content:
            [{'Path': 'configuration.json', 'Revision': 'f01dxxx'}, {'Path': 'model.bin', 'Revision': '1159xxx'}, ...]
        z.tmp)suffixdirwbN)r   r   r    r!   r   r   r"   tempfilemkstempfdopenr%   dumpr   r   	ExceptioncloseOSErrorr#   unlink)r   r'   fdZtemp_filenamer(   r   r   r   save_cached_files<   s0   


"z!FileSystemCache.save_cached_filesc                 C      dS )zCheck the key is in the cache, if exist, return the file, otherwise return None.

        Args:
            key(str): The cache key.

        Raises:
            None
        Nr   r   keyr   r   r   get_fileV   s   	zFileSystemCache.get_filec                 C   r6   )zPut file to the cache.

        Args:
            key (str): The cache key
            location (str): Location of the file, we will move the file to cache.

        Raises:
            None
        Nr   )r   r8   locationr   r   r   put_filea   s   
zFileSystemCache.put_filec                 C   s&   || j v r| j | |   dS dS )zvRemove cache key in index, The file is removed manually

        Args:
            key (dict): The cache key.
        N)r   remover5   r7   r   r   r   
remove_keym   s   
zFileSystemCache.remove_keyc                 C   s   | j D ]	}||kr dS qdS )NTF)r   )r   r8   Z
cache_filer   r   r   r#   w   s
   
zFileSystemCache.existsc                 C   s   t | j |   dS )zRemove all files and metadata from the cache
        In the case of multiple cache locations, this clears only the last one,
        which is assumed to be the read/write one.
        N)r   r   r   r   r   r   r   clear_cache~   s   
zFileSystemCache.clear_cachec                 C   s   t |  S r   )hashlibsha256encode	hexdigestr7   r   r   r   	hash_name   s   zFileSystemCache.hash_nameN)__name__
__module____qualname__r"   MODEL_META_FILE_NAMEMODEL_META_MODEL_IDMODEL_VERSION_FILE_NAMEstrr   r   r   r5   r9   r;   r=   r#   r>   rC   r   r   r   r   r      s$    

r   c                       s   e Zd ZdZd fdd	Zdd Zdd Zd	efd
dZdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Z  ZS )ModelFileSystemCachezLocal cache file layout
       cache_root/owner/model_name/individual cached files and cache index file '.mcs'
       Save only one version for each file.
    Nc                    sp   |du s|du rt  tj| |   nt  tj||| tjd||f i| _| 	  | 
 | _dS )a\  Put file to the cache
        Args:
            cache_root(`str`): The modelscope local cache root(default: ~/.cache/modelscope/hub)
            owner(`str`): The model owner.
            name('str'): The name of the model
        Returns:
        Raises:
            None
        <Tip>
            model_id = {owner}/{name}
        </Tip>
        Nz%s/%s)superr   r   r    r!   load_model_metar   rH   
model_metasave_model_metaload_model_versionZcached_model_revision)r   Z
cache_rootownername	__class__r   r   r      s   
zModelFileSystemCache.__init__c                 C   sj   t j| jtj}t j|r-t|d}t	|| _
W d    d S 1 s&w   Y  d S tjdi| _
d S )Nr   unknown)r   r    r!   r   r   rG   r#   r$   r%   r&   rN   rH   r   Zmeta_file_pathr(   r   r   r   rM      s   
"z$ModelFileSystemCache.load_model_metac                 C   s\   t j| jtj}t j|r,t|d}| 	 W  d    S 1 s%w   Y  d S d S )Nr)
r   r    r!   r   r   rI   r#   r$   readstrip)r   model_version_file_pathr(   r   r   r   rP      s   
$z'ModelFileSystemCache.load_model_versionrevision_infoc                 C   s   t j| jtj}t|d+}t|tr$d|d |d f }|	| n|	| W d    d S W d    d S 1 s<w   Y  d S )NwzRevision:%s,CreatedAt:%sRevisionZ	CreatedAt)
r   r    r!   r   r   rI   r$   
isinstancedictwrite)r   r[   rZ   r(   Zversion_info_strr   r   r   save_model_version   s   
"z'ModelFileSystemCache.save_model_versionc                 C   s   | j tj S r   )rN   r   rH   r   r   r   r   get_model_id   s   z!ModelFileSystemCache.get_model_idc                 C   sP   t j| jtj}t|d}t| j	| W d    d S 1 s!w   Y  d S )Nr+   )
r   r    r!   r   r   rG   r$   r%   r/   rN   rV   r   r   r   rO      s   
"z$ModelFileSystemCache.save_model_metac                 C   sN   | j D ]!}||d kr$tj| j|d }tj|r|  S | | qdS )zRetrieve the cache if there is file match the path.

        Args:
            file_path (str): The file path in the model.

        Returns:
            path: the full path of the file.
        PathN)r   r   r    r!   r   r#   r=   )r   	file_pathcached_filecached_file_pathr   r   r   get_file_by_path   s   
	

z%ModelFileSystemCache.get_file_by_pathc                 C   sj   | j D ]/}||d kr2|d |s||d r2tj| j|d }tj|r-|  S | | qdS )zRetrieve the cache if there is file match the path.

        Args:
            file_path (str): The file path in the model.
            commit_id (str): The commit id of the file

        Returns:
            path: the full path of the file.
        rc   r]   N)r   
startswithr   r    r!   r   r#   r=   )r   rd   	commit_idre   rf   r   r   r   get_file_by_path_and_commit_id   s   



z3ModelFileSystemCache.get_file_by_path_and_commit_idc                 C   sZ   |  |}| jD ]"}||kr*tj| j|d }tj|r"|  S | |  dS qdS )zCheck if exist cache file.

        Args:
            model_file_info (ModelFileInfo): The file information of the file.

        Returns:
            str: The file path.
        rc   N)$_ModelFileSystemCache__get_cache_keyr   r   r    r!   r   r#   r=   )r   model_file_info	cache_keyre   	orig_pathr   r   r   get_file_by_info   s   
	


	z%ModelFileSystemCache.get_file_by_infoc                 C   s   |d |d d}|S )Nrc   r]   )rc   r]   r   )r   rl   rm   r   r   r   Z__get_cache_key  s   z$ModelFileSystemCache.__get_cache_keyc           	      C   s   |  |}d}|d }tj| j|d }| jD ]B}|d |krZ|d |d s2|d |d rZ|t }|durZtj|rZt	rGt
|}n|}||krQd} n
td| d q|rjtj|redS | | dS )a  Check the file is cached or not. Note existence check will also cover digest check

        Args:
            model_file_info (CachedFileInfo): The cached file info

        Returns:
            bool: If exists and has the same hash, return True otherwise False
        Frc   r]   NTzFile [z?] exists in cache but with a mismatched hash, will re-download.)rk   r   r    r!   r   r   rh   r   r#   enable_default_hash_validationr   loggerinfor=   )	r   rl   r8   Z	is_existsrd   Zcache_file_pathZ
cached_keyZexpected_hashZcache_file_sha256r   r   r   r#     sB   
	



zModelFileSystemCache.existsc                 C   sZ   | j D ]'}|d |d kr*| | tj| j|d }tj|r't|  dS qdS )zWe in cache, remove it.

        Args:
            model_file_info (ModelFileInfo): The model file information from server.
        rc   N)r   r=   r   r    r!   r   r#   r<   )r   rl   re   rd   r   r   r   remove_if_exists?  s   



z%ModelFileSystemCache.remove_if_existsc                 C   sp   |  | | |}tj| j|d }tj|}tj|s'tj|dd t	|| | j
| |   |S )a[  Put model on model_file_location to cache, the model first download to /tmp, and move to cache.

        Args:
            model_file_info (str): The file description returned by get_model_files.
            model_file_location (str): The location of the temporary file.

        Returns:
            str: The location of the cached file.
        rc   Tr   )rs   rk   r   r    r!   r   dirnamer#   r   r   r   appendr5   )r   rl   Zmodel_file_locationrm   Zcache_full_pathZcache_file_dirr   r   r   r;   N  s   



zModelFileSystemCache.put_file)NN)rD   rE   rF   __doc__r   rM   rP   r   ra   rb   rO   rg   rj   ro   rk   r#   rs   r;   __classcell__r   r   rS   r   rK      s    		)rK   )r?   r   r%   r,   r   shutilr   r   typingr   Zmodelscope.hub.constantsr   r   Zmodelscope.hub.utils.utilsr   Zmodelscope.utils.loggerr   rq   getenvrY   lowerrp   objectr   rK   r   r   r   r   <module>   s    r