
    @(i                        S r SSKJr  SSKrSSKrSSKJr  SSKJr  SSK	r	SSK
r
SSKJr  \(       a  SSKJr  SS	KJr  \R"                  " \5      rS
rSr\ " S S5      5       rSS jr " S S5      rg)zf
Cache suitable for shards, not allowed to change because they are named
after their own sha256 hash.
    )annotationsN)	dataclass)TYPE_CHECKING)unlink_or_rename_to_trash)Path   )	ShardDictzrepodata_shards.dbi   c                  >    \ rS rSr% S
S jrS\S'   S\S'   S\S'   Srg	)AnnotatedRawShard   urlstrpackagecompressed_shardbytesc                H    SU;   d   eSU;  d   eXl         X l        X0l        g )Nz://)r   r   r   )selfr   r   r   s       Z/data/cameron/miniconda/lib/python3.13/site-packages/conda_libmamba_solver/shards_cache.py__init__AnnotatedRawShard.__init__!   s,    ||G### 0    )r   r   r   N)r   r   r   r   r   r   )__name__
__module____qualname____firstlineno__r   __annotations____static_attributes__ r   r   r   r      s    1 
HLr   r   c                |    [         R                  " U SS9n[         R                  Ul        UR	                  S5        U$ )ze
Get database connection.

dburi: uri-style sqlite database filename; accepts certain ?= parameters.
T)urizPRAGMA foreign_keys = ON)sqlite3connectRowrow_factoryexecute)dburiconns     r   r"   r"   /   s2     ??5d+D{{DLL+,Kr   c                  `    \ rS rSrSrSSS jjrS rSS jrSS jrSS jr	SS jr
S	 rS
 rSrg)
ShardCache;   zA
Handle caching for individual shards (not the index of shards).
c                0    Xl         U R                  5         g)z0
base: directory and filename prefix for cache.
N)baser"   )r   r,   creates      r   r   ShardCache.__init__@   s     	r   c                *    [        U R                  SS9$ )z5
Copy cache with new connection. Useful for threads.
F)r-   )r)   r,   r   s    r   copyShardCache.copyG   s     $))E22r   c                    U R                   [        -  R                  5       n[        U5      U l        U(       d  gU R                  R                  S5        g)z8
Args:
    create: if True, create table if not exists.
NzCREATE TABLE IF NOT EXISTS shards (url TEXT PRIMARY KEY, package TEXT, shard BLOB, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP))r,   SHARD_CACHE_NAMEas_urir"   r'   r%   )r   r-   r&   s      r   r"   ShardCache.connectM   sF    
 --557EN	 			=	
r   c                    U R                    nUR                  SUR                  UR                  UR                  45        SSS5        g! , (       d  f       g= f)zd
Args:
    url: of shard
    package: package name
    raw_shard: msgpack.zst compressed shard data
zCINSERT OR IGNORE INTO SHARDS (url, package, shard) VALUES (?, ?, ?)N)r'   r%   r   r   r   )r   	raw_shardcs      r   insertShardCache.insert^   s@     YY!IIU	 1 193M3MN YYs   4A


Ac                   U R                    nUR                  SU45      R                  5       nU(       a0  [        R                  " [
        R                  " US   [        S95      OS  sS S S 5        $ ! , (       d  f       g = f)Nz&SELECT shard FROM shards WHERE url = ?shardmax_output_size)r'   r%   fetchonemsgpackloads	zstandard
decompressZSTD_MAX_SHARD_SIZE)r   r   r9   rows       r   retrieveShardCache.retrievem   sc    YY!))DsfMVVXC
  ((WGZ[  YYs   AA22
B c                   U(       d  0 $ [         R                  " 5       nSSR                  S[        U5      -  5       S3nU R                   nUR                  X15       Vs0 s H;  nUS   U(       a+  [        R                  " UR                  US   [        S95      OS_M=     nnUsSSS5        $ s  snf ! , (       d  f       g= f)	zt
Query database for cached shard urls.

Return a dict of urls in cache mapping to the Shard or None if not present.
z,SELECT url, shard FROM shards WHERE url IN (,)?z) ORDER BY urlr   r=   r>   N)
rC   ZstdDecompressorjoinlenr'   r%   rA   rB   rD   rE   )r   urlsdctxqueryr9   rF   results          r   retrieve_multipleShardCache.retrieve_multiplex   s     I ))+>sxxQTUYQZHZ?[>\\jkYY! 99U13 2C E
  $MMOOCLBUOV 	
 2  3  Y3 Ys   B4 AB/"B4/B44
Cc                r    U R                    nUR                  S5        SSS5        g! , (       d  f       g= f)z8
Truncate the database by removing all rows from tables
zDELETE FROM shardsN)r'   r%   )r   r9   s     r   clear_cacheShardCache.clear_cache   s$     YY!II*+ YYs   (
6c                    U R                   R                  5         [        [        U R                  [
        -  5      5        g)z$
Remove the sharded cache database.
N)r'   closer   r   r,   r4   r0   s    r   remove_cacheShardCache.remove_cache   s)     			!#dii2B&B"CDr   )r,   r'   N)T)r,   r   )r8   r   )returnzShardDict | None)rO   z	list[str]r\   zdict[str, ShardDict | None])r   r   r   r   __doc__r   r1   r"   r:   rG   rS   rV   rZ   r   r   r   r   r)   r)   ;   s0    3
"	2,Er   r)   )zcache.db)r]   
__future__r   loggingr!   dataclassesr   typingr   rA   rC   conda.gateways.disk.deleter   pathlibr   shards_typingr	   	getLoggerr   logr4   rE   r   r"   r)   r   r   r   <module>rg      su   
 #   !     @(!'      	dE dEr   