[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}||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_objtepochtpkgIdtversiontvertreleasetreltnametarchR9t _changelogt_hash(tselfRNtdb_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 existsRYRZRSRURWtpkgKeyRTt checksum_typeN(t IndexErrortKeyErrorR<tsetattrR!RTR$t _checksums(R]R^R5Rdt check_sum((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyRRs$    cGs=t|i|d|i}|i}t||||S(s6 Exec SQL against an MD of the repo, return a cursor. tdb(tgetattrRKRNtcursorR(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_licensetlicenseRTtchecksum_valuet__tprimarys'SELECT %s FROM packages WHERE pkgId = ?sno such columniRSRItsummaryt descriptiontiturl(RR(t startswithtendswithtAttributeErrortgetRpRTtfetchoneRRRRfR<R!Rg(R]tvarnamet db2simplemaptdbnameR3RR ((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 = ?Rctdirnamet filetypest filenamest/(RPRQRKtpopulateRNRpRTRCtdecodefiletypelisttdecodefilenamelisttpopR!t setdefaulttappendR$( R]tresultR?RBRRRtfilenametfiletype((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyRa6s,    "  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 DESCRcidtdatetauthort changelog( R[RNRKtotherdbRRRRpRTRCRRR!(R]RR?RBtc_datetc_authortc_log((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyt_loadChangelogRs&      cCs|i|ifS(N(RdRT(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.pyRb~s(RPRpRctmapRaRtreturnFileEntries(R]tftypet primary_onlyRnR?((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.pyRbs(RPRpRcRRaRtreturnFileTypes(R]RRnR?((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.pyRbs(twarningstwarnRtYumDeprecationWarningRpRcR(R]RRnR?((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(NRHRG(tyumRepotYumPackageSackR_t primarydbt filelistsdbRtexcludesR0t _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. Rj(RkRlR(R]RmRNRnRRoR?((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyRps cCs#d}|id||idS(s- Give a count of pkgIds in the given repo DB s!SELECT count(pkgId) FROM packagesRi(RpR(R]RmRNRn((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyt_sql_MD_pkg_numscsBio1tfdi}|_t_niS(s{ If the pkgobjlist is dirty (possible pkgs on it which are excluded) then clean it, and return the clean list. csi| S((t _pkgExcluded(R(R](s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyRbs(Rtfiltert pkgobjlistR%(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_excludedRNRot 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_providesRRHRG(RRRRR%RRRR0RRRRRRt 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(RRtvaluesRRtcloseRR0RRRRRR%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]RNRcR(RR2R3R4R1RMR=R&R'texSPLITtexTtexM((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyt_pkgExcludedRKNEVRAksX   0       "  "   "  "c Cs4|\}}}}}|i|||||||S(sb Helper function to call _pkgExcludedRKNEVRA. Takes a repo, pkgKey and a package tuple(R( R]RNRcR9R(R4RR2R3((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 dataRYRZRSRURW(R( R]RNRcR1R(R4RR2R3((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. (RRNRcR9(R]R((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyRscGsf|dj o||ijodSd}d}ton|ido|di}n|ido|d}n|idoC|di}ti|otit i |i }q n=|idon)|idon|idon|i i ||||f|dj ot|i |i| 1 and filelist_globber(dirname,filenames)("R9R$R<R=R>RtbasenameRRR%tre_primary_filenameRCRRRRRRRRRRRGRRRlRR7R?RRRRtcreate_function(R]RYtstrictR:R@RR5RNRotpri_pkgstfil_pkgst sql_paramst dirname_checktpatterntescRBR?RP((RRNROs2/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 ( R9RtreplaceRRRRlRR7( R]tfieldst searchstringRRZRnRIRBRoR?((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 requestedRRSRURZRWsGselect pkgId,pkgKey,name,epoch,version,release,arch from packages WHERERYitWHEREs AND %s = "%s"s %s = "%s"R6( R9RR$RkR%RRRRlRR7(R]RYRSRVRXRZRR*R&tcoltvartemptytargRRBRoR?((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.pyRbst,s-sourcetsrcs"SELECT DISTINCT arch FROM packagesiN(RR<R0t intersectionRRiRRRlRLRR%RR$R ( R]tarchlistt sarchlistt arch_queryRBRoR?thas_archtrow((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyt excludeArchss(  $   N(NNN(NNN(@RRRR_RRpRRRRRRRRR R R R RRRRRR$R#R$R&R+R<R0R4R%R7R9RCRDRFR[R`RrR{R|RRRRRRR2RRRRRRRRRRRRRRR(((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pyRs         A    )        ~4%[;A    '!&#,cCs di|S(NR(Ri(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(NRRIRtdtdirtgtghost((t filetypelistRt ft2stringR((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pytencodefiletypelists cCs>hdd6dd6dd6}g}|D]}|||q&~S(NRRIRRRR((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.miscutilsRRdRgtyum.miscRtyum.i18nRR RRRRR!R)R6R>RCRDRRRRRRRR(((s2/usr/lib/python2.6/site-packages/yum/sqlitesack.pytsF    "             C S