�
�v_c@s�ddlZddlZddlZddlZddlmZmZmZmZddl Z ddl
Z
ddlmZm
Z
mZddlZddlZddlZddlZddlmZddlmZmZddlZddlZddlZd�Zd�Zd�Zd �Zd
�Zd�Z deeefd
��YZ!dej"fd��YZ#d�Z$d�Z%d�Z&d�Z'dZ(dZ)dS(i����N(t
PackageObjecttRpmBasetYumAvailablePackaget
parsePackages(t
executeSQLtsql_esctsql_esc_glob(t
seq_max_split(tto_utf8t
to_unicodecs>�fd�}�j|_�j|_|jj�j�|S(s8This decorator converts sqlite exceptions into RepoErrorcs�y�||�SWnvtjjk
r�}tjdkrtt|d�r_tjt|j ��qttjt|��ntjt|��nXdS(Nitmessage(
tsqlutilstsqlitetErrortsyst
hexversionthasattrtErrorst RepoErrortstrR
(targstkwargste(tfunc(s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytnewFunc,s(t__name__t__doc__t__dict__tupdate(RR((Rs2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytcatchSqliteException*s
cCs
tj|�S(N(tmisct
share_data(tvalue((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_share_data>scCsb||krtS|stS|rN|rN|ddkrN|d|dkrNtS||�r^tStS(Nit?t*t[(R"R#R$(tTruetFalse(tmatchtregexp_matchtn((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_parse_pkg_nBs0c
Cs�|d}|std��||kr,tS|rt|rt|ddkrt|d|dkrt|d|dkrttSd|krd||f|d<d ||||f|d
<d||f|d<d
|||f|d<d|||||f|d<d|||||f|d<nt||d|d
|d|d|d|dg�}||kr_tS|sitSx|D]}||�rptSqpWtS(NR)sNothing in epochiR"R#R$tnameArchs%s.%ss%s-%s-%s.%stnameVerRelArchs%s-%stnameVers%s-%s-%st
nameVerRels%s:%s-%s-%s.%stenvras%s-%s:%s-%s.%stnevra(R"R#R$(tAssertionErrorR%R&tset( R'R(tdataRtvtrtaR)titem((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt
_parse_pkgNs0
(
cCs�tr n�|dkr:t|||||||�r�tSng|dkrct|||d�r�tSn>|dkr�t|||�r�tSn|dkr�d |kr�d
|d|||f|d <n||d kr�tSn�|dkr1d
|krd|d||||f|d
<nt|||d
�r�tSnp|dkrT|d|kr�tSnM|dkr�d |kr�d
|d|||f|d <n|d |kr�tSn�|dkr�d
|kr�d|d||||f|d
<n|d
|kr�tSn�|dkr||dkr�tSn�|dkr=|d|kr�tSnd|dkrZ|dr�tSnG|dkrw|ds�tSn*|dkr�tSts�td|��dStS(NteqR'sname.eqs
name.matchR)sarch.eqs
arch.matchsnevr.eqtnevrs%s-%s:%s-%ssnevra.eqsnevra.matchR0s%s-%s:%s-%s.%ssname.insnevr.insnevra.ins pkgtup.eqtpkgtups pkgtup.intmarkedtwashedR#sBad excluder: (R9smatch(sname.eqs
name.match(sarch.eqs
arch.match(snevra.eqsnevra.match(R&R8R%R*R1tNone(texcluderR'R(R3RR4R5R6((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_excluder_matchmsf!$!$
ccsOd}xB|D]:}|dkr,||}n|||krBq
n|Vq
WdS(sEliminate duplicate rows from cursor based on field.
Assuming the result set can be divided into one or more equivalent groups
of rows based on the given field, this wrapper will yield rows from only
one of the groups, avoiding duplicates.
N(R>(tcurtfieldt first_valtob((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_deduplicate�s
tYumAvailablePackageSqlitecBs�eZd�Zedd��Zdd�Zed��Zd�Z d�Z
d�Zd�Zd �Z
d
ed�Zed�Zd
d
�Zed�Zd�ZRS(cCs�idd6dd6dd6d d6|_|j|_|j|_||_d|_t|_d|_ |j
|�|jdkr�d|_n|j|_|j
|_|j|_|j|j|j|j
|jf|_d|_d|_dS(
Nt obsoletest conflictstrequirestprovidest0(((((tprcotsacktidtrepoidtrepoR>tstateR&t_loadedfilest_filest_read_db_objtepochtpkgIdtversiontvertreleasetreltnametarchR;t
_changelogt_hash(tselfRPtdb_obj((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt__init__�s&
' tfgetcCs
|j�S(N(t
_loadFiles(R_((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt<lambda>�scCs�|r0y||SWq0ttfk
r,d SXnxXddddddgD]>}yt||t||��WqIttfk
r�qIXqIWy@|d|_t|d�}||dtf}|g|_Wnttfk
r�nXd S(
swread the db obj. If asked for a specific item, return it.
otherwise populate out into the object what existsR[R\RURWRYtpkgKeyRVt
checksum_typeN(t
IndexErrortKeyErrorR>tsetattrR!RVR%t
_checksums(R_R`R7Rft check_sum((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRT�s"
cGs=t|j|d�|j}|j�}t|||�|S(s6 Exec SQL against an MD of the repo, return a cursor. tdb(tgetattrRMRPtcursorR(R_tMDtsqlRtcacheRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_sql_MD�scCs�idd6dd6dd6dd6d d
6dd6d
d6dd6dd6dd6dd6dd6dd6dd6dd6dd 6}|jd!�r�|jd!�r�t|�n|j||�}y)|jd"d#||jf�j�}Wn@tjk
r}t |�jd$�rt
t |��n�nX|d%}|d&krI|dkrId'}n|d-krj|dkrjd*}n|i d+d6d+d6d+d6d+d6d+d6d+d(6d+d)6d+d6d+d,6kr�t|�}nt
|||�|S(.Ntsize_packagetpackagesizetsize_archivetarchivesizetsize_installedt
installedsizet
time_buildt buildtimetrpm_header_startthdrstarttrpm_header_endthdrendt
location_basetbasepatht
location_hreftrelativepatht time_filetfiletimetrpm_packagertpackagert rpm_grouptgroupt
rpm_buildhostt buildhostt
rpm_sourcerpmt sourcerpmt
rpm_vendortvendortrpm_licensetlicenseRVtchecksum_valuet__tprimarys'SELECT %s FROM packages WHERE pkgId = ?sno such columniRURKtsummarytdescriptiontiturl(R�R�(t
startswithtendswithtAttributeErrortgetRrRVtfetchoneRRRRhR>R!Ri(R_tvarnametdb2simplemaptdbnameR5RR ((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt__getattr__�sN
c Cs'|jr|jSi}|jj|jdd�|jdd|jf�}x�t|d�D]�}|d}|dkrd}n#|r�|dd kr�|d 7}nt|d
�}t |d�}xE|r ||j
�}t|j
��}|j|g�j
|�q�WqZWt|_||_|jS(Ntmdtypet filelistssrSELECT pkgKey, dirname, filetypes, filenames FROM filelist JOIN packages USING(pkgKey) WHERE packages.pkgId = ?Retdirnamet.R�i����t/t filetypest filenames(RRRSRMtpopulateRPRrRVREtdecodefiletypelisttdecodefilenamelisttpopR!t
setdefaulttappendR%( R_tresultRARDR�R�R�tfilenametfiletype((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRc6s,
! cCs�g}|js�|j|jjkrey|jj|jdd�Wqetjk
ra||_dSXn|jdd|jf�}xet |d�D]T}d|dd}t
|d�}t
|d �}|j|t|�|f�q�W||_dSdS(
NR�t otherdatatotherswSELECT pkgKey, date, author, changelog FROM changelog JOIN packages USING(pkgKey) WHERE pkgId = ? ORDER BY date DESCReidtdatetauthort changelog(
R]RPRMtotherdbR�RRRrRVRERR�R!(R_R�RARDtc_datetc_authortc_log((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_loadChangelogSs$ cCs|j|jfS(N(RfRV(R_((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytreturnIdSumrscCs|j�|jS(N(R�R](R_((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytreturnChangelogus
tfilecCsa|rD|jrDd}|jd||j|f�}td�|�S|j�tj|||�S(s}return list of files based on type, you can pass primary_only=True
to limit to those files in the primary repodatas=SELECT name as fname FROM files WHERE pkgKey = ? and type = ?R�cSs|dS(Ntfname((tx((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRds(RRRrRetmapRcRtreturnFileEntries(R_tftypetprimary_onlyRpRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyR�ys
cCsX|rA|jrAd}|jd||jf�}td�|�S|j�tj|�S(s�return list of types of files in the package, you can pass
primary_only=True to limit to those files in the primary repodatas9SELECT DISTINCT type as ftype FROM files WHERE pkgKey = ?R�cSs|dS(NR�((R�((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRd�s(RRRrReR�RcRtreturnFileTypes(R_R�RpRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyR��s
cCsMtjdtjdd�d}|jd||j|f�}td�|�S(Ns_simpleFiles() will go away in a future version of Yum.Use returnFileEntries(primary_only=True)
t
stacklevelis=SELECT name as fname FROM files WHERE pkgKey = ? and type = ?R�cSs|dS(NR�((R�((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRd�s(twarningstwarnRtYumDeprecationWarningRrReR�(R_R�RpRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytsimpleFiles�s
cCst|�}|dkr!d}nt|j|t�r�d|}|jd||jf�}g|j|<x�|D]z}|ds�qpnt|d�t|d�t|d�t|d�t|d �ff}|j|jt|��qpWntj|||�S(
Ntstrong_requiresRIsDSELECT name, version, release, epoch, flags FROM %s WHERE pkgKey = ?R�R[tflagsRURWRY( R!t
isinstanceRLttupleRrReR�Rt
returnPrco(R_tprcotypet printableRpRARDtprco_set((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyR��s"
!cCs�d}|jd||jf�}g}x�|D]�}d}|dj�d
krYd}nt|d�t|d �t|d
�t|d�t|d�f|f}|j|�q.W|S(s%returns requires with pre-require bitsNSELECT name, version, release, epoch, flags,pre FROM requires WHERE pkgKey = ?R�RKtprettrueit1R[R�RURWRY(R�i(RrRetlowerR!R�(R_RpRARIRDR�R�((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_requires_with_pre�s
N(Rt
__module__RatpropertytfilesR>RTRRrR�RcR�R�R�R&R�R�R�R�R�(((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRF�s 9 tYumSqlitePackageSackcBs�eZdZd�Zed��Zd�Zd�Zd�Zd�Z ed��Z
d�Zd d
�Zd�Z
d�Zd
�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zed�Zed�Zd�Zd�Zd<d�Zdd�Zd<ed�Z d�Z!ed��Z"ed��Z#d �Z$eed!��Z%ed"��Z&ed#��Z'eed$��Z(ed%��Z)ed&��Z*ed'��Z+ed(��Z,d<d=d)�Z-d<d>d*�Z.eged+��Z/ed,��Z0d-�Z1d.�Z2d/�Z3d0�Z4ed1�Z5ed<d<ed2��Z6ed<d<ed3��Z7ed4��Z8d<d<ed5�Z9d6�Z:ed<d<ed7��Z;d<d<ed8�Z<ed<ed9��Z=ed<d<d<d<d<d:��Z>ed;��Z?RS(?s~ Implementation of a PackageSack that uses sqlite cache instead of fully
expanded metadata objects to provide information cCs�tjj||�i|_i|_i|_i|_t�|_t�|_ i|_
iid6id6|_i|_i|_
i|_t�|_t�|_t�|_d|_g|_i|_t|_dS(NRJRI(tyumRepotYumPackageSackRat primarydbtfilelistsdbR�texcludesR2t _excludest_exclude_whitelistt
_all_excludest
_search_cachet_key2pkgt_pkgname2pkgkeyst_pkgtup2pkgst_pkgnames_loadedt_pkgmatch_failst_provmatch_failsR>t
_arch_allowedt_pkgExcludert_pkgExcludeIdsR&t_pkgobjlist_dirty(R_tpackageClass((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRa�s*
cGs7t||d�|}|j�}t|||�|S(s6 Exec SQL against an MD of the repo, return a cursor. Rl(RmRnR(R_RoRPRpRRqRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRr�scCs#d}|jd||�j�dS(s- Give a count of pkgIds in the given repo DB s!SELECT count(pkgId) FROM packagesR�i(RrR�(R_RoRPRp((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_sql_MD_pkg_num�scsUt�d�st��jrNt�fd��j�}|�_t�_n�jS(s{ If the pkgobjlist is dirty (possible pkgs on it which are excluded)
then clean it, and return the clean list. t
pkgobjlistcs�j|�S(N(t_pkgExcluded(R�(R_(s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRd�s(RR1R�tfilterR�R&(R_tpol((R_s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_clean_pkgobjlist�s cCs�t}x6|jj�D]%\}}||jkrt}PqqW|rIdSt|d�rht|j��Sd}x(|jD]}|t|j|�7}qxWd}x'|jD]}||j d|�7}q�W||S(NiR�R�(
R%R�titemsR�R&RtlenR�R�R�(R_tall_excludedRPRqtexclude_numtpkg_num((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt__len__�s cCs�t|d�r|`nt|d�r0|`nt|d�rH|`nt|_i|_i|_t�|_ t�|_
t�|_i|_iid6id6|_
tj�dS(Nt_memoize_requirest_memoize_providesR�RJRI(RR�R�R�R&R�R�R�R2R�R�R�R�R�Rtunshare_data(R_((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytdropCachedData
s"
cCs�|j�x;|jj�|jj�|jj�D]}|j�q4Wi|_i|_i|_i|_t�|_t�|_ i|_
g|_i|_t
|_tjj|�dS(N(R�R�tvaluesR�R�tcloseR�R2R�R�R�R�R�R&R�R�R�(R_tdataobj((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRs
cCsdS(N((R_((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytbuildIndexes3sterrorcCsdS(N((R_tfailure((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt
_checkIndexes8scs�|jj||f�||jkr�|j|j|d���dk r�|j�j}t�fd�|�}||j�j<q�ndS(st Exclude a package so that _pkgExcluded*() knows it's gone.
Note that this doesn't update self.exclude. cst|�t��kS(N(RN(R�(tpo(s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRdDsN(R�taddR�R�R>R�R;R�(R_RPRetpos((Rs2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt
_delPackageRK;scCs�|j|jkr%i|j|j<nd|j|j|j<|j|jf|jkrv|jj|j|jf�n|j|j|j�t|_dS(Ni( RPR�RVReR�tdiscardR R%R�(R_tobj((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt
delPackageJscCset|j|<||jkr)|j|=n||jkrE|j|=n||jkra|j|=ndS(s% Exclude all packages from the repo. N(R%R�R�R�R�(R_RP((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_delAllPackagesSs
cCs=||jkrtS||jkr9||j|kr9tStS(N(R�R%R�R&(R_RPRV((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt _excluded]s
"cCs8|jr||jkrtS|jo7||f|jkS(N(R�R%R�(R_RPRe((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_pkgKeyExcludedfsc
Cs�|jr"||f|jkr"tS|j||�r8tS|jdk rj||jkrj|j||�tS|jswtSi|j�d6|||||fd6td6}|j�}|j�}|j�}|j�}x�|jD]�\} }
}}| dk r| |j krq�n|
j
dd�}
t|
�dkrTts�td|
��q�n|
\}}triq�|dkr�t
||||||||�r�|j||�tSq�|d kr�t
||||||||�r�Pq�q�|d
kr+|dr�q�t
||||||||�r�t|d<q�q�|dkru|dsDq�t
||||||||�r�t|d<q�q�ts�td|
��q�W|jj||f�tS(
s Main function to use for "can we use this package" question.
. Tests repo against allowed repos.
. Tests pkgKey against allowed packages.
. Tests arch against allowed arches.
. Tests addPackageExcluder() calls.
R)R;R<R�iisBad excluder: texcludetincludetmarktwashN(R�R&RR%R�R>R R�R�RNtsplitR�R1R@R(R_RPReR)RR4R5R6R3ROR?R'R(texSPLITtexTtexM((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_pkgExcludedRKNEVRAlsX 0!!
!
!c Cs4|\}}}}}|j|||||||�S(sb Helper function to call _pkgExcludedRKNEVRA.
Takes a repo, pkgKey and a package tuple(R( R_RPReR;R)R6RR4R5((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_pkgExcludedRKT�sc CsW|d|d|d|d|df\}}}}}|j|||||||�S(si Helper function to call _pkgExcludedRKNEVRA.
Takes a repo, pkgKey and a dict of package dataR[R\RURWRY(R( R_RPReR3R)R6RR4R5((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_pkgExcludedRKD�s*cCs|j|j|j|j�S(sR Helper function to call _pkgExcludedRKNEVRA.
Takes a package object. (RRPReR;(R_R((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyR��scGs�|dk r||jkrdSd}d}tr4nS|jd�rnt|�dks[t�|dj�}n|jd�r�t|�dks�t�|d}n�|jd�r t|�dks�t�|dj�}tj|�r�t j
tj|��j
}q�n~|jd�r3t|�dks�t�nT|jd�r]t|�dks�t�n*|jd �r�t|�dks�t�n|jj||||f�|dk r�t|j�|j|<nt�|_t|_dS(
s� Add an "excluder" for all packages in the repo/sack. Can basically
do anything based on nevra, changes lots of exclude decisions from
"preload package; test; delPackage" into "load excluder".
Excluderid is used so the caller doesn't have to track
"have I loaded the excluder for this repo.", it's probably only
useful when repoid is None ... if it turns out utterly worthless
then it's still not a huge wart. Ns.eqiis.ins.matchs.*s.markeds.washed(R>R�R&R�R�R1R�Rtre_globtretcompiletfnmatcht translateR'R�R�R2R�R%R�(R_ROt
excluderidR?RR'R(((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytaddPackageExcluder�s8
!c Cs�|st�|r(|j||�r(dS||jkrTi|j|<i|j|<n||j|krGd}|jd|||f�j�}|dkr�d||f}tj|�n|r�|j |||�r�dS|j
||�}||j||<|jj|j
g�j|�|j|j|dg�}|j|�n4|r{|j|j||�r{|j||�dS|j||S(s: Lookup a pkg by it's pkgKey, if we don't have it load it sXSELECT pkgKey, pkgId, name, epoch, version, release, arch FROM packages WHERE pkgKey = ?R�s"pkgKey %s doesn't exist in repo %sR[N(R1RR>R�R�RrR�RRRtpcR�R�R;R�R�R ( R_RPReRRpR3tmsgRtpkgkeys((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt
_packageByKey�s.
! cCs�|st�|r+|j|||�r+dS||jkrWi|j|<i|j|<n|d|jj|i�kr�|j||�}||j||<|jj|j g�j
|�|j|j|dg�}|j
|�n|j||dS(s= Like _packageByKey() but we already have the data for .pc() ReR[N(R1RR>R�R�R�R"R�R�R;R�(R_RPReR3RRR$((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_packageByKeyDatas
cCs�|j|||�rdS|jj|�}|dkrTi|j|<i|j|<n|d|krs||djS|d|d|d|d|dfS(sb Like _packageByKeyData() but we don't create the package, we just
return the pkgtup. ReR[R\RURWRYN(RR>R�R�R�R;(R_RPReR3tprepo((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_pkgtupByKeyDatas
cCs�g}x�|jD]u}|jj|i�j|g�}|sCqnx?|D]7}|j||�}|dkrtqJn|j|�qJWqW|S(s2 Load all pkgnames from cache, with a given name. N(R�R�R�R%R>R�(R_tpkgnametretRPR$tpkgkeytpkg((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_packagesByName#s!
cCs�||jkr)||j|kr6dSn
g|j|<||jkrUi|j|<n|dkrztjd||f�n|dkr�||j|<nN|dkr�||j|<n2|dkr�||j|<ntjd||f�|j|j|�dS(NsTried to add None %s to %stmetadataR�R�s&Sorry sqlite does not support %s in %s( taddedR�R>RRR�R�R�R�(R_RPtdatatypeRtcallback((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytaddDict2s
tlikecCs|j|d�S(NRJ(t
searchPrco(R_R[t
query_type((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt searchAllOscCs�|dkrg}nxe|D]]}|rD|j||d|�}n|j||d�}|dkrlqn|j|�qW|S(sB Takes a cursor and maps the pkgKey rows into a list of packages. ReN(R>R&R%R�(R_RPRAtpkgst have_dataRDR,((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_sql_pkgKey2poSs
cCs7t}x*|jD]}||jkrt}PqqW|S(s6 Are we going to skip every package in all our repos? (R%R/R�R&(R_tskip_allRP((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt _skip_all`scCs�d}tjj|�}tj|�s0d}ng}xh|jj�D]W\}}||jkrgqFn|j�}t |d||f�|j
|||�qFWtj|�S(Ntglobt=s1select DISTINCT pkgKey from files where name %s ?(tostpathtnormpathRRR�R�R�RnRR9tunique(R_R[t querytypetresultstrepRqRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_search_primary_filesis cCshxa|jj�D]P\}}||jkr1qn|j�}t|d�x|D]}PqQWtSqWtS(s� Return true if pkg.returnFileEntries(primary_only=True) is fast.
basically does "CREATE INDEX pkgfiles ON files (pkgKey);" exist. sPRAGMA index_info(pkgfiles)(R�R�R�RnRR&R%(R_RDRqRARD((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_have_fastReturnFileEntrieszs
cCs(t|d�s!|j�|_n|jS(sb Is calling pkg.returnFileEntries(primary_only=True) faster than
using searchFiles(). t_cached_fRFE(RRFRG(R_((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pythave_fastReturnFileEntries�scs�|j�rgSt}t�d}tjj|�}tjj|�}tjj|��|sntj|�r�t }t �d}ntj��s�t �n|ddkr�|d }ng}tj
|�r�|j|�St|j
�dkr:xH|jj�D]4\}}||jkr q�n|j|dd�q�Wnxk|j
D]`}t|d�r_qDn|jd |�} |jd|�}
| |
kr�tj�nt|_qDWg}d
}|s�t��\}
}d|}|j|�|jd|
d�n��sBt��\}
}d
|}|j|�|jd|
d�n��dkr�xu|j
j�D]d\}}||jkrq^n|j�}|j|�t|d|f|�|j|||�q^Wtj|�Sx�|j
j�D]�\}}||jkrq�n|j�}t|d||f|d|g�|j|||��rhtjtj |���n���fd�}|j!dd|�t|d||�|j|||�q�Wtj|�}|S(sYsearch primary if file will be in there, if not, search filelists, use globs, if possibleR<R=i����R�iR�R�t_checked_filelists_pkgsR�R�s(dirname = ? and filenames LIKE ? %s and t%s+dirname GLOB ? and filenames LIKE ? %s and R#sQSELECT pkgKey FROM filelist
WHERE dirname %s ?s�select pkgKey from filelist where %s length(filetypes) = 1 and dirname || ? || filenames %s ?cse|jd�}�s%t�|k�St�fd�|�}x!|D]}�j|�rDdSqDWdS(NR�csd�|fS(Ns%s/%s((tf(tsql_dirname(s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRd�sii(RtintR�R'(RLt
sql_filenamesR�tfnsR'(t file_globR�tname_re(RLs2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytfilelist_globber�s
RRis�select pkgKey from filelist where %s length(filetypes) > 1 and filelist_globber(dirname,filenames)("R;R%R>R?R@R�tbasenameRRR&tre_primary_filenameRER�R�R�R�R�R�RR�RRRIRR�RnRR9RARRRRtcreate_function(R_R[tstrictR<RBR�R7RPRqtpri_pkgstfil_pkgst
sql_paramst
dirname_checktpatterntescRDRARR((RPR�RQs2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytsearchFiles�s�
c
Cs�|j�rgSg}t|�dkr,|S|jdd�}t|�\}}d|d||f}x(|dD]}d||||f}qrWxI|jj�D]8\}}|j�} t| |�|j|| |�q�W|S(s7search arbitrary fields from the primarydb for a stringit's''s>select DISTINCT pkgKey from packages where %s like '%%%s%%'%s is%s or %s like '%%%s%%'%s ( R;R�treplaceRR�R�RnRR9(
R_tfieldstsearchstringR�R\RpRKRDRqRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytsearchPrimaryFieldss
cCs|j�rgSg}|s$|r(|St|�tjt|�kr�i}xK|D]C}|j||�}x(|D] }|j|d�d||<qsWqTWx:t|dtjdt �D]}|j
|||f�q�W|Sd}d} g}
x�|D]y}|jdd�}t|�\}}d |d||f}
x(|dD]}d
|
|||f}
qAW|
j
|
�q�W|dj
|
�| }x�|jj�D]u\}}|j�}t||�xM|D]E}|j||d�}|dkr�q�n|j
||d
f�q�Wq�W|S(s�search arbitrary fields from the primarydb for a multiple strings
return packages, number of items it matched as a list of tuplesiitkeytreverses*select pkgKey, SUM(cumul) AS total from ( s$)GROUP BY pkgKey ORDER BY total DESCR^s''s@select pkgKey,1 AS cumul from packages where %s like '%%%s%%'%s s%s or %s like '%%%s%%'%s s UNION ALL RettotalN(R;R�t constantstPATTERNS_MAXRbR�tsortedtoperatort
itemgetterR%R�R_RtjoinR�R�RnRR%R>(R_R`t
searchstringsR�ttotRatmatchesRtunionstringtendunionstringtselectstsR\RpRKttotalstringRDRqRARDR,((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt"searchPrimaryFieldsMultipleStrings)sD
""
c Csu|j�riS|r"t��ni}xF|jj�D]5\}}|j�}t|d�x
|D]}t|d�t|d�t|d�t|d�t|d�f}|j||d|�r�qdnt|d�t|d �t|d
�t|d�t|d�f\}} }
}}t|�}t|| |
||ff�}
|j|g�j |
�qdWq8W|S(
Ns�select packages.name as name, packages.pkgKey as pkgKey, packages.arch as arch, packages.epoch as epoch, packages.release as release, packages.version as version, obsoletes.name as oname, obsoletes.epoch as oepoch, obsoletes.release as orelease, obsoletes.version as oversion, obsoletes.flags as oflags from obsoletes,packages where obsoletes.pkgKey = packages.pkgKeyR[R\RURWRYRetonametoflagstoepochtoversiontorelease(
R;tNotImplementedErrorR�R�RnRR!RR�R�(R_tnewestRGRDRqRARDRcR)RKRR4R5tval((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytreturnObsoletes]s0
"!cCsUxN|jj�D]=\}}|j�}t|d|f�x|D]}|SWqWdS(Ns&select * from packages where pkgId = ?(R�R�RnR(R_RVRDRqRARD((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytgetPackageDetails�s
cCs�g}t|�dkr|Stt|��}x[|jj�D]J\}}|j�}t|d|f�x|D]}|j|�qqWq>W|S(Nis(select * from packages where pkgId in %s(R�RR�R�R�RnRR�(R_t
pkgId_listR7tpkgid_queryRDRqRARD((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_getListofPackageDetails�s
c
Cs?t|d|�s.i}x�|jj�D]�\}}||jkrJq)n|j�}t|d|�x�|D]�}t|d�t|d�t|d�t|d�t|d�ff}t|�}||df}t|d �} | |f}|j|g�j|�qnWq)Wt |d||�nt
|d|�S(
Nt _memoize_sselect * from %sR[R�RURWRYiRe(RR�R�R�RnRR!R�R�RiRm(
R_R�tmemoizeRDRqRAR�R|RcR+((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_search_get_memoize�s$
!c Cs|j�riSt|�}|dkr1d}nt|�ttd�tfkrp||tjj|�f}n*t|�t t
fkr�|||f}nt|�}t|�}||j|kr�|j||Si}t
r�|jj�}t}ng}t
}|j|�} x�|jj�D]�\}
}|
|jkrDq#ni}x]| j|
|fg�D]C}
|
\}}tjj||�rc|j|g�j|�qcqcWxH|j�D]:\}}|j|
|�}|dkr�q�n|||<q�Wq#Wx9|D]1\}
}|
|jkr!qn|j�}t|d||f�i}x�|D]�}
t|
d�t|
d�t|
d�t|
d�t|
d�ff}t|�}tjj||�rQ|j|
dg�j|�qQqQWxH|j�D]:\}}|j|
|�}|dkr#q�n|||<q�WqW|d ksQ|dd
kro|sk||j||<n|Stj|�s�x3|j|dt
�D]}|ddfg||<q�W|s�||j||<n|Sx>|j|�D]-}|ddfg||<||j||<q�W|S(Nisselect * from %s where name=?R[R�RURWRYReRJR�RV(R;R R>ttypeRtunicodetrpmUtilst miscutilststringToVersionR�tlistR!R�R%R�R�R&R�R�R�trangeCompareR�R�t iteritemsR%RnRRRTR]RE(R_R�R[R�RWtreqR�tprimarydb_itemstpreloadR�RDRqttmpR�R+R|RethitsR,RA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_search�s� !
$cCs|jd|||�S(NRJ(R�(R_R[R�RW((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytgetProvidesscCs|jd|||�S(NRI(R�(R_R[R�RW((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytgetRequiresscCs0|j�rgSt|d�}g}t|�}g}x^|D]V}||jkrYq>n|sn||jkr�|j|j|��q>|j|�q>W|r�g|D]}|j^q�}n|s�|St j
}t|�|krx0t||�D]}|j|j
||��q�W|Sg} d}
x|D]}| jd�q,W|
dj| �}
x�|jj�D]�\}}
|
j�}t||
|�|r�xF|D]>}|j||d|�}|dkr�q�n|j|�q�Wqfn|j|||dt�qfW|s,|jjg|D]}|^q�n|S(syreturn a list of packages matching any of the given names. This is
only a match on package name, nothing elseR�s^select pkgId,pkgKey,name,epoch,version,release,arch
from packages where sname = ?s OR ReR8N(R;RR2R�R�textendR-R�R;RftPATTERNS_INDEXED_MAXR�RtsearchNamesRkR�R�RnRR(R>R9R%R(R_tnamestreturn_pkgtupstloaded_all_namest
returnListt
user_namesR)R,tmax_entriestpat_sqlstqsqlR[RPRqRARDR;((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyR�sP
&c Cs|j�rgSy%tj|�\}}\}}}Wn(tjk
r_}tjt|��nX|}t|�} | }t}
d}tj|�s�t }
d}ng}g}
xY|j
j�D]H\}}|j�}t
|d||f|f�|j|||�q�Wx�|D]~}tj|�rE|dkrE|
j|�qn|
s�|j||||||ff�r�|
j|�q�q|
j|�qW|dkr�|
Stj|�s�|
S|
j|j|��tj|�r�|
r�tj|
�S|
j|j|��tj|
�S(s3return list of packages matching name and prcotype R<R=s.select DISTINCT pkgKey from %s where name %s ?RJN(R;Rtstring_to_prco_tupleRt MiscErrortPackageSackErrorR R%RR&R�R�RnRR9tre_filenameR>R�t checkPrcoR�RERTRAR](R_R[R�R)RKRR4R5tn_btn_uR<RBt
basic_resultsRCRDRqRAR((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyR4NsJ%
$
cCsB||jkrgS|j|d�}|s>|jj|�n|S(s9return list of packages providing name (any evr and flag)RJ(R�R4R(R_R[R*((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytsearchProvides�scCs|j|d�S(s9return list of packages requiring name (any evr and flag)RI(R4(R_R[((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytsearchRequires�scCs|j|d�S(s:return list of packages obsoleting name (any evr and flag)RG(R4(R_R[((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytsearchObsoletes�scCs|j|d�S(s@return list of packages conflicting with name (any evr and flag)RH(R4(R_R[((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytsearchConflicts�scCs�dGHdd1d��Y}|�}|d|d|d|d|df|_||_|d |_|rm|Si|d
d6|dd
6|_i|dd6dd6|dd6|_idd6|dd6|d d6|_i|dd6|dd6|_i|dd6|dd6|d d!6|_i |d"d"6|d#d#6|d$d%6|d&d'6|d(d)6|d*d+6|d,d,6|d-d.6|d/d06|_|S(2Nsdie die die die die db2classt tmpObjectcBseZRS((RR�(((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyR��sR[RURWRYR\RVR{tstartR}tendR�threfR�R RtbasetYEStpkgidRfR�RytbuildR�R�RstpackageRutarchiveRwt installedR�R�R�R�R�R�R�R�R�R�R�R�R�R�R�(( R0RMRVthdrangetlocationtchecksumttimetsizetinfo(R_Rlt
nevra_onlyR�ty((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytdb2class�s& ,
&*'cCs�|stjj||||�Sg}xR|jj�D]A\}}|j�}t|d|�|j|||dt�q5W|s�t j
d|�ntj|�S(NsYselect pkgId,pkgKey,name,epoch,version,release,arch from packages where name=? and arch=?R8sNo Package Matching %s.%s(
R�R�treturnNewestByNameArchR�R�RnRR9R%RR�RtnewestInList(R_tnaTuptpatternstignore_casetallpkgRDRqRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyR��scCs�|j�rgS|s/tjj||||�Sg}xU|jj�D]D\}}|j�}t|d|f�|j|||dt �qEW|s�t
jd|�ntj
|�S(sBreturn list of newest packages based on name matching
this means(in name.arch form): foo.i386 and foo.noarch will
be compared to each other for highest version.
Note that given: foo-1.i386; foo-2.i386 and foo-3.x86_64
The last _two_ pkgs will be returned, not just one of them. sNselect pkgId,pkgKey,name,epoch,version,release,arch from packages where name=?R8sNo Package Matching %s(R;R�R�treturnNewestByNameR�R�RnRR9R%RR�RR�(R_R[R�R�R�RDRqRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyR��s cCs>|j�rgggfSg}g}t|�}x�|D]�}tj|�rntidd6|d6}|}ntidd6|d6}|}xq|jj�D]`\}} | j�}
t|
|�|j ||
�}t
|�r�|j|�n|j|�q�Wq8Wtj
|�}tj
|�}tj
|�}|||fS(NR<toptqR=(R;R�RRtPARSE_QUERYR�R�RnRR9R�tremoveR�RA(R_tpkgspecstmatchedt
exactmatcht unmatchedtptquerytmatchresRDRlRAtpmatches((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytmatchPackageNames�s,
c
Cs^|d
krg}ndddddddg}t}x<|D]4}tj|�r=|sg||jkr=t}Pq=q=Wtj}|s�dg}tj}nt |�|kr�g}n|r�t
|�}n�g}t} xL|D]D}tj|�r
|j|df�t} q�|j|d f�q�W|rH| rH|rH|||tfS|}|||tfS(szSetup need_full and patterns for _yieldSQLDataList, also see if
we can get away with just using searchNames(). R[tsql_nameArchtsql_nameVerRelArchtsql_nameVertsql_nameVerRelt sql_envrat sql_nevraR<R=N(
R>R&Rtre_full_search_neededR�R%RfRgR�R�RRR�(
R_ROR�R�R`t need_fulltpattpat_maxR�t need_glob((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_setupPkgObjLists<
ccsAg}g}x�|D]}\}}|r;||jkr;qnxR|D]J} |rh|jd| |f�n|jd| |f�|j|�qBWqW|r�|r�dS|r�tdj|�}
nd}
xs|jj�D]b\}}|dks�||jkr�|j�}
t |
|
|�x|
D]}||fVq!Wq�q�WdS(s^Yields all the package data for the given params. Excludes are done
at this stage. s%s LIKE ?%ss%s %s ?Ns OR sYselect pkgId, pkgKey, name,epoch,version,release,arch
from packages(
R�R�t_FULL_PARSE_QUERY_BEGRkR�R�R>RNRnR(R_ROR�R`R�R�tpat_dataR[trestRBR�RPRqRAR�((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_yieldSQLDataList7s*
cCs�g}|j|||�}|\}}}}|r@|j|�Sx^|j||||�D]D\} }
|j| |
d|
�}|dkr�qYn|j|�qYW|r�|dkr�||_t�|_n|r|dkr|jj g|D]}|j
^q��n|rqx`|D]U\}}
|
dkr3qnx4|D],}|j
|kr:|jj|j
�Pq:q:WqWn|s�x'|D]\}}
|jj|�q~Wn|S(sjBuilds a list of packages, only containing nevra information.
Excludes are done at this stage. ReR=R�N(R=R�(
R�R�R�R&R>R�R�R2R�RR[RR�(R_ROR�R�R�R3R�R`R�RPR�RR�R�R,((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_buildPkgObjListWs8
)
cCs�|j�rgSt|d�}|r4|j�}n$|j|||�}t|d�}|r�|r�t}t|||dd�}|d|d}n|dkr�|r�|}n|Sg}x0|D](}||jkr�q�n|j|�q�W|S(s�Returns a list of packages, only containing nevra information. The
packages are processed for excludes. Note that the packages are
always filtered to those matching the patterns/case. R�RAsrepo-pkgkeyiiN( R;RR�R�R&RR>ROR�(R_ROR�R�tinternal_pkgoblistR�R�R((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytreturnPackages~s,
cCs�|j�rgSt|d�}|r;tjj|||�Sd}g}|j|||�}|\}}}} | r�g|j|�D]}
|
j^q�Sx^|j ||||�D]D\}}|j
||d|�}
|
dkr�q�n|j|
�q�W|S(s�Returns a list of pkg tuples (n, a, e, v, r), optionally from a
single repoid. Note that the packages are always filtered to those
matching the patterns/case. R�ReN(R;RR�R�t
simplePkgListR>R�R�R;R�R(R�(R_R�R�R�ROR�R3R�R`R�R,RPR�R;((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyR��s&#cCs�|j�rgSg}|r�x�|jd|g�D]�}t}x]d|fd|fd|fd|fgD]1\} }
|
rit|| �|
krit}PqiqiW|r2|j|�q2q2W|St}x,|||||fD]}|r�t}q�q�W|r�|Sd}
x�d|fd|fd|fd|fd|fgD]P\} }
|
r5|
dd krn|
d
| |
f}
q�|
d| |
f}
q5q5WxO|jj�D]>\}}|j�}t ||
�|j
|||dt�q�W|S(
s6return list of pkgobjects matching the nevra requestedR�RURWR\RYsGselect pkgId,pkgKey,name,epoch,version,release,arch from packages WHERER[i����tWHEREs AND %s = "%s"s
%s = "%s"R8(R;R�R%RmR&R�R�R�RnRR9(R_R[RURXRZR\R�R,R'tcoltvartemptytargR�RDRqRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytsearchNevra�s@"
"
c Cs|jdkr!t|�|_n|jj|�|_td�|�}dj|�}x�|jj�D]�\}}|j�}|j j
d�sgd|jkr�qgnt}t|d�x(|D] }|d|kr�t
}Pq�q�W|sg|j|�dSqgWdS(sBexcludes incompatible arches - archlist is a list of compat archescSsd|S(Ns'%s'((R�((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRd�st,s-sourcetsrcs"SELECT DISTINCT arch FROM packagesiN(R�R>R2tintersectionR�RkR�R�RnRNR�R&RR%R
( R_tarchlistt sarchlistt
arch_queryRDRqRAthas_archtrow((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytexcludeArchs�s$"
N(NNN(NNN(@RR�RRaRRrR�R�R�R�RRRR RR
RRRRRR�R!R%R%R&R(R-R>R2R6R&R9R;RERFRHR]RbRtR}R~R�R�R�R�R�R�R4R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�(((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyR��s�
A )
}4%[;A ( &#,cCs
dj|�S(NR�(Rk(tfilenamelist((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytencodefilenamelist
scCs|jdd�}|jd�S(Ns//R�(R_R(tfilenamestring((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyR�scCsDd}idd6dd6dd6}x|D]}|||7}q(W|S(NR�RKR�tdtdirtgtghost((tfiletypelistR�t ft2stringR�((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytencodefiletypelists
cCs6idd6dd6dd6}g|D]}||^q"S(NR�RKR�R�R�R�((tfiletypestringt string2ftR�((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyR� ss�
select pkgKey from packages
where name %(op)s '%(q)s'
or name || '.' || arch %(op)s '%(q)s'
or name || '-' || version %(op)s '%(q)s'
or name || '-' || version || '-' || release %(op)s '%(q)s'
or name || '-' || version || '-' || release || '.' || arch %(op)s '%(q)s'
or epoch || ':' || name || '-' || version || '-' || release || '.' || arch %(op)s '%(q)s'
or name || '-' || epoch || ':' || version || '-' || release || '.' || arch %(op)s '%(q)s'
s�
SELECT pkgId,pkgKey,name,epoch,version,release,arch,
name || "." || arch AS sql_nameArch,
name || "-" || version || "-" || release || "." || arch AS sql_nameVerRelArch,
name || "-" || version AS sql_nameVer,
name || "-" || version || "-" || release AS sql_nameVerRel,
epoch || ":" || name || "-" || version || "-" || release || "." || arch AS sql_envra,
name || "-" || epoch || ":" || version || "-" || release || "." || arch AS sql_nevra
FROM packages
WHERE
(*R>tos.pathRR�tpackagesRRRRRRRRRRtrpmUtils.miscutilsR�RfRityum.miscRtyum.i18nRR RRR�RR!R*R8R@RERFR�R�R�R�RR�R�R�(((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt<module>sF" C ������T |