v_c@sddlZddlZddlZddlZddlmZmZmZmZddl Z ddl Z ddl m Z m Z mZddlZddl Z ddlZddlZddlmZddlmZmZddlZddlZddlZdZdZdZd Zd Zd Z d eeefd YZ!dej"fdYZ#dZ$dZ%dZ&dZ'dZ(dZ)dS(iN(t PackageObjecttRpmBasetYumAvailablePackaget parsePackages(t executeSQLtsql_esct sql_esc_glob(t seq_max_split(tto_utf8t to_unicodecs>fd}j|_j|_|jjj|S(s8This decorator converts sqlite exceptions into RepoErrorcsy||SWnvtjjk r}tjdkrtt|dr_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(tmatcht regexp_matchtn((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt _parse_pkg_nBs 0 c Cs|d}|std||kr,tS|rt|rt|ddkrt|d|dkrt|d|dkrttSd|krd||f|d|dkrt|||rtSn|dkrd |krd |d|||f|d (tcurtfieldt first_valtob((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt _deduplicates   tYumAvailablePackageSqlitecBseZdZeddZddZedZdZ dZ dZ dZ d Z d ed Zed Zd d ZedZdZRS(cCsidd6dd6dd6d d6|_|j|_|j|_||_d|_t|_d|_ |j ||j dkrd|_ 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 |jS(N(t _loadFiles(R_((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytscCs|r0y ||SWq0ttfk r,d SXnxXddddddgD]>}yt||t||WqIttfk rqIXqIWy@|d|_t|d}||dtf}|g|_Wnttfk rnXd 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.pyRTs"  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_MDs cCsidd6dd6dd6dd6d d 6d d 6d d6dd6dd6dd6dd6dd6dd6dd6dd6dd 6}|jd!r|jd!rt|n|j||}y)|jd"d#||jfj}Wn@tjk r}t |jd$rt t |nnX|d%}|d&krI|dkrId'}n|d-krj|dkrjd*}n|i d+d6d+d6d+d6d+d6d+d6d+d(6d+d)6d+d6d+d,6krt |}nt ||||S(.Nt size_packaget packagesizet size_archivet archivesizetsize_installedt installedsizet time_buildt buildtimetrpm_header_startthdrstarttrpm_header_endthdrendt location_basetbasepatht location_hreft relativepatht time_filetfiletimet rpm_packagertpackagert rpm_grouptgroupt rpm_buildhostt buildhostt rpm_sourcerpmt sourcerpmt rpm_vendortvendort rpm_licensetlicenseRVtchecksum_valuet__tprimarys'SELECT %s FROM packages WHERE pkgId = ?sno such columniRURKtsummaryt descriptiontiturl(RR(t startswithtendswithtAttributeErrortgetRrRVtfetchoneRRRRhR>R!Ri(R_tvarnamet db2simplemaptdbnameR5RR ((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt __getattr__sN        c Cs'|jr|jSi}|jj|jdd|jdd|jf}xt|dD]}|d}|dkrd}n#|r|dd kr|d 7}nt|d }t |d }xE|r ||j }t |j }|j |gj |qWqZWt|_||_|jS( Ntmdtypet filelistssrSELECT pkgKey, dirname, filetypes, filenames FROM filelist JOIN packages USING(pkgKey) WHERE packages.pkgId = ?Retdirnamet.Rit/t filetypest filenames(RRRSRMtpopulateRPRrRVREtdecodefiletypelisttdecodefilenamelisttpopR!t setdefaulttappendR%( R_tresultRARDRRRtfilenametfiletype((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRc6s,       !  cCsg}|js|j|jjkrey|jj|jddWqetjk ra||_dSXn|jdd|jf}xet |dD]T}d|dd}t |d}t |d }|j |t ||fqW||_dSdS( NRt otherdatatotherswSELECT pkgKey, date, author, changelog FROM changelog JOIN packages USING(pkgKey) WHERE pkgId = ? ORDER BY date DESCReidtdatetauthort changelog( R]RPRMtotherdbRRRRrRVRERRR!(R_RRARDtc_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.pyt returnIdSumrscCs|j|jS(N(RR](R_((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytreturnChangelogus tfilecCsa|rD|j rDd}|jd||j|f}td|S|jtj|||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 = ?RcSs|dS(Ntfname((tx((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRds(RRRrRetmapRcRtreturnFileEntries(R_tftypet primary_onlyRpRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRys  cCsX|rA|j rAd}|jd||jf}td|S|jtj|S(sreturn 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 = ?RcSs|dS(NR((R((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRds(RRRrReRRcRtreturnFileTypes(R_RRpRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRs  cCsMtjdtjddd}|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 = ?RcSs|dS(NR((R((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRds(twarningstwarnRtYumDeprecationWarningRrReR(R_RRpRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt simpleFiless  cCst|}|dkr!d}nt|j|trd|}|jd||jf}g|j|RTRRrRRcRRRR&RRRRR(((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRFs   9      tYumSqlitePackageSackcBseZdZdZedZdZdZdZdZ edZ dZ d d Z d Z d Zd ZdZdZdZdZdZdZdZedZedZdZdZd<dZddZd<edZ dZ!edZ"edZ#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/Z3d0Z4ed1Z5ed<d<ed2Z6ed<d<ed3Z7ed4Z8d<d<ed5Z9d6Z:ed<d<ed7Z;d<d<ed8Z<ed<ed9Z=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 cCstjj||i|_i|_i|_i|_t|_t|_ i|_ iid6id6|_ i|_ i|_ i|_t|_t|_t|_d|_g|_i|_t|_dS(NRJRI(tyumRepotYumPackageSackRat primarydbt filelistsdbRtexcludesR2t _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_t packageClass((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRas*                 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.pyRrs cCs#d}|jd||jdS(s- Give a count of pkgIds in the given repo DB s!SELECT count(pkgId) FROM packagesRi(RrR(R_RoRPRp((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_sql_MD_pkg_numscsUtdstjrNtfdj}|_t_njS(s{ If the pkgobjlist is dirty (possible pkgs on it which are excluded) then clean it, and return the clean list. t pkgobjlistcsj| S(N(t _pkgExcluded(R(R_(s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRds(RR1RtfilterRR&(R_tpol((R_s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_clean_pkgobjlists    cCst}x6|jjD]%\}}||jkrt}PqqW|rIdSt|drht|jSd}x(|jD]}|t|j|7}qxWd}x'|jD]}||j d|7}qW||S(NiRR( R%RtitemsRR&RtlenRRR(R_t all_excludedRPRqt exclude_numtpkg_num((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt__len__s cCst|dr|`nt|dr0|`nt|drH|`nt|_i|_i|_t|_ t|_ t|_ i|_ iid6id6|_ tjdS(Nt_memoize_requirest_memoize_providesRRJRI(RRRRR&RRRR2RRRRRRt unshare_data(R_((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytdropCachedData s"           cCs|jx;|jj|jj|jjD]}|jq4Wi|_i|_i|_i|_t|_t|_ i|_ g|_ i|_ t |_tjj|dS(N(RRtvaluesRRtcloseRR2RRRRRR&RRR(R_tdataobj((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRs            cCsdS(N((R_((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt buildIndexes3sterrorcCsdS(N((R_tfailure((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt _checkIndexes8scs|jj||f||jkr|j|j|ddk r|jj}tfd|}||jjRR;R(R_RPRetpos((Rs2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt _delPackageRK;s cCs|j|jkr%i|j|jR RRRNtsplitRR1R@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_pkgExcludedRKTsc 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_pkgExcludedRKDs*cCs|j|j|j|jS(sR Helper function to call _pkgExcludedRKNEVRA. Takes a package object. (RRPReR;(R_R((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRscGs|dk r||jkrdSd}d}tr4nS|jdrnt|dks[t|dj}n|jdrt|dkst|d}n|jdr t|dkst|dj}tj|rt j t j |j }qn~|jdr3t|dkstnT|jdr]t|dkstn*|jd rt|dkstn|jj||||f|dk rt|j|j|RR&RRR1RRtre_globtretcompiletfnmatcht translateR'RRR2RR%R(R_ROt excluderidR?RR'R(((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytaddPackageExcluders8 !  c Cs|s t|r(|j||r(dS||jkrTi|j|RRRrRRRRtpcRRR;RRR ( R_RPReRRpR3tmsgRtpkgkeys((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt _packageByKeys.  !  cCs|s t|r+|j|||r+dS||jkrWi|j|RRRR"RRR;R(R_RPReR3RRR$((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_packageByKeyDatas  cCs|j|||rdS|jj|}|dkrTi|j|RRRR;(R_RPReR3tprepo((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_pkgtupByKeyDatas  cCsg}x|jD]u}|jj|ij|g}|sCqnx?|D]7}|j||}|dkrtqJn|j|qJWqW|S(s2 Load all pkgnames from cache, with a given name. N(RRRR%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|RRRRRR(R_RPtdatatypeRtcallback((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytaddDict2s      tlikecCs|j|dS(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/RR&(R_tskip_allRP((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt _skip_all`s cCsd}tjj|}tj|s0d}ng}xh|jjD]W\}}||jkrgqFn|j}t |d||f|j |||qFWtj |S(Ntglobt=s1select DISTINCT pkgKey from files where name %s ?( tostpathtnormpathRRRRRRnRR9tunique(R_R[t querytypetresultstrepRqRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_search_primary_filesis  cCshxa|jjD]P\}}||jkr1qn|j}t|dx|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)(RRRRnRR&R%(R_RDRqRARD((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_have_fastReturnFileEntrieszs   cCs(t|ds!|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_fastReturnFileEntriesscs|jrgSt}td}tjj|}tjj|}tjj||sntj| rt }t d}ntjst n|ddkr|d }ng}tj |r|j |St |j dkr:xH|jjD]4\}}||jkr qn|j|ddqWnxk|j D]`}t|dr_qDn|jd |} |jd|} | | krtjnt|_qDWg} d } |st\} }d |} | j|| jd | d nsBt\} }d |} | j|| jd | d ndkrxu|j jD]d\}}||jkrq^n|j}| j|t|d|f| |j|||q^Wtj|Sx|j jD]\}}||jkrqn|j}t|d| |f| d|g|j|||rhtjtj |nfd}|j!dd|t|d| | |j|||qWtj|}|S(sYsearch primary if file will be in there, if not, search filelists, use globs, if possibleR<R=iRiRRt_checked_filelists_pkgsRRs(dirname = ? and filenames LIKE ? %s and t%s+dirname GLOB ? and filenames LIKE ? %s and R#sQSELECT pkgKey FROM filelist WHERE dirname %s ?sselect pkgKey from filelist where %s length(filetypes) = 1 and dirname || ? || filenames %s ?cse|jd}s%t|kStfd|}x!|D]}j|rDdSqDWdS(NRcsd|fS(Ns%s/%s((tf(t sql_dirname(s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRdsii(RtintRR'(RLt sql_filenamesRtfnsR'(t file_globRtname_re(RLs2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytfilelist_globbers RRisselect pkgKey from filelist where %s length(filetypes) > 1 and filelist_globber(dirname,filenames)("R;R%R>R?R@RtbasenameRRR&tre_primary_filenameRERRRRRRRRRRRIRRRnRR9RARRRRtcreate_function(R_R[tstrictR<RBRR7RPRqtpri_pkgstfil_pkgst sql_paramst dirname_checktpatterntescRDRARR((RPRRQs2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt searchFiless                  c Cs|jrgSg}t|dkr,|S|jdd}t|\}}d|d||f}x(|dD]}d||||f}qrWxI|jjD]8\}}|j} t| ||j|| |qW|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;RtreplaceRRRRnRR9( R_tfieldst searchstringRR\RpRKRDRqRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytsearchPrimaryFieldss   cCs|jrgSg}| s$| r(|St|tjt|kri}xK|D]C}|j||}x(|D] }|j|dd||(R_R`t searchstringsRttotRatmatchesRt unionstringtendunionstringtselectstsR\RpRKt totalstringRDRqRARDR,((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt"searchPrimaryFieldsMultipleStrings)sD   ""     c Csu|jriS|r"tni}xF|jjD]5\}}|j}t|dx |D]}t|dt|dt|dt|dt|df}|j||d|rqdnt|dt|d t|d t|d t|d f\}} } } } t|}t|| | | | ff} |j|gj | qdWq8W|S( Nsselect 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;tNotImplementedErrorRRRnRR!RRR(R_tnewestRGRDRqRARDRcR)RKRR4R5tval((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytreturnObsoletes]s0        " !cCsUxN|jjD]=\}}|j}t|d|fx|D]}|SWqWdS(Ns&select * from packages where pkgId = ?(RRRnR(R_RVRDRqRARD((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytgetPackageDetailss   cCsg}t|dkr|Stt|}x[|jjD]J\}}|j}t|d|fx|D]}|j|qqWq>W|S(Nis(select * from packages where pkgId in %s(RRRRRRnRR(R_t pkgId_listR7t pkgid_queryRDRqRARD((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_getListofPackageDetailss  c Cs?t|d|s.i}x|jjD]\}}||jkrJq)n|j}t|d|x|D]}t|dt|dt|dt|dt|dff}t|}||df}t|d } | |f}|j|gj|qnWq)Wt |d||nt |d|S( Nt _memoize_sselect * from %sR[RRURWRYiRe( RRRRRnRR!RRRiRm( R_RtmemoizeRDRqRARR|RcR+((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_search_get_memoizes$    !c Cs|jriSt|}|dkr1d}nt|ttdtfkrp||tjj|f}n*t|t t fkr|||f}nt |}t |}||j |kr|j ||Si}t r|jj}t}ng}t }|j|} x|jjD]\} } | |jkrDq#ni} x]| j| |fgD]C} | \}}tjj||rc| j|gj|qcqcWxH| jD]:\}}|j| |}|dkrqn||||j|D]-}|ddfg||<||j ||ttypeRtunicodetrpmUtilst miscutilststringToVersionRtlistR!RR%RRR&RRRt rangeCompareRRt iteritemsR%RnRRRTR]RE(R_RR[RRWtreqRtprimarydb_itemstpreloadRRDRqttmpRR+R|RethitsR,RA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_searchs    !           $ cCs|jd|||S(NRJ(R(R_R[RRW((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt getProvides scCs|jd|||S(NRI(R(R_R[RRW((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt getRequiresscCs0|jrgSt|d}g}t|}g}x^|D]V}||jkrYq>n|sn||jkr|j|j|q>|j|q>W|rg|D]}|j^q}n|s|St j }t ||krx0t ||D]}|j|j ||qW|Sg} d} x|D]} | jdq,W| dj| } x|jjD]\} } | j}t|| ||rxF|D]>}|j| |d|}|dkrqn|j|qWqfn|j| ||dtqfW|s,|jjg|D] } | ^qn|S(syreturn a list of packages matching any of the given names. This is only a match on package name, nothing elseRs^select pkgId,pkgKey,name,epoch,version,release,arch from packages where sname = ?s OR ReR8N(R;RR2RRtextendR-RR;RftPATTERNS_INDEXED_MAXRRt searchNamesRkRRRnRR(R>R9R%R(R_tnamestreturn_pkgtupstloaded_all_namest returnListt user_namesR)R,t max_entriestpat_sqlstqsqlR[RPRqRARDR;((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRsP        &c Cs|jrgSy%tj|\}}\}}}Wn(tjk r_}tjt|nX|}t|} | }t} d} tj|st } d} ng} g} xY|j j D]H\}}|j }t |d|| f|f|j||| qWx| D]~}tj|rE|dkrE| j|qn| s|j||||||ffr| j|qq| j|qW|dkr| Stj|s| S| j|j|tj|r| rtj| 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&RRRnRR9t re_filenameR>Rt checkPrcoRRERTRAR](R_R[RR)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(RR4R(R_R[R*((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytsearchProvidess cCs|j|dS(s9return list of packages requiring name (any evr and flag)RI(R4(R_R[((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytsearchRequiresscCs|j|dS(s:return list of packages obsoleting name (any evr and flag)RG(R4(R_R[((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytsearchObsoletesscCs|j|dS(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.pytsearchConflictsscCsdGHdd1dY}|}|d|d|d|d|df|_||_|d |_|rm|Si|d d 6|d d 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.pyRsR[RURWRYR\RVR{tstartR}tendRthrefRR RtbasetYEStpkgidRfRRytbuildRRRstpackageRutarchiveRwt installedRRRRRRRRRRRRRRR(( R0RMRVthdrangetlocationtchecksumttimetsizetinfo(R_Rlt nevra_onlyRty((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytdb2classs& ,  &*'cCs|stjj||||Sg}xR|jjD]A\}}|j}t|d||j|||dtq5W|st j d|nt j |S(NsYselect pkgId,pkgKey,name,epoch,version,release,arch from packages where name=? and arch=?R8sNo Package Matching %s.%s( RRtreturnNewestByNameArchRRRnRR9R%RRRt newestInList(R_tnaTuptpatternst ignore_casetallpkgRDRqRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRs cCs|jrgS|s/tjj||||Sg}xU|jjD]D\}}|j}t|d|f|j|||dt qEW|st j d|nt j |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;RRtreturnNewestByNameRRRnRR9R%RRRR(R_R[RRRRDRqRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRs  c Cs>|jrgggfSg}g}t|}x|D]}tj|rntidd6|d6}|}ntidd6|d6}|}xq|jjD]`\}} | j} t| ||j || } t | r|j |n|j | qWq8Wtj |}tj |}tj |}|||fS(NR<toptqR=(R;RRRt PARSE_QUERYRRRnRR9RtremoveRRA( R_tpkgspecstmatchedt exactmatcht unmatchedtptquerytmatchresRDRlRAtpmatches((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytmatchPackageNamess,        c Cs^|d krg}ndddddddg}t}x<|D]4}tj|r=|sg||jkr=t}Pq=q=Wtj}|sdg}tj}nt ||krg}n|rt |}ng}t} xL|D]D}tj |r |j |dft} q|j |d fqW| rH| rH|rH|||tfS|}|||tfS( szSetup need_full and patterns for _yieldSQLDataList, also see if we can get away with just using searchNames(). R[t sql_nameArchtsql_nameVerRelArcht sql_nameVertsql_nameVerRelt sql_envrat sql_nevraR<R=N( R>R&Rtre_full_search_neededRR%RfRgRRRRR( R_RORRR`t need_fulltpattpat_maxRt need_glob((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_setupPkgObjLists<           ccsAg}g}x|D]}\}}| r;||jkr;qnxR|D]J} |rh|jd| |fn|jd| |f|j|qBWqW|r| rdS|rtdj|} nd} xs|jjD]b\} } |dks|| jkr| j} t | | |x| D]}| |fVq!WqqWdS(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( RRt_FULL_PARSE_QUERY_BEGRkRRR>RNRnR(R_RORR`RRtpat_dataR[trestRBRRPRqRAR((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_yieldSQLDataList7s*    cCsg}|j|||}|\}}}}|r@|j|Sx^|j||||D]D\} } |j| | d| } | dkrqYn|j| qYW| r|dkr||_t|_n| r|dkr|jj g|D]} | j ^qn|rqx`|D]U\} } | dkr3qnx4|D],}|j | kr:|jj |j Pq:q:WqWn|sx'|D]\} } |j j | q~Wn|S(sjBuilds a list of packages, only containing nevra information. Excludes are done at this stage. ReR=RN(R=R( RRRR&R>RRR2RRR[RR(R_RORRRR3RR`RRPRRRRR,((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_buildPkgObjListWs8   )  cCs|jrgSt|d}|r4|j}n$|j|||}t|d}|r|rt}t||| dd}|d|d}n|dkr|r|}n|Sg}x0|D](}||jkrqn|j|qW|S(sReturns 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. RRAs repo-pkgkeyiiN( R;RRRR&RR>ROR(R_RORRtinternal_pkgoblistRRR((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytreturnPackages~s,      cCs|jrgSt|d}|r;tjj|||Sd}g}|j|||}|\}}}} | rg|j|D]} | j^qSx^|j ||||D]D\} } |j | | d| } | dkrqn|j | qW|S(sReturns 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. RReN( R;RRRt simplePkgListR>RRR;RR(R(R_RRRRORR3RR`RR,RPRR;((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRs& # cCs|jrgSg}|rx|jd|gD]}t}x]d|fd|fd|fd|fgD]1\} } | rit|| | krit}PqiqiW|r2|j|q2q2W|St} x,|||||fD]} | rt} qqW| r|Sd} xd|fd|fd|fd|fd|fgD]P\} } | r5| dd krn| d | | f} q| d | | f} q5q5WxO|jjD]>\}}|j}t || |j |||d tqW|S( s6return list of pkgobjects matching the nevra requestedRRURWR\RYsGselect pkgId,pkgKey,name,epoch,version,release,arch from packages WHERER[itWHEREs AND %s = "%s"s %s = "%s"R8( R;RR%RmR&RRRRnRR9(R_R[RURXRZR\RR,R'tcoltvartemptytargRRDRqRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt searchNevras@ " "  c Cs|jdkr!t||_n|jj||_td|}dj|}x|jjD]\}}|j}|j j d sgd|jkrqgnt }t |dx(|D] }|d|krt }PqqW|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.pyRdst,s-sourcetsrcs"SELECT DISTINCT arch FROM packagesiN(RR>R2t intersectionRRkRRRnRNRR&RR%R ( R_tarchlistt sarchlistt arch_queryRDRqRAthas_archtrow((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt excludeArchss$ "   N(NNN(NNN(@RRRRaRRrRRRRRRRR R R RRRRRRR!R%R%R&R(R-R>R2R6R&R9R;RERFRHR]RbRtR}R~RRRRRRR4RRRRRRRRRRRRRRR(((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRs         A    )        }4%[;A    ( &#,cCs dj|S(NR(Rk(t filenamelist((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytencodefilenamelist scCs|jdd}|jdS(Ns//R(R_R(tfilenamestring((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRscCsDd}idd6dd6dd6}x|D]}|||7}q(W|S(NRRKRtdtdirtgtghost((t filetypelistRt ft2stringR((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytencodefiletypelists  cCs6idd6dd6dd6}g|D]}||^q"S(NRRKRRRR((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.pathRRtpackagesRRRRRRR RRRtrpmUtils.miscutilsRRfRityum.miscRtyum.i18nRR RRRRR!R*R8R@RERFRRRRRRRR(((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytsF    "             C T