a
    Dc``?                     @   sf   d dl mZ d dlmZ d dlZd dlZG dd deZG dd deZ	G dd	 d	e	Z
dddZdS )    )ndbm)_Nc                   @   s   e Zd ZdS )DbErrorN)__name__
__module____qualname__ r   r   '/usr/share/apt-listchanges/ALCSeenDb.pyr       s   r   c                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )seendb_dummyzYInterface for seen database.
       Also used when path to the database is not configuredc                 C   s   dS )NFr   self
srcpackager   r   r	   __contains__&   s    zseendb_dummy.__contains__c                 C   s   d S Nr   r   r   r   r	   __getitem__)   s    zseendb_dummy.__getitem__c                 C   s   d S r   r   r   r   versionr   r   r	   __setitem__,   s    zseendb_dummy.__setitem__c                 C   s   d S r   r   r   r   r   r	   close_db/   s    zseendb_dummy.close_dbc                 C   s   d S r   r   r   r   r   r	   apply_changes2   s    zseendb_dummy.apply_changesc                 C   s   t tdd S )NzPath to the seen database is unknown.
Please either specify it with --save-seen option
or pass --profile=apt to have it read from the configuration file.)r   r   r   r   r   r	   dump5   s    zseendb_dummy.dumpN)
r   r   r   __doc__r   r   r   r   r   r   r   r   r   r	   r
   #   s   r
   c                       sR   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
  ZS )seendbz!Class to manage the seen databaseFc              
      s   t    d| _|dd  | jkr:ttd|| jd |d d | _z,|rRdnd}t| j|d| _d| jv  W n@ t	y } z(ttd	|t
|d
 |W Y d }~n
d }~0 0 i | _d S )Nz.dbz)Database %(db)s does not end with %(ext)s)dbZextrc  zfoo%0z*Database %(db)s failed to load: %(errmsg)s)r   errmsg)super__init__
_extensionr   r   _dbpathr   open_seen	Exceptionstr	_seen_new)r   pathreadOnlymodeex	__class__r   r	   r!   <   s$    

zseendb.__init__c                 C   s
   || j v S r   )r%   r   r   r   r	   r   P   s    zseendb.__contains__c                 C   s   | j |  S r   )r%   decoder   r   r   r	   r   S   s    zseendb.__getitem__c                 C   s$   | j |d |kr || j|< d S )N    )r%   getr/   r(   r   r   r   r	   r   V   s    zseendb.__setitem__c                 C   s   | j   d | _ d S r   )r%   closer   r   r   r	   r   [   s    
zseendb.close_dbc                    s    j s
d S  fdd}|d|d|d  }}}tj|rJt|| t jd dd} j 	 D ]\}}|||< qh|
  tj|rt| tj|rt|| t|| d S )Nc                    s    j |   j S r   )r#   r"   )argr   r   r	   mkd   s    z seendb.apply_changes.<locals>.mkz-old z-newr   r   )r(   osr)   isfileshutilcopyr   r$   r#   itemsr2   unlinklinkrename)r   r4   oldZcurnewseenkeyvaluer   r   r	   r   _   s    

zseendb.apply_changesc                 C   s:   t | j D ]&}| j| }td| | f  qd S )Nz%s %s)sortedr%   keysprintr/   )r   rA   rB   r   r   r	   r   {   s    
zseendb.dump)F)r   r   r   r   r!   r   r   r   r   r   r   __classcell__r   r   r-   r	   r   :   s   r   Fc                 C   s   | j rt| j |S t S r   )Z	save_seenr   r
   )Zconfigr*   r   r   r	   make_seen_db   s    rG   )F)Zdbmr   ZALChacksr   r6   r8   r&   r   objectr
   r   rG   r   r   r   r	   <module>   s   G