a
    !c%:                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 d dl
mZ ddlmZmZmZ G dd deZG d	d
 d
eZG dd deZG dd deZdS )    N)ucd)misc)DatabaseError   )GroupPersistorEnvironmentPersistorRPMTransactionc                   @   sj  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zedd Zedd Zedd Zedd Zedd  Zed!d" Zed#d$ Zed%d& Zejd'd& Zed(d) Zejd*d) Zed+d, Zed-d. Zed/d0 Zejd1d0 Zed2d3 Zd4d5 Zed6d7 Zd8d9 Zed:d; Z ed<d= Z!ed>d? Z"d@S )ARPMTransactionItemWrapperc                 C   s   || _ || _d S N)_swdb_item)selfswdbitem r   2/usr/lib/python3.9/site-packages/dnf/db/history.py__init__#   s    z"RPMTransactionItemWrapper.__init__c                 C   s   | j   S r
   )r   ZgetItemZtoStrr   r   r   r   __str__(   s    z!RPMTransactionItemWrapper.__str__c                 C   s   | j |j k S r
   r   r   otherr   r   r   __lt__+   s    z RPMTransactionItemWrapper.__lt__c                 C   s   | j |j kS r
   r   r   r   r   r   __eq__.   s    z RPMTransactionItemWrapper.__eq__c                 C   s
   | j  S r
   )r   __hash__r   r   r   r   r   1   s    z"RPMTransactionItemWrapper.__hash__c                 C   s   dS )NTr   )r   patternr   r   r   match4   s    zRPMTransactionItemWrapper.matchc                 C   s   | j  d uS r
   )r   
getRPMItemr   r   r   r   
is_package7   s    z$RPMTransactionItemWrapper.is_packagec                 C   s   | j  d uS r
   r   ZgetCompsGroupItemr   r   r   r   is_group:   s    z"RPMTransactionItemWrapper.is_groupc                 C   s   | j  d uS r
   r   ZgetCompsEnvironmentItemr   r   r   r   is_environment=   s    z(RPMTransactionItemWrapper.is_environmentc                 C   s
   | j  S r
   r   r   r   r   r   	get_group@   s    z#RPMTransactionItemWrapper.get_groupc                 C   s
   | j  S r
   r!   r   r   r   r   get_environmentC   s    z)RPMTransactionItemWrapper.get_environmentc                 C   s   | j   S r
   )r   r   ZgetNamer   r   r   r   nameF   s    zRPMTransactionItemWrapper.namec                 C   s   | j   S r
   )r   r   ZgetEpochr   r   r   r   epochJ   s    zRPMTransactionItemWrapper.epochc                 C   s   | j   S r
   )r   r   Z
getVersionr   r   r   r   versionN   s    z!RPMTransactionItemWrapper.versionc                 C   s   | j   S r
   )r   r   Z
getReleaser   r   r   r   releaseR   s    z!RPMTransactionItemWrapper.releasec                 C   s   | j   S r
   )r   r   ZgetArchr   r   r   r   archV   s    zRPMTransactionItemWrapper.archc                 C   s*   | j rd| j | j| jS d| j| jS )Nz{}:{}-{}z{}-{})r&   formatr'   r(   r   r   r   r   evrZ   s    zRPMTransactionItemWrapper.evrc                 C   s   | j   S r
   )r   r   ZgetNEVRAr   r   r   r   nevra`   s    zRPMTransactionItemWrapper.nevrac                 C   s
   | j  S r
   )r   Z	getActionr   r   r   r   actiond   s    z RPMTransactionItemWrapper.actionc                 C   s   | j | d S r
   )r   Z	setActionr   valuer   r   r   r-   h   s    c                 C   s
   | j  S r
   )r   Z	getReasonr   r   r   r   reasonl   s    z RPMTransactionItemWrapper.reasonc                 C   s   | j |S r
   )r   Z	setReasonr.   r   r   r   r0   p   s    c                 C   s&   z| j  W S  ty    Y dS 0 d S N )r   ZgetActionNameAttributeErrorr   r   r   r   action_namet   s    z%RPMTransactionItemWrapper.action_namec                 C   s&   z| j  W S  ty    Y dS 0 d S r1   )r   ZgetActionShortr3   r   r   r   r   action_short{   s    z&RPMTransactionItemWrapper.action_shortc                 C   s
   | j  S r
   )r   getStater   r   r   r   state   s    zRPMTransactionItemWrapper.statec                 C   s   | j | d S r
   )r   setStater.   r   r   r   r7      s    c                 C   s
   | j  S r
   r   Z	getRepoidr   r   r   r   	from_repo   s    z#RPMTransactionItemWrapper.from_repoc                 C   s   | j  sdS d| j   S )Nr2   @r9   r   r   r   r   ui_from_repo   s    
z&RPMTransactionItemWrapper.ui_from_repoc                 C   s   d S r
   r   r   r   r   r   
obsoleting   s    z$RPMTransactionItemWrapper.obsoletingc                 C   s   | j j| S r
   )r   rpm
get_reasonr   r   r   r   r?      s    z$RPMTransactionItemWrapper.get_reasonc                 C   s   | j jj| j S r
   )r   r>   Z_swdb_ti_pkgr   r   r   r   r   pkg   s    zRPMTransactionItemWrapper.pkgc                 C   s   | j jS r
   )r@   filesr   r   r   r   rA      s    zRPMTransactionItemWrapper.filesc                 C   s   | j S r
   )r@   r   r   r   r   _active   s    z!RPMTransactionItemWrapper._activeN)#__name__
__module____qualname__r   r   r   r   r   r   r   r    r"   r#   r$   propertyr%   r&   r'   r(   r)   r+   r,   r-   setterr0   r4   r5   r7   r:   r<   r=   r?   r@   rA   rB   r   r   r   r   r	   "   sj   


















r	   c                   @   s   e Zd ZdZdZdd Zedd Zedd Zedd	 Z	ed
d Z
edd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(S ))TransactionWrapperFc                 C   s
   || _ d S r
   )_transr   transr   r   r   r      s    zTransactionWrapper.__init__c                 C   s
   | j  S r
   rI   ZgetIdr   r   r   r   tid   s    zTransactionWrapper.tidc                 C   s
   | j  S r
   )rI   Z
getCmdliner   r   r   r   cmdline   s    zTransactionWrapper.cmdlinec                 C   s
   | j  S r
   )rI   ZgetReleaseverr   r   r   r   
releasever   s    zTransactionWrapper.releaseverc                 C   s
   | j  S r
   )rI   Z
getDtBeginr   r   r   r   beg_timestamp   s    z TransactionWrapper.beg_timestampc                 C   s
   | j  S r
   )rI   ZgetDtEndr   r   r   r   end_timestamp   s    z TransactionWrapper.end_timestampc                 C   s
   | j  S r
   )rI   getRpmdbVersionBeginr   r   r   r   beg_rpmdb_version   s    z$TransactionWrapper.beg_rpmdb_versionc                 C   s
   | j  S r
   )rI   getRpmdbVersionEndr   r   r   r   end_rpmdb_version   s    z$TransactionWrapper.end_rpmdb_versionc                 C   s   t | j tjjkS r
   )intrI   r6   libdnftransactionTransactionItemState_DONEr   r   r   r   return_code   s    zTransactionWrapper.return_codec                 C   s
   | j  S r
   )rI   Z	getUserIdr   r   r   r   loginuid   s    zTransactionWrapper.loginuidc                 C   s   | j S r
   )packagesr   r   r   r   data   s    zTransactionWrapper.datac                 C   s   | j  }t|S r
   )rI   getConsoleOutputbool)r   outputr   r   r   	is_output   s    
zTransactionWrapper.is_outputc                 C   s
   | j  S r
   )rI   Z
getCommentr   r   r   r   comment   s    zTransactionWrapper.commentc                 C   s   | j  gS r
   rL   r   r   r   r   tids   s    zTransactionWrapper.tidsc                 C   s   g S r
   r   r   r   r   r   performed_with   s    z!TransactionWrapper.performed_withc                    s    j  } fdd|D S )Nc                    s   g | ]}t  |qS r   )r	   .0ir   r   r   
<listcomp>       z/TransactionWrapper.packages.<locals>.<listcomp>)rI   ZgetItems)r   resultr   r   r   r\      s    
zTransactionWrapper.packagesc                 C   s   dd | j  D S )Nc                 S   s   g | ]}|d  qS r   r   re   r   r   r   rh      ri   z-TransactionWrapper.output.<locals>.<listcomp>rI   r^   r   r   r   r   r`      s    zTransactionWrapper.outputc                 C   s   g S r
   r   r   r   r   r   error   s    zTransactionWrapper.errorc                 C   s   | j  |k| _d S r
   )rI   rT   altered_gt_rpmdb)r   Zrpmdbvr   r   r   compare_rpmdbv   s    z!TransactionWrapper.compare_rpmdbvN)rC   rD   rE   altered_lt_rpmdbrn   r   rF   rM   rN   rO   rP   rQ   rS   rU   rZ   r[   r]   ra   rb   rc   rd   r\   r`   rm   ro   r   r   r   r   rH      sB   











rH   c                   @   sh   e Zd Zdd Zdd Zedd Zdd Zed	d
 Zedd Z	edd Z
edd Zdd ZdS )MergedTransactionWrapperc                 C   s   t j|j| _d S r
   )rW   rX   ZMergedTransactionrI   rJ   r   r   r   r      s    z!MergedTransactionWrapper.__init__c                 C   s   | j |j  d S r
   )rI   mergerJ   r   r   r   rr      s    zMergedTransactionWrapper.mergec                 C   s
   | j  S r
   )rI   ZlistUserIdsr   r   r   r   r[      s    z!MergedTransactionWrapper.loginuidc                 C   s
   | j  S r
   )rI   ZlistIdsr   r   r   r   rc     s    zMergedTransactionWrapper.tidsc                 C   s   dd | j  D S )Nc                 S   s   g | ]}t |tjjkqS r   )rV   rW   rX   rY   re   r   r   r   rh     ri   z8MergedTransactionWrapper.return_code.<locals>.<listcomp>)rI   Z
listStatesr   r   r   r   rZ     s    z$MergedTransactionWrapper.return_codec                 C   s
   | j  S r
   )rI   ZlistCmdlinesr   r   r   r   rN     s    z MergedTransactionWrapper.cmdlinec                 C   s
   | j  S r
   )rI   ZlistReleaseversr   r   r   r   rO     s    z#MergedTransactionWrapper.releaseverc                 C   s
   | j  S r
   )rI   ZlistCommentsr   r   r   r   rb     s    z MergedTransactionWrapper.commentc                 C   s   dd | j  D S )Nc                 S   s   g | ]}|d  qS rk   r   re   r   r   r   rh     ri   z3MergedTransactionWrapper.output.<locals>.<listcomp>rl   r   r   r   r   r`     s    zMergedTransactionWrapper.outputN)rC   rD   rE   r   rr   rF   r[   rc   rZ   rN   rO   rb   r`   r   r   r   r   rq      s   




rq   c                   @   s   e Zd Zd6ddZdd Zedd Zedd	 Zed
d Zedd Z	edd Z
dd Zdd Zedd Zdd Zd7ddZd8ddZd d! Zd"d# Zd$d% Zd&d' Zd9d(d)Zd*d+ Zd,d- Zd:d.d/Zd;d0d1Zd2d3 Zd4d5 ZdS )<SwdbInterfacer2   c                 C   s8   t || _d | _d | _d | _d | _d | _|| _g | _d S r
   )	strrO   _rpm_group_envZ_addon_datar   _db_dir_output)r   Zdb_dirrO   r   r   r   r     s    
zSwdbInterface.__init__c                 C   s   |    d S r
   )closer   r   r   r   __del__%  s    zSwdbInterface.__del__c                 C   s   | j d u rt| | _ | j S r
   )ru   r   r   r   r   r   r>   (  s    

zSwdbInterface.rpmc                 C   s   | j d u rt| | _ | j S r
   )rv   r   r   r   r   r   group.  s    

zSwdbInterface.groupc                 C   s   | j d u rt| | _ | j S r
   )rw   r   r   r   r   r   env4  s    

zSwdbInterface.envc                 C   s   t j| jtjjjS r
   )ospathjoinrx   rW   rX   SwdbZdefaultDatabaseNamer   r   r   r   dbpath:  s    zSwdbInterface.dbpathc              
   C   s\   | j sVztj| j| _ W n0 tyJ } ztt|W Y d}~n
d}~0 0 | j   | j S )z Lazy initialize Swdb object N)	r   rW   rX   r   r   RuntimeErrorr   rt   initTransaction)r   Zexr   r   r   r   >  s    "
zSwdbInterface.swdbc                 C   s   t j|| j}|  d S r
   )rW   rX   ZTransformerr   	transform)r   Z	input_dirZtransformerr   r   r   r   K  s    zSwdbInterface.transformc                 C   sX   z| ` W n ty   Y n0 d | _d | _d | _| jrH| j  | j  d | _g | _d S r
   )	_tidr3   ru   rv   rw   r   ZcloseTransactionZcloseDatabasery   r   r   r   r   rz   O  s    

zSwdbInterface.closec                 C   s
   | j  S r
   )r   ZgetPathr   r   r   r   r   ]  s    zSwdbInterface.pathc                 C   s
   | j  S r
   )r   ZresetDatabaser   r   r   r   reset_dba  s    zSwdbInterface.reset_dbTc                 C   s   | j  }|sd S t|S r
   )r   ZgetLastTransactionrH   )r   complete_transactions_onlytr   r   r   laste  s    
zSwdbInterface.lastNr   Fc                    s    pg  dd  D  | j  }dd |D } rD fdd|D }t|D ]>\}}|dkr^qL||d  }|j |j krLd|_d|_qL|d d d S )	Nc                 S   s   g | ]}t |qS r   )rV   re   r   r   r   rh   o  ri   z%SwdbInterface.old.<locals>.<listcomp>c                 S   s   g | ]}t |qS r   )rH   re   r   r   r   rh   q  ri   c                    s   g | ]}|j  v r|qS r   )rM   re   rc   r   r   rh   t  ri   r   r   T)r   ZlistTransactions	enumeraterI   rR   rT   rp   rn   )r   rc   limitr   rj   rg   rK   Z
prev_transr   r   r   oldm  s    
zSwdbInterface.oldc                 C   s   t | j S r
   )rH   r   Z
getCurrentr   r   r   r   get_current  s    zSwdbInterface.get_currentc                 C   sB   | j |}| |}tjj}| j||||}|tjj	 |S )zSet reason for package)
r>   Z_pkg_to_swdb_rpm_itemreporW   rX   Z#TransactionItemAction_REASON_CHANGEr   ZaddItemr8   rY   )r   r@   r0   rpm_itemZrepoidr-   Ztir   r   r   
set_reason  s    
zSwdbInterface.set_reasonc                 C   s   | j t|S )zGet repository of package)r   Z
getRPMReport   )r   r@   r   r   r   r     s    zSwdbInterface.repoc                 C   s*   | j t|}|du r|S t| |}|S )zGet package data for packageN)r   ZgetRPMTransactionItemrt   r	   )r   r@   rj   r   r   r   package_data  s
    
zSwdbInterface.package_datac                 C   sf   z| j   W n   Y n0 | j ttt t||p>dtt	
 |}| j | j || _|S r1   )r   r   ZbeginTransactionrV   calendarZtimegmtimegmtimert   r   ZgetloginuidZsetReleaseverrO   r   )r   Zrpmdb_versionZ
using_pkgsZtsisrN   rb   rM   r   r   r   beg  s    
zSwdbInterface.begc                 C   sN   | j  }||j ||jp"d ||j ||j	 |
|j |S )Nr   )r   ZcreateRPMItemZsetNamer%   ZsetEpochr&   Z
setVersionr'   Z
setReleaser(   ZsetArchr)   )r   Zpor   r   r   r   pkg_to_swdb_rpm_item  s    
z"SwdbInterface.pkg_to_swdb_rpm_itemc                 C   s@   t | dsd S |sd S | D ]}t|}| jd|f qd S )Nr   r   )hasattr
splitlinesr   ry   append)r   msgliner   r   r   log_scriptlet_output  s    
z"SwdbInterface.log_scriptlet_outputc                 C   s   t | dsd S |d u rDtjj}| jD ]}|jtjjkr$tjj} qDq$| jD ]\}}| j	
|| qJg | _| j	tt t|| d S )Nr   )r   rW   rX   ZTransactionState_DONEr>   r7   ZTransactionItemState_ERRORZTransactionState_ERRORry   r   ZaddConsoleOutputLineZendTransactionrV   r   rt   )r   rU   rZ   errorsZtsiZfile_descriptorr   r   r   r   end  s     


zSwdbInterface.endc                 C   s   | j |S )z{ Search for history transactions which contain specified
            packages al. la. "yum list". Returns transaction ids. )r   ZsearchTransactionsByRPM)r   ZpatternsZignore_caser   r   r   search  s    zSwdbInterface.searchc                 C   s8   | j |j|jd}|tjjkr$dS |tjjkr4dS dS )z)Returns True if package is user installedr   TF)r   resolveRPMTransactionItemReasonr%   r)   rW   rX   TransactionItemReason_USERTransactionItemReason_UNKNOWN)r   r@   r0   r   r   r   user_installed  s    zSwdbInterface.user_installedc                 C   sF   |r| j |j|j|}n| j |j|jd}|tjjkrBtjj}|S )a2  Get reason of package before transaction being undone. If package
        is already installed in the system, keep his reason.

        :param pkg: package being installed
        :param first_trans: id of first transaction being undone
        :param rollback: True if transaction is performing a rollbackr   )r   r   r%   r)   rW   rX   r   r   )r   r@   Zfirst_transZrollbackrj   r   r   r   get_erased_reason  s    zSwdbInterface.get_erased_reason)r2   )T)Nr   F)Nr2   )r2   NN)T)rC   rD   rE   r   r{   rF   r>   r|   r}   r   r   r   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rs     s<   









	

rs   )r   r~   r   Zlibdnf.transactionrW   Zlibdnf.utilsZdnf.i18nr   Zdnf.yumr   Zdnf.exceptionsr   r|   r   r   r   objectr	   rH   rq   rs   r   r   r   r   <module>   s    M"