
    	^c              	          d Z ddlZddlZddlZddlZddlmZ ddlmZm	Z	m
Z
 ddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZmZ ddlmZmZ 	 dd	lm Z  e j!         n# e"$ r dZ Y nw xY wi Z# ej$        e#          Z$ e$d
de rdndd           dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1ddddddd d!e+z  gZ2d<d"Z3d# Z4 G d$ d%ej5                  Z6ej7         G d& d'                      Z8 ej9        ej:                   ej7        d(           G d) d*                                  Z; ej9        ej<                   ej7        d+           G d, d-                                  Z= ej9        ej>                   G d. d/                      Z? G d0 d1ej@                  ZAd2 ZBd3 ZCd4 ZD ej9        ejE                   G d5 d6                      ZFd7 ZGd8 ZHd9 ZId: ZJd; ZKdS )=am  store repository data in SQLite (EXPERIMENTAL)

The sqlitestore extension enables the storage of repository data in SQLite.

This extension is HIGHLY EXPERIMENTAL. There are NO BACKWARDS COMPATIBILITY
GUARANTEES. This means that repositories created with this extension may
only be usable with the exact version of this extension/Mercurial that was
used. The extension attempts to enforce this in order to prevent repository
corruption.

In addition, several features are not yet supported or have known bugs:

* Only some data is stored in SQLite. Changeset, manifest, and other repository
  data is not yet stored in SQLite.
* Transactions are not robust. If the process is aborted at the right time
  during transaction close/rollback, the repository could be in an inconsistent
  state. This problem will diminish once all repository data is tracked by
  SQLite.
* Bundle repositories do not work (the ability to use e.g.
  `hg -R <bundle-file> log` to automatically overlay a bundle on top of the
  existing repository).
* Various other features don't work.

This extension should work for basic clone/pull, update, and commit workflows.
Some history rewriting operations may fail due to lack of support for bundle
repositories.

To use, activate the extension and set the ``storage.new-repo-backend`` config
option to ``sqlite`` to enable new repositories to use SQLite for storage.
    N)_)nullrevsha1nodeconstantsshort)attr)ancestordagopencodingerror
extensions	localrepomdiffpycompat	registrarrequirementsutilverify)
repositoryr   )hashutilstorageutil)zstd   storage   sqlite.compression   zstd   zlibT)defaultexperimentals   ships-with-hg-cores   exp-sqlite-001s   exp-sqlite-comp-001=zstds   exp-sqlite-comp-001=zlibs   exp-sqlite-comp-001=nones   exp-sqlite-shallow-files            zCREATE TABLE delta (    id INTEGER PRIMARY KEY,     compression INTEGER NOT NULL,     hash BLOB UNIQUE ON CONFLICT ABORT,     delta BLOB NOT NULL )zKCREATE TABLE filepath (    id INTEGER PRIMARY KEY,     path BLOB NOT NULL )z4CREATE UNIQUE INDEX filepath_path ON filepath (path)ac  CREATE TABLE fileindex (    id INTEGER PRIMARY KEY,     pathid INTEGER REFERENCES filepath(id),     revnum INTEGER NOT NULL,     p1rev INTEGER NOT NULL,     p2rev INTEGER NOT NULL,     linkrev INTEGER NOT NULL,     flags INTEGER NOT NULL,     deltaid INTEGER REFERENCES delta(id),     deltabaseid INTEGER REFERENCES fileindex(id),     node BLOB NOT NULL )zJCREATE UNIQUE INDEX fileindex_pathrevnum     ON fileindex (pathid, revnum)zBCREATE UNIQUE INDEX fileindex_pathnode ON fileindex (pathid, node)a  CREATE VIEW filedata AS SELECT     fileindex.id AS id,     filepath.id AS pathid,     filepath.path AS path,     fileindex.revnum AS revnum,     fileindex.node AS node,     fileindex.p1rev AS p1rev,     fileindex.p2rev AS p2rev,     fileindex.linkrev AS linkrev,     fileindex.flags AS flags,     fileindex.deltaid AS deltaid,     fileindex.deltabaseid AS deltabaseid FROM filepath, fileindex WHERE fileindex.pathid=filepath.idzPRAGMA user_version=%dc           
         |                      d                    d                    dgt          |          z                      t	          ||gt          |                                          z                       }g }d}|D ]~\  }	}
}|	}|
t          k    r|                    |          }n@|
t          k    r|}n2|
t          k    rt          j        |          }nt          d|
z            |                    |           ||v r|||                  }n|                                }|                                 t!          j        ||          }t%          |t&                    st'          |          }|S )z&Resolve a delta chain for a file node.a  WITH RECURSIVE     deltachain(deltaid, baseid) AS (        SELECT deltaid, deltabaseid FROM fileindex             WHERE pathid=? AND node=?         UNION ALL         SELECT fileindex.deltaid, deltabaseid             FROM fileindex, deltachain             WHERE                 fileindex.id=deltachain.baseid                 AND deltachain.baseid IS NOT NULL                 AND fileindex.id NOT IN ({stops})     ) SELECT deltachain.baseid, compression, delta FROM deltachain, delta WHERE delta.id=deltachain.deltaid,?)stopsNs   unhandled compression type: %d)executeformatjoinlentuplelistkeysCOMPRESSION_ZSTD
decompressCOMPRESSION_NONECOMPRESSION_ZLIBzlibSQLiteStoreErrorappendpopreverser   patches
isinstancebytes)dbpathidnoderevisioncachestopridszstddctxresdeltaslastdeltabaseiddeltabaseidcompressiondeltabasetextfulltexts                 3/usr/lib/python3/dist-packages/hgext/sqlitestore.pyresolvedeltachainrH      s    **	, -3F((C53x==011 -3 -
 -
 	vtntHMMOO44455% C* FO+.  '[%%***''..EE,,,EE,,,OE**EE"1K?   	e("" /!:;::<<
NN}Xv..H
 h&&  <<O    c                     	 |                      d|||f          j        S # t          j        $ r2 |                      d|f                                          d         cY S w xY w)Nz=INSERT INTO delta (compression, hash, delta) VALUES (?, ?, ?)z!SELECT id FROM delta WHERE hash=?r   )r&   	lastrowidsqlite3IntegrityErrorfetchone)r9   rC   hashrD   s       rG   insertdeltarP      s    zzK$&
 
 	 !   zz/$
 

(**Q 	 	 	s     >A! A!c                       e Zd ZdS )r2   N)__name__
__module____qualname__ rI   rG   r2   r2     s        DrI   r2   c                      e Zd Z ej                    Z ej                    Z ej                    Z ej                    Z ej                    Z	 ej                    Z
 ej                    Z ej                    Z ej                    ZdS )revisionentryN)rR   rS   rT   r   ibridrevr;   p1revp2revp1nodep2nodelinkrevflagsrU   rI   rG   rW   rW   
  s        
$'))C
$'))C4799DDGIIEDGIIETWYYFTWYYFdgiiGDGIIEEErI   rW   )slotsc                   \   e Zd Z ej                    Z ej                    Z ej                    Z ej                    Z ej                    Z	 ej                    Z
 ej                    Z ej                    Z ej                    Z ej                    Z ej        d          ZdS )sqliterevisiondeltaNr   )rR   rS   rT   r   rX   r;   r]   r^   basenoder`   baserevisionsizerevisionrD   sidedataprotocol_flagslinknoderU   rI   rG   rc   rc     s         4799DTWYYFTWYYFtwyyHDGIIEtwyytwyyHDGIIEtwyyHTWYYNtwt$$$HHHrI   rc   )frozenc                   t    e Zd Z ej        d          Z ej        d          Z ej        d          ZdS )sqliteproblemNrd   )rR   rS   rT   r   rX   warningr   r;   rU   rI   rG   rm   rm   '  sL         dgd###GDGD!!!E474   DDDrI   rm   c                   6   e Zd ZdZd Zd Zd Zd Zd Zd,d	Z	d
 Z
d Zd-dZd Zd Zd Zd Zd Zd Zd Zd.dZd Zd Zd/dZd Zd Zd Zd Zdddej        dfdZd Z	 	 	 d0d Z 	 	 	 d1d!Z!d2d#Z"d$ Z#d% Z$d& Z%d3d'Z&	 	 	 	 	 d4d(Z'd) Z(d.d*Z)	 	 d5d+Z*dS )6sqlitefilestorez2Implements storage for an individual tracked path.c                 r   t           j        | _        || _        || _        d | _        i | _        i | _        i | _        t          j	        d          | _
        || _        |dk    r3t          j        d          | _        t          j                    | _        nd | _        d | _        |                                  d S )N
   r   r    )level)r   nullid_db_path_pathid
_revtonode
_nodetorev
_revisionsr   lrucachedict_revisioncache_compenginer   ZstdCompressor_cctxZstdDecompressor_dctx_refreshindex)selfr9   pathrC   s       rG   __init__zsqlitefilestore.__init__3  s    '.
 "/33&'!!,1555DJ.00DJJDJDJrI   c                    i | _         i | _        i | _        t          | j                            d| j        f                    }|s	d | _        d S |d         d         | _        | j                            d| j        f          }t          |          D ]\  }}|\  }}}}}}	}
||k    rt          t          d                    |t          k    rt          j        }n| j         |         }|t          k    rt          j        }n| j         |         }t          ||||||||	|
	  	        }|| j         |<   || j        |<   || j        |<   d S )Nz$SELECT id FROM filepath WHERE path=?r   zgSELECT id, revnum, node, p1rev, p2rev, linkrev, flags FROM fileindex WHERE pathid=? ORDER BY revnum ASCs1   sqlite database has inconsistent revision numbers	rY   rZ   r;   r[   r\   r]   r^   r_   r`   )rx   ry   rz   r+   ru   r&   rv   rw   	enumerater2   r   r   r   rt   rW   )r   r?   irowrY   rZ   r;   r[   r\   r_   r`   r]   r^   entrys                 rG   r   zsqlitefilestore._refreshindexN  s   H6 
 
  	DLF1vayh" \O
 
  nn  	*  	*FAs;>8CdE5'5Cxx&JKK   *1/*1/!
 
 
E $(DOC $'DOD!$)DOD!!A 	*  	*rI   c                 *    t          | j                  S N)r)   rz   r   s    rG   __len__zsqlitefilestore.__len__  s    4?###rI   c                 ^    t          t          t          | j                                      S r   )iterranger)   rz   r   s    rG   __iter__zsqlitefilestore.__iter__  s"    E#do..//000rI   c                 8    |t           j        k    rdS || j        v S NF)r   rt   ry   r   r;   s     rG   hasnodezsqlitefilestore.hasnode  s#    $+++5t&&rI   r   Nc                 T    t          j        t          | j                  ||          S )N)startstop)r   iterrevsr)   rz   )r   r   r   s      rG   revszsqlitefilestore.revs  s-    #  D
 
 
 	
rI   c                     |t           j        k    rt           j        t           j        fS || j        vr(t          j        || j        t          d                    | j        |         }|j        |j        fS N   no node)	r   rt   rz   r   LookupErrorrv   r   r]   r^   )r   r;   r   s      rG   parentszsqlitefilestore.parents  sh    $+++$+->-EEEt&&#D$*a
mmDDD%|U\))rI   c                     |t           k    rt           t           fS || j        vrt          |          | j        | j        |                  }|j        |j        fS r   )r   rx   
IndexErrorrz   r[   r\   r   rZ   r   s      rG   
parentrevszsqlitefilestore.parentrevs  sQ    '>>G##do%%S//! 45{EK''rI   Fc                     t          |          }| j        }|D ]} ||           t          j        | j        |||          S )zGenerate the ancestors of 'revs' in reverse revision order.
        Does not generate revs lower than stoprev.

        See the documentation for ancestor.lazyancestors for more details.)stoprev	inclusive)r+   r;   r   lazyancestorsr   )r   r   r   r   checkrevrs         rG   	ancestorszsqlitefilestore.ancestors  s\     Dzz9 	 	AHQKKKK%O	
 
 
 	
rI   c                     |t           j        k    rt          S || j        vr(t	          j        || j        t          d                    | j        |         S r   )r   rt   r   ry   r   r   rv   r   r   s     rG   rZ   zsqlitefilestore.rev  sM    $+++Nt&&#D$*a
mmDDDt$$rI   c                 z    |t           k    rt          j        S || j        vrt	          |          | j        |         S r   )r   r   rt   rx   r   r   rZ   s     rG   r;   zsqlitefilestore.node  s:    '>>$++do%%S//!s##rI   c                 8    t          j        | || j                  S r   )r   fileidlookuprv   r   s     rG   lookupzsqlitefilestore.lookup  s    'dDJ???rI   c                     |t           k    rt           S || j        vrt          |          | j        | j        |                  }|j        S r   )r   rx   r   rz   r_   r   s      rG   r_   zsqlitefilestore.linkrev  sD    '>>Ndo%%S//! 45}rI   c                     |t           k    rdS || j        vrt          |          | j        | j        |                  j        t
          z  S r   )r   rx   r   rz   r`   FLAG_CENSOREDr   s     rG   
iscensoredzsqlitefilestore.iscensored  sE    '>>5do%%S//!ts34:]JJrI   c                     |                      |          }|                      |          }t          j        | j        ||          }t	          j        | j        |          S r   )rZ   r   commonancestorsheadsr   r   maplistr;   )r   node1node2rev1rev2r   s         rG   r   z$sqlitefilestore.commonancestorsheads  sK    xxxx1$/4NN		9555rI   c                 B    t          j        || j        | j                  S r   )r	   descendantrevsr   r   )r   r   s     rG   descendantszsqlitefilestore.descendants  s     #D$)T_EEErI   c                      ||t                     st          j        gS |                     |          nt          } fd|pg D             }t          j         j         j        ||          } fd|D             S )Nc                 :    h | ]}                     |          S rU   rZ   .0nr   s     rG   	<setcomp>z(sqlitefilestore.heads.<locals>.<setcomp>  s#    444ADHHQKK444rI   )startrevstoprevsc                 :    g | ]}                     |          S rU   )r;   )r   rZ   r   s     rG   
<listcomp>z)sqlitefilestore.heads.<locals>.<listcomp>  s#    ///3		#///rI   )	r)   r   rt   rZ   r   r	   headrevssubsetr   r   )r   r   r   r   r   r   s   `     rG   headszsqlitefilestore.heads  s    =T\t99 2)011&+&7488E???W4444444#ItH
 
 
 0///$////rI   c                     |                      |          }| j                            d| j        ||f          }d |D             S )NzZSELECT  node   FROM filedata   WHERE path=? AND (p1rev=? OR p2rev=?)   ORDER BY revnum ASCc                     g | ]
}|d          S )r   rU   )r   r   s     rG   r   z,sqlitefilestore.children.<locals>.<listcomp>  s    &&&3A&&&rI   )rZ   ru   r&   rv   )r   r;   rZ   r?   s       rG   childrenzsqlitefilestore.children  sQ    hhtnnh$
 Zc"
 
 '&#&&&&rI   c                    |t           k    rdS || j        vrt          |          | j        |         }|                     |          r"t	          |                     |                    S t	          |                     |                    S Nr   )r   rx   r   renamedr)   readrg   )r   rZ   r;   s      rG   sizezsqlitefilestore.size  s{    '>>1do%%S//!s#<< 	(tyy'''4==&&'''rI   Tc                 *    |t           j        t          fv rdS t          |t                    r                     |          }| j        vr(t          j        | j	        t          d                    | j        v r j        |         S  fd j        D             }|sd |d<   t           j         j        | j        | j                  } j        |         j        t$          t&          z  z  rd}|r                      ||           | j        |<   |S )NrI   r   c                 6    i | ]}j         |         j        |S rU   )rz   rY   r   s     rG   
<dictcomp>z,sqlitefilestore.revision.<locals>.<dictcomp>6  s%    KKK!DOA&*AKKKrI   r>   F)r   rt   r   r7   intr;   ry   r   r   rv   r   r|   rH   ru   rw   r   rz   r`   FLAG_MISSING_P1FLAG_MISSING_P2
_checkhash)r   r;   raw_verifyhashr=   rF   s   `     rG   rg   zsqlitefilestore.revision%  s3   %,g6663dC   	#99T??Dt&&#D$*a
mmDDD4&&&&t,, LKKKt7JKKK 	 HRL$HLZ
 
 
 ?4 &/O*KL 	 K 	1OOHd+++(0D%rI   c                      | j         |i |S r   )rg   )r   argskwargss      rG   rawdatazsqlitefilestore.rawdataO  s    t}d-f---rI   c                 P    t          j        |                     |                    S r   )r   filtermetadatarg   r   s     rG   r   zsqlitefilestore.readR  s    )$--*=*=>>>rI   c                 ,    t          j        | |          S r   )r   filerevisioncopiedr   s     rG   r   zsqlitefilestore.renamedU  s    -dD999rI   c                 0    t          j        | ||           S r   )r   filedataequivalent)r   r;   rF   s      rG   cmpzsqlitefilestore.cmpX  s    1$hGGGGrI   c              #     K   |dvrt          j        d|z            d |D             }|sd S | j                            dd                    dgt          |          z            z  t          | j        g|z                       }i }|D ]D\  }	}
| j                            d| j        |
f          }|                                d         ||	<   Et          j
        | ||t          |j        ||||		  	        D ]}|V  d S )
N)s   nodesr   s   linearNs"   unhandled value for nodesorder: %sc                 2    g | ]}|t           j        k    |S rU   )r   rt   )r   r   s     rG   r   z1sqlitefilestore.emitrevisions.<locals>.<listcomp>i  s&    CCCqQ*;*B%B%B%B%B%BrI   zISELECT revnum, deltaid FROM fileindex WHERE pathid=?     AND node in (%s)r#   r$   z9SELECT revnum from fileindex WHERE pathid=? AND deltaid=?r   )deltaparentfnrevisiondataassumehaveparentrevisions	deltamodesidedata_helpers)r   ProgrammingErrorru   r&   r(   r)   r*   rw   rN   r   emitrevisionsrc   __getitem__)r   nodes
nodesorderr   r   r   r   r?   
deltabasesrZ   deltaidrD   s               rG   r   zsqlitefilestore.emitrevisions[  sZ      DDD(5
B   DCECCC 	F h#&)hhus5zz/A&B&BD 4<.5())	
 
 
 	0 	0LC(""Kw' C "llnnQ/JsOO !.$0%&?-

 

 

 	 	E KKKK	 	rI   c                     |s|                     d          rt          j        ||          }|                     |||||          }|                     |          S )Ns   
)
startswithr   packmetaaddrevisionr;   )r   filedatametatransactionr_   p1p2rZ   s           rG   addzsqlitefilestore.add  s\     	<8&&y11 	<"+D(;;Hxgr2FFyy~~rI   c	                 2   |rt          t          d                    |d u}	|pt          j        |||          }|	r|                     ||||           | j                            |          }
|
|
S |                     ||||||          }
|| j        |<   |
S )Ns    flags not supported on revisions)	r2   r   r   hashrevisionsha1r   ry   get_addrawrevisionr|   )r   r   r   r_   r  r  r;   r`   
cachedeltavalidatehashrZ   s              rG   r   zsqlitefilestore.addrevision  s      	K"1%H#I#IJJJ4'I{3L"bII 	8OOL$B777o!!$''?J"",Wb"
 
 %1D!
rI   c                     d}|D ]I\  }}	}
}}}}}d}|t           j        z  r
|t          z  }|t           j         z  rt          d          |rv|	t          j        k    r+                     |	          st          j        }	|t          z  }|
t          j        k    r+                     |
          st          j        }
|t          z  } 	                    |          }|t          k    r                     |          rt          j        d          }t                               |d                    }t          |          |z
  }|d |         t!          j        ||          k    rt%          j         j        |          |t          z  s#t+          j        || fd          r
|t          z  } ||          }| j        v r4 j        |         }|j        t          z  rr|	t          j        k    rb|	|_         j        |	         |_        |xj        t           z  c_         j                            d j        |	         |j        |j        f           |j        t          z  rr|
t          j        k    rb|
|_         j        |
         |_         |xj        t           z  c_         j                            d	 j        |	         |j        |j        f           |r |  	                    |                     d}|t          j        k    rt!          j!        d
|          }d }nd }||f} "                    |||||	|
||          }|r | |           d}K| S )NTr   s   unhandled revision flags   >lllF)r   c                 H    t                              |                     S r   )r)   r   )xr   s    rG   <lambda>z*sqlitefilestore.addgroup.<locals>.<lambda>  s    #dll1oo*>*> rI   z0UPDATE fileindex SET p1rev=?, flags=? WHERE id=?z0UPDATE fileindex SET p2rev=?, flags=? WHERE id=?rI   )
storedeltar`   )#r   REVISION_FLAG_CENSOREDr   r2   r   rt   r   r   r   rZ   r   r   structcalcsizer)   r   r   replacediffheaderr   CensoredBaseErrorrv   r   deltaiscensoredrz   r`   r]   ry   r[   ru   r&   rY   r^   r\   patchr  )r   r@   
linkmapperr   addrevisioncbduplicaterevisioncbmaybemissingparentsemptyr;   r  r  rj   	deltabaserD   	wireflagsrh   
storeflagsbaserevhlenoldlennewlenr_   r   textr  rZ   s   `                         rG   addgroupzsqlitefilestore.addgroup  s     e	 e	 	
J:<< ,m+
J=== C&'ABBB" 2*111$,,r:J:J1*1B/1J*111$,,r:J:J1*1B/1Jhhy))G '!!doog&>&>!w//T\\)\GGHHUd*$<5#:66#J#JJJ1$*iHHH. ,K4Ow > > > >5 5 , m+
 j**Gt&&- K/1/666#%EL"&/""5EKKKO#33KKH$$J,ek59E   K/1/666#%EL"&/""5EKKKO#33KKH$$J,ek59E  
 ' >''dhhtnn===-444{3..!

'/
&&%  ' 	 	C  )dC(((EEyrI   rI   c           	         t          j        d|id          }t          |          t          |                     |                    k    r!t	          j        t          d                    | j                            d| j	        |         j
        f                                          d         }t          | j                            d||f                    }|D ]2}|\  }}}	t          | j        ||	i dd i| j                  }
t          j        |
                                          }| j        d	k    r"| j                            |
          }t*          }nX| j        d
k    rt-          j        |
          }t.          }n1| j        dk    r
|
}t0          }nt	          j        d| j        z            t          |          t          |
          k    r	|
}t0          }t5          | j        |||          }| j                            d||f           4t          j        |                                          }t5          | j        t0          ||          }| j	        |         j        }|t8          z  }| j                            d||| j        |f           | j                            d|f           |                                  | j                                          d S )Ns   censoredrI   s5   censor tombstone must be no longer than censored dataz(SELECT deltaid FROM fileindex WHERE id=?r   zGSELECT id, pathid, node FROM fileindex WHERE deltabaseid=? OR deltaid=?r   r   r   r      none    unhandled compression engine: %sz;UPDATE fileindex SET deltaid=?, deltabaseid=NULL WHERE id=?zSUPDATE fileindex SET flags=?, deltaid=?, deltabaseid=NULL WHERE pathid=? AND node=?zDELETE FROM delta WHERE id=?)!r   r   r)   r   r   Abortr   ru   r&   rz   rY   rN   r+   rH   r   r   sha1digestr}   r   compressr-   r1   r0   r/   r   rP   r`   r   rw   r   r|   clear)r   tr
censornode	tombstonecensoreddeltaidrowsr   rY   r:   r;   rF   	deltahash	deltablobrC   r   tombstonedeltaidr`   s                    rG   censorrevisionzsqlitefilestore.censorrevision,  s   (+y)A3GG	 y>>CZ 8 89999+JKK   (**6_Z(,.
 
 (**Q H3 /2 
 
  !	 !	C #C(&$RJ  H !h//6688I7** J//99	.!W,, M(33	.!W,,$	.,7$:JJ   9~~X..$	.!$(KINNGH#    M),,3355	&H&	9
 
 
+1($dlJ?	
 	
 	
 	7/9KLLL!!#####rI   c                      t          j        |t                     dz
   fd                                 D              j         j                  S )Nr   c                 :    g | ]}                     |          S rU   r   r   s     rG   r   z1sqlitefilestore.getstrippoint.<locals>.<listcomp>  s#    ///QTXXa[[///rI   )r   resolvestripinfor)   r   r_   r   )r   minlinks   ` rG   getstrippointzsqlitefilestore.getstrippoint  sQ    +IIM////$**,,///LO
 
 	
rI   c                 D   t          |           sd S |                     |          \  }}|t          |           k    rd S |                     |          D ]7}| j                            d| j        |                     |          f           8|                                  d S )Nz/DELETE FROM fileindex WHERE pathid=? AND node=?)r)   r9  r   ru   r&   rw   r;   r   )r   r8  r   rZ   _ignoreds        rG   stripzsqlitefilestore.strip  s    4yy 	F**733X#d))F99S>> 	 	CHAtyy~~.    	rI   c                     g S r   rU   r   s    rG   fileszsqlitefilestore.files  s    	rI   c                     i S r   rU   )r   	nodeorrev_dfs      rG   rh   zsqlitefilestore.sidedata  s    	rI   c                      i }|rg |d<   |rg |d<   |rt                     |d<   |r#t           fd j        D                       |d<   |rd |d<   |S )Ns   exclusivefiless   sharedfiless   revisionscountc              3   \   K   | ]&}t                              |                    V  'd S r   )r)   rg   )r   r;   r   s     rG   	<genexpr>z.sqlitefilestore.storageinfo.<locals>.<genexpr>  sH       $ $-1DMM$''(($ $ $ $ $ $rI   s   trackedsizes
   storedsize)r)   sumry   )r   exclusivefilessharedfilesrevisionscounttrackedsize
storedsizeds   `      rG   storageinfozsqlitefilestore.storageinfo  s      	&#%A  	# "An 	-#&t99A  	 # $ $ $ $59_$ $ $ ! !An  	$#AmrI   c              #   T  K   t                      |d<   | D ]}|                     |          }	 |                     |           .# t          $ rW}t	          t          d          t          |          |fz  |          V  |d                             |           Y d }~d }~ww xY wd S )Ns   skipreads   unpacking %s: %s)r   r;   )setr;   rg   	Exceptionrm   r   r   r  )r   staterZ   r;   es        rG   verifyintegrityzsqlitefilestore.verifyintegrity  s       UUk 
	- 
	-C99S>>D-d#### - - -#/00E$KK3CC$      k"&&t,,,,,,,,-
	- 
	-s   A
B%AB  B%c                 L   |||                      |          \  }}|t          j        |||          k    rd S 	 | j        |= n# t          $ r Y nw xY wt          j        |          rt          j        | j        ||          t          t          d          | j        z            )Ns   integrity check failed on %s)r   r   r  r|   KeyErroriscensoredtextr   CensoredNodeErrorrv   r2   r   )r   rF   r;   r  r  s        rG   r   zsqlitefilestore._checkhash  s    :"*\\$''FB;/"bAAAAF	#D)) 	 	 	D	 %h// 	F)$*dHEEEq!@AADJNOOOs   A 
AAc	                    | j         -| j                            d| j        f          }	|	j        | _         |r0|\  }
}t          |
t                    r|                     |
          }
nT|J |}
|
t          j	        k    r|}n;t          j        |                     |                     |
                    |          }|
t          j	        k    rd }n| j        |
         j        }t!          j        |                                          }| j        dk    r"| j                            |          }t,          }nX| j        dk    rt/          j        |          }t0          }n1| j        dk    r
|}t2          }nt5          j        d| j        z            t9          |          t9          |          k    r	|}t2          }t;          | j        |||          }t9          |           }|t          j	        k    rt<          }n| j        |         }|t          j	        k    rt<          }n| j        |         }| j                            d| j         ||||||||f	          j        }tA          |||||||||	  	        }|| j        |<   || j!        |<   || j        |<   |S )Nz&INSERT INTO filepath (path) VALUES (?)r   r   r%  r&  zINSERT INTO fileindex (    pathid, revnum, node, p1rev, p2rev, linkrev, flags,     deltaid, deltabaseid)     VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)r   )"rw   ru   r&   rv   rK   r7   r   r;   r   rt   r   textdiffrg   rZ   rz   rY   r   r(  r)  r}   r   r*  r-   r1   r0   r/   r   r   r)   rP   r   ry   rW   rx   )r   r;   r   r   r_   r  r  r  r`   r?   r  rD   baseidr1  r2  rC   r   rZ   r[   r\   rY   r   s                         rG   r  zsqlitefilestore._addrawrevision  s    <(""84:- C =DL
  	)Iu)S)) 1 IIi00	  +++I-444$MM$((9"5"566  )000FF_Y/3F M%((//11	w&&
++E22I*KK((e,,I*KK((I*KK(3d6FF  
 y>>SZZ''I*KdhY	JJ$ii")))EEOB'E")))EEOB'Eh5
 

 
  ! 	$ 

 

 

 !$# %
rI   )r   N)r   F)NN)FT)Nr   N)NNF)rI   r   )FFFFFr   )+rR   rS   rT   __doc__r   r   r   r   r   r   r   r   r   rZ   r;   r   r_   r   r   r   r   r   r   rg   r   r   r   r   r   CG_DELTAMODE_STDr   r  r   r#  r4  r9  r<  r>  rh   rL  rR  r   r  rU   rI   rG   rp   rp   /  s       <<  69* 9* 9*z$ $ $1 1 1' ' '
 
 
 

* * *( ( (
 
 
 
&% % %$ $ $@ @ @  K K K6 6 6F F F
0 0 0 0' ' '$( ( (( ( ( (T. . .? ? ?: : :H H H "'-1 1 1 1n      H  !r r r rh[$ [$ [$ [$z
 
 
  .         >- - -"P P P P2 u u u u u urI   rp   c                   :     e Zd Zd Z fdZed             Z xZS )sqliterepositoryc                     dS r   rU   r   s    rG   cancopyzsqliterepository.cancopyj  s    urI   c                                                        } t          t                     j        |i |}|r|S  j                            d            fd}|                    d|           |S )NzBEGIN TRANSACTIONc                 :    j                                          d S r   )_dbconncommit)r   r   s    rG   committransactionz7sqliterepository.transaction.<locals>.committransactionw  s    L!!!!!rI   s   sqlitestore)currenttransactionsuperr]  r   rb  r&   addfinalize)r   r   r   currentr,  rd  	__class__s   `     rG   r   zsqliterepository.transactionm  s    ))++6U#T**6GGG 	I0111	" 	" 	" 	" 	" 	~'8999	rI   c                     t          j                    j        }| j        r| j        d         |k    r| j        d         S t	          | j                            d                    }||f| _        |S )Nr   r   s	   db.sqlite)	threadingcurrent_threadidentru   makedbsvfsr(   )r   tidr9   s      rG   rb  zsqliterepository._dbconn~  sg    
 &((.8 	#x{c!!x{"DINN<00119	rI   )rR   rS   rT   r_  r   propertyrb  __classcell__)ri  s   @rG   r]  r]  i  sb              "   X    rI   r]  c                    t          j        t          j        |                     }t          |_        |                    d                                          d         }|dk    r4t          D ]}|                    |           |	                                 n-|t          k    rn!t          j        t          d                    |                    d           |S )z3Construct a database handle for a database at path.zPRAGMA user_versionr   s(   sqlite database has unrecognized versionzPRAGMA journal_mode=WAL)rL   connectr
   strfromlocalr8   text_factoryr&   rN   CREATE_SCHEMArc  CURRENT_SCHEMA_VERSIONr   r'  r   )r   r9   r?   	statements       rG   rn  rn    s     
.t44	5	5BBO
***
+
+
4
4
6
6q
9C axx& 	" 	"IJJy!!!!
			&	&	& k!GHHIIIJJ()))IrI   c                 V   |                     t                     t          r|                     t                     |                     t                     |                     t
                     |                     t                     |                     t          j                   d S r   )	r  REQUIREMENTr   REQUIREMENT_ZSTDREQUIREMENT_ZLIBREQUIREMENT_NONEREQUIREMENT_SHALLOW_FILESr   NARROW_REQUIREMENT)ui	supporteds     rG   featuresetupr    s    MM+ (&'''MM"###MM"###MM+,,,MM,122222rI   c                 P   |d         dk    r | ||          S d|v r!t          j        t          d                    h d}t          |          |z
  }|rDt          j        t          d          d                    t          |                    z            d|d<    | ||          } |j        t                     |                    d	d
          }|dk    r(t          s!t          j        t          d                    |dk    r |j        t                     n\|dk    r |j        t                     n@|dk    r |j        t                     n$t          j        t          d          |z            |                    d          r |j        t                     |S )N   backends   sqlites
   sharedrepos3   shared repositories not supported with SQLite store>      narrowfilesr     shallowfilestores6   SQLite store does not support repo creation option: %ss   , s   revlogv1r   r   r   sj   storage.sqlite.compression set to "zstd" but zstandard compression not available to this Mercurial installr   r%  sD   unknown compression engine defined in storage.sqlite.compression: %sr  )r   r'  r   rN  r(   sortedr  r{  configr   r|  r}  r~  r  r  )origr  
createoptsknownunsupportedr   rC   s          rG   newreporequirementsr    s   ***tB
### 
""kDEE
 
 	
  E j//E)K 
kGHHjj,,--.
 
 	
 )Jz4J''LL[!!!))J(=>>Kgdk% 
 
 	
 g)****			)****			)****k2  	
 
 	
 ~~)** 42333rI   c                       e Zd ZdZd ZdS )sqlitefilestoragez)Repository file storage backed by SQLite.c                    |d         dk    r
|dd          }t           | j        v rd}nCt          | j        v rd}n2t          | j        v rd}n!t	          j        t          d                    t          | j        ||          S )Nr      /r   r   r   r%  sE   unable to determine what compression engine to use for SQLite storage)	r|  r   r}  r~  r   r'  r   rp   rb  )r   r   rC   s      rG   filezsqlitefilestorage.file  s    7d??8Dt000!KK!222!KK!222!KK+1    t|T;???rI   N)rR   rS   rT   rZ  r  rU   rI   rG   r  r    s.        33@ @ @ @ @rI   r  c                     t           |v r/t          |v r|                    t          j                   t
          S  | d||d|S )z=Produce a type conforming to ``ilocalrepositoryfilestorage``.)r   featuresNrU   )r{  r  r  r   !REPO_FEATURE_SHALLOW_FILE_STORAGEr  )r  r   r  r   s       rG   makefilestorager    sP    l""$44LLEFFF  tKKKFKKKrI   c                     t           |v r8t          |v r(t          s!t          j        t          d                    t          S  | dd|i|S )NsW   repository uses zstandard compression, which is not available to this Mercurial installr   rU   )r{  r|  r   r   r'  r   r]  )r  r  r   r   s       rG   makemainr    sg    l""|++D++B     444\4V444rI   c                 ,     | |g|R i | d|_         d S r   )warnorphanstorefiles)r  r   r   r   s       rG   verifierinitr  )  s2    D !&DrI   c                 X   t           j                            t                     t	          j        t           dt                     t	          j        t           dt                     t	          j        t           dt                     t	          j        t          j
        dt                     d S )Ns   newreporequirementss   makefilestorages   makemains   __init__)r   featuresetupfuncsr  r  r   wrapfunctionr  r  r  r   verifierr  )r  s    rG   extsetupr  1  s    ##L111)+>   I'9?KKKI{H===FO[,GGGGGrI   c                 B    t          |t                    r	d |_        d S d S r   )r7   r]  ru   )r  repos     rG   	reposetupr  ;  s*    $())  rI   r   )LrZ  rL   r  rk  r1   mercurial.i18nr   mercurial.noder   r   r   mercurial.thirdpartyr   	mercurialr   r	   r
   r   r   r   r   r   r   r   r   r   mercurial.interfacesr   interfaceutilmercurial.utilsr   r   r   __version__ImportErrorconfigtable
configitem
testedwithr{  r|  r}  r~  r  rx  r/   r-   r0   r   r   r   rw  rH   rP   StorageErrorr2   srW   implementerirevisiondeltarc   iverifyproblemrm   ifilestoragerp   localrepositoryr]  rn  r  r  ilocalrepositoryfilestorager  r  r  r  r  r  rU   rI   rG   <module>r     s   N                      
 & % % % % %                                         
   DDD !Y!+..
 
(GG	    #
. . . 7      ;(H) 55w<~> > > >B	 	 		 	 	 	 	u) 	 	 	 	 	 	 	 	 	 	 	 :455d% % % % % % %  65% :455t! ! ! ! ! ! !  65! :233v v v v v v v 43vr# # # # #y0 # # #L  4	3 	3 	3> > >B :ABB@ @ @ @ @ @ @ CB@0L L L5 5 5& & &H H H    s   A$ $A.-A.