[c@sddkZddkZddkZddkZddklZlZlZlZddk Z ddk Z ddk l Z l Z lZddkZddk Z ddkZddkZddklZddklZlZddkZddkZddkZdZdZdZd Zd Zd Z d eeefd YZ!dei"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}i|_i|_|iii|S(s8This decorator converts sqlite exceptions into RepoErrorcsy||SWn|tiij oj}tidjo?t|dotit|i qytit|ntit|nXdS(Nitmessage( tsqlutilstsqlitetErrortsyst hexversionthasattrtErrorst RepoErrortstrR (targstkwargste(tfunc(s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pytnewFunc,s(t__name__t__doc__t__dict__tupdate(RR((Rs2/usr/lib/python2.6/site-packages/yum/sqlitesack.pytcatchSqliteException*s   cCs ti|S(N(tmisct share_data(tvalue((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyt _share_data>scCsm||jotS|ptS|o2|o+|ddjo|d|djotS||otStS(Nit?t*(R"R#(tTruetFalse(tmatcht regexp_matchtn((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyt _parse_pkg_nBs 4 c Cs|d}|p td||jotS|oG|o@|ddjo/|d|djo|d|djotSd|jod||f|d}|djo||}n|||joq 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.6/site-packages/yum/sqlitesack.pyt _deduplicates tYumAvailablePackageSqlitecBseZdZeddZddZedZdZ dZ dZ dZ d Z d ed Zed Zd d ZedZdZRS(cCshdd6dd6dd6d d6|_|i|_|i|_||_d|_t|_d|_ |i ||i djo d|_ n|i |_|i |_|i|_|i|i|i |i |if|_d|_d|_dS( Nt obsoletest conflictstrequirestprovidest0(((((tprcotsacktidtrepoidtrepoR=tstateR%t _loadedfilest_filest _read_db_objtepochtpkgIdtversiontvertreleasetreltnametarchR:t _changelogt_hash(tselfROtdb_obj((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyt__init__s&             ' tfgetcCs |iS((t _loadFiles(R^((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pytsc Cs|o-y ||SWq4ttfj od SXnxZddddddgD]@}yt||t||WqMttfj oqMXqMWy@|d|_t|d}||dtf}|g|_Wnttfj onXd S( swread the db obj. If asked for a specific item, return it. otherwise populate out into the object what existsRZR[RTRVRXtpkgKeyRUt checksum_typeN(t IndexErrortKeyErrorR=tsetattrR!RUR$t _checksums(R^R_R6Ret check_sum((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyRSs$    cGs=t|i|d|i}|i}t||||S(s6 Exec SQL against an MD of the repo, return a cursor. tdb(tgetattrRLROtcursorR(R^tMDtsqlRtcacheR@((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyt_sql_MDs cCshdd6dd6dd6dd6d d 6d d 6d d6dd6dd6dd6dd6dd6dd6dd6dd6dd 6}|id!o|id!o t|n|i||}y)|id"d#||ifi}WnDtij o5}t |id$ot t |nnX|d%}|d&jo|djo d'}n|d-jo|djo d*}n|h d+d6d+d6d+d6d+d6d+d6d+d(6d+d)6d+d6d+d,6jot |}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_licensetlicenseRUtchecksum_valuet__tprimarys'SELECT %s FROM packages WHERE pkgId = ?sno such columniRTRJtsummaryt descriptiontiturl(RR(t startswithtendswithtAttributeErrortgetRqRUtfetchoneRRRRgR=R!Rh(R^tvarnamet db2simplemaptdbnameR4RR ((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyt __getattr__sN        c Cs|io|iSh}|ii|idd|idd|if}xt|dD]}|d}t|d}t |d}xb|oZ|o|d|i }n |i }t |i }|i |gi |qWq\Wt|_||_|iS( Ntmdtypet filelistssrSELECT pkgKey, dirname, filetypes, filenames FROM filelist JOIN packages USING(pkgKey) WHERE packages.pkgId = ?Rdtdirnamet filetypest filenamest/(RQRRRLtpopulateRORqRURDtdecodefiletypelisttdecodefilenamelisttpopR!t setdefaulttappendR$( R^tresultR@RCRRRtfilenametfiletype((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyRb6s,    "  cCsg}|ip|i|iijoDy|ii|iddWqjtij o||_dSXn|idd|if}xet |dD]T}d|dd}t |d}t |d }|i |t ||fqW||_dSdS( NRt otherdatatotherswSELECT pkgKey, date, author, changelog FROM changelog JOIN packages USING(pkgKey) WHERE pkgId = ? ORDER BY date DESCRdidtdatetauthort changelog( R\RORLtotherdbRRRRqRURDRRR!(R^RR@RCtc_datetc_authortc_log((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyt_loadChangelogRs&      cCs|i|ifS(N(ReRU(R^((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyt returnIdSumqscCs|i|iS(N(RR\(R^((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pytreturnChangelogts tfilecCsd|o@|i o5d}|id||i|f}td|S|iti|||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(tfname((tx((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyRc~s(RQRqRdtmapRbRtreturnFileEntries(R^tftypet primary_onlyRoR@((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyRxs  cCs[|o=|i o2d}|id||if}td|S|iti|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(R((R((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyRcs(RQRqRdRRbRtreturnFileTypes(R^RRoR@((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyRs  cCsMtidtiddd}|id||i|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(R((R((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyRcs(twarningstwarnRtYumDeprecationWarningRqRdR(R^RRoR@((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyt simpleFiless  cCs t|}|djo d}nt|i|tod|}|id||if}g|i|d*Z.eged+Z/ed,Z0d-Z1d.Z2d/Z3d0Z4ed1Z5ed<d<ed2Z6ed<d<ed3Z7ed4Z8d<d<ed5Z9ed6Z:d<d<ed7Z;d<d<ed8Z<d<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 cCstii||h|_h|_h|_h|_t|_t|_ h|_ hhd6hd6|_ h|_ h|_ h|_t|_t|_t|_d|_g|_h|_t|_dS(NRIRH(tyumRepotYumPackageSackR`t primarydbt filelistsdbRtexcludesR1t _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.6/site-packages/yum/sqlitesack.pyR`s*                 cGs7t||d|}|i}t||||S(s6 Exec SQL against an MD of the repo, return a cursor. Rk(RlRmR(R^RnRORoRRpR@((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyRqs cCs#d}|id||idS(s- Give a count of pkgIds in the given repo DB s!SELECT count(pkgId) FROM packagesRi(RqR(R^RnRORo((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyt_sql_MD_pkg_numscsYtdptio1tfdi}|_t_niS(s{ If the pkgobjlist is dirty (possible pkgs on it which are excluded) then clean it, and return the clean list. t pkgobjlistcsi| S((t _pkgExcluded(R(R^(s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyRcs(RR0RtfilterRR%(R^tpol((R^s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyt_clean_pkgobjlists    c Cst}x8|iiD]'\}}||ijo t}PqqW|odSt|dot|iSd}x(|iD]}|t|i|7}q~Wd}x'|iD]}||i d|7}qW||S(NiRR( R$RtitemsRR%RtlenRRR(R^t all_excludedRORpt exclude_numtpkg_num((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyt__len__s&    cCst|do |`nt|do |`nt|do |`nt|_h|_h|_t|_ t|_ t|_ h|_ hhd6hd6|_ tidS(Nt_memoize_requirest_memoize_providesRRIRH(RRRRR%RRRR1RRRRRRt unshare_data(R^((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pytdropCachedData s"           cCs|ix;|ii|ii|iiD]}|iq4Wh|_h|_h|_h|_t|_t|_ h|_ g|_ h|_ t |_tii|dS(N(RRtvaluesRRtcloseRR1RRRRRR%RRR(R^tdataobj((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyRs"           cCsdS(N((R^((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyt buildIndexes2sterrorcCsdS(N((R^tfailure((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyt _checkIndexes7scs|ii||f||ijof|i|i|ddj o<|ii}tfd|}||iiR&R'texSPLITtexTtexM((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyt_pkgExcludedRKNEVRAksZ   0       "  "   "  "c Cs4|\}}}}}|i|||||||S(sb Helper function to call _pkgExcludedRKNEVRA. Takes a repo, pkgKey and a package tuple(R( R^RORdR:R(R5RR3R4((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyt_pkgExcludedRKTsc CsW|d|d|d|d|df\}}}}}|i|||||||S(si Helper function to call _pkgExcludedRKNEVRA. Takes a repo, pkgKey and a dict of package dataRZR[RTRVRX(R( R^RORdR2R(R5RR3R4((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyt_pkgExcludedRKDs*cCs|i|i|i|iS(sR Helper function to call _pkgExcludedRKNEVRA. Takes a package object. (RRORdR:(R^R((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyRscGs|dj o||ijodSd}d}tonn|ido.t|djpt|di}n0|ido(t|djpt|d}n|ido]t|djpt|di}ti|ot i t i |i }qn|idot|djptn]|idot|djptn/|id ot|djptn|ii||||f|dj ot|i|i|RR&R'((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pytaddPackageExcluders8#  c Cs|pt|o|i||odS||ijoh|i| 1 and filelist_globber(dirname,filenames)("R:R$R=R>R?RtbasenameRRR%tre_primary_filenameRDRRRRRRRRRRRHRRRmRR8R@RRRRtcreate_function(R^RZtstrictR;RARR6RORptpri_pkgstfil_pkgst sql_paramst dirname_checktpatterntescRCR@RQ((RRORPs2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyt searchFiless                   c Cs|iogSg}t|djo|S|idd}t|\}}d|d||f}x(|dD]}d||||f}qvWxI|iiD]8\}}|i} t| ||i|| |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:RtreplaceRRRRmRR8( R^tfieldst searchstringRR[RoRJRCRpR@((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pytsearchPrimaryFieldss"     c Cs|iogSg}| p| o|St|tit|joh}xK|D]C}|i||}x(|D] }|i|dd|||i|D]-}|ddfg||<||i ||\}}|i}t || |i |||d tqW|S( s6return list of pkgobjects matching the nevra requestedRRTRVR[RXsGselect pkgId,pkgKey,name,epoch,version,release,arch from packages WHERERZitWHEREs AND %s = "%s"s %s = "%s"R7( R:RR$RlR%RRRRmRR8(R^RZRTRWRYR[RR+R&tcoltvartemptytargRRCRpR@((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyt searchNevrasJ       c Cs |idjot||_n|ii||_td|}di|}x|iiD]\}}|i}|i i d pd|ijoqint }t |dx*|D]"}|d|jo t }PqqW|p|i|dSqiWdS(sBexcludes incompatible arches - archlist is a list of compat archescSsd|S(s'%s'((R((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyRcst,s-sourcetsrcs"SELECT DISTINCT arch FROM packagesiN(RR=R1t intersectionRRjRRRmRMRR%RR$R ( R^tarchlistt sarchlistt arch_queryRCRpR@thas_archtrow((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyt excludeArchss(  $   N(NNN(NNN(@RRRR`RRqRRRRRRRRR R R R RRRRR R$R$R%R'R,R=R1R5R%R8R:RDRERGR\RaRsR|R}RRRRRRR3RRRRRRRRRRRRRRR(((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyRs         A    )        ~4%[;A    '!&#,cCs di|S(NR(Rj(t filenamelist((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pytencodefilenamelist scCs|idd}|idS(Ns//R(R^R(tfilenamestring((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyRscCsDd}hdd6dd6dd6}x|D]}|||7}q(W|S(NRRJRtdtdirtgtghost((t filetypelistRt ft2stringR((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pytencodefiletypelists cCs>hdd6dd6dd6}g}|D]}|||q&~S(NRRJRRRR((tfiletypestringt string2ftRR((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyRss 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.miscutilsRReRhtyum.miscRtyum.i18nRR RRRRR!R)R7R?RDRERRRRRRRR(((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pytsF    "             C S