
    ib                        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
\(       a  SSKJr  SSKJr  \R                  " \5      rS	q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)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       \/home/wildlama/miniconda3/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 nUR	                  S5        SSS5        U$ ! , (       d  f       U$ = f)ze
Get database connection.

dburi: uri-style sqlite database filename; accepts certain ?= parameters.
T)urizPRAGMA foreign_keys = ONN)sqlite3connectRowrow_factoryexecute)dburiconncs      r   r!   r!   .   sI     ??5d+D{{D				,- 
K 
Ks   A		
Ac                  r    \ rS rSrSrSSS jjrS rS rS 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                .    Xl         U R                  US9  g)z0
base: directory and filename prefix for cache.
createN)baser!   )r   r.   r-   s      r   r   ShardCache.__init__@   s     	F#r   c                    U $ Nr   r   s    r   	__enter__ShardCache.__enter__G   s    r   c                $    U R                  5         g r1   )close)r   exc_typeexc_valexec_tbs       r   __exit__ShardCache.__exit__J   s    

r   c                j    U R                   (       a"  U R                   R                  5         SU l         gg)zF
Clean up connection. ShardCache can no longer be used after close().
N)r&   r6   r2   s    r   r6   ShardCache.closeM   s%     99IIOODI r   c                *    [        U R                  SS9$ )z5
Copy cache with new connection. Useful for threads.
Fr,   )r)   r.   r2   s    r   copyShardCache.copyU   s     $))E22r   c                h   U R                   [        -  R                  5       n[        U5      U l        U(       d  g U R                   nUR                  S5        SSS5        g! , (       d  f       g= f! [        R                   a  n[        US5      nU(       a  U(       a  UR                  [        R                  :X  al  [        R                  SX55         U R                  5         O/! [         a"  n[        R                  SX55        Sq SnAOSnAff = fU R                  USS9s SnA$ e SnAff = f)	zr
Args:
    create: if True, create table if not exists.
    retry: remove cache, log warning, and retry on error.
NzCREATE TABLE IF NOT EXISTS shards (url TEXT PRIMARY KEY, package TEXT, shard BLOB, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP)sqlite_errorcodez%s '%s'; remove and retry.z %s '%s'; use alternate filename.zrepodata_shards_1.dbF)r-   retry)r.   SHARD_CACHE_NAMEas_urir!   r&   r$   r    DatabaseErrorhasattrrB   SQLITE_NOTADBlogwarningremove_cacheOSError)r   r-   rC   r%   r'   ehas_errorcodes          r   r!   ShardCache.connect[   s     --557EN		 a		E  $$ 	
 $A'9:M}!2D2DH]H]2]8%C>%%' >KK BEM'=$>
 ||6|??!	sl   A3 A"A3 "
A0,A3 0A3 3D1AD,C'&D,'
D1D	D,DD,%D1+D,,D1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_shardr'   s      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   r'   rows       r   retrieveShardCache.retrieve   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   rU   rV   N)
r[   ZstdDecompressorjoinlenr&   r$   rY   rZ   r\   r]   )r   urlsdctxqueryr'   r^   results          r   retrieve_multipleShardCache.retrieve_multiple   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   r'   s     r   clear_cacheShardCache.clear_cache   s$     YY!II*+ YYs   (
6c                    U R                  5          U R                  [        -  R                  5         g! [         a9    U R                  [        -  R                  U R                  [         S3-  5         gf = f)z$
Remove the sharded cache database.
z.conda_trashN)r6   r.   rD   unlinkrL   renamer2   s    r   rK   ShardCache.remove_cache   se     	

	aYY))113 	aYY))11$))AQ@RR^>_2_`	as   !4 A A76A7)r.   r&   N)T)r.   r   )TT)rQ   r
   )returnzShardDict | None)rg   z	list[str]rt   zdict[str, ShardDict | None])r   r   r   r   __doc__r   r3   r:   r6   r?   r!   rR   r_   rk   rn   rK   r   r   r   r   r)   r)   ;   s@    $3%N	2,	ar   r)   )zcache.db)ru   
__future__r   loggingr    dataclassesr   typingr   rY   r[   pathlibr   shards_typingr   	getLoggerr   rI   rD   r]   r
   r!   r)   r   r   r   <module>r}      sr   
 #   !    (!'      
Ja Jar   