U
    bL%                     @   s<  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZe	  dddddddZ
d	ZG d
d dZdd ZG dd dZedkr8ejejd eejdk redejd    edejd    edejd   ed eejdd Zeejd  ej D ]\ZZedeef  qdS )    Nx   d   P   <   (      )mainZuniverseZcontribZ
restrictedznon-freeZ
multiversea  
           CREATE TABLE IF NOT EXISTS "commands" 
           (
            [cmdID] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
            [pkgID] INTEGER NOT NULL,
            [command] TEXT,
            FOREIGN KEY ([pkgID]) REFERENCES "pkgs" ([pkgID])
           );
           CREATE TABLE IF NOT EXISTS "packages"
           (
            [pkgID] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
            [name] TEXT,
            [version] TEXT,
            [component] TEXT,
            [priority] INTEGER
           );
           CREATE INDEX IF NOT EXISTS idx_commands_command ON commands (command);
           CREATE INDEX IF NOT EXISTS idx_packages_name ON packages (name);
c                   @   s$   e Zd Zdd Zdd Zdd ZdS )measurec                 C   s   || _ || _d S N)whatstats)selfr   r    r   </usr/lib/python3/dist-packages/CommandNotFound/db/creator.py__init__=   s    zmeasure.__init__c                 C   s   t   | _d S r
   )timenow)r   r   r   r   	__enter__@   s    zmeasure.__enter__c                 G   s:   | j | jkrd| j| j < | j| j   t | j 7  < d S )Nr   )r   r   r   r   )r   argsr   r   r   __exit__B   s    zmeasure.__exit__N)__name__
__module____qualname__r   r   r   r   r   r   r   r	   <   s   r	   c              
   C   sD   zt |  W n0 tk
r> } z|jtjkr. W 5 d }~X Y nX d S r
   )osremoveOSErrorerrnoZENOENT)pather   r   r   rm_fH   s
    r   c                   @   sd   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dS )	DbCreatorc                 C   s(   || _ t d | _dt d| _d S )Nr   )total
total_time)filesapt_pkgZget_architecturesprimary_archr   r   )r   r#   r   r   r   r   Q   s    zDbCreator.__init__c                 C   s   |d }|  |s"td| d S |d }t|l}z|t | | W nL tjk
r } z,t	|dkrt
d| td n|W 5 d }~X Y nX W 5 Q R X t| t|| t|d}t|  | W 5 Q R X d S )Nz	.metadataz0%s does not require an update (inputs unchanged)z.tmpzdatabase is lockedz*%s is locked by another process. Ignoring.r   w)_db_update_neededlogginginfosqlite3ZconnectZexecutescriptcreate_db_sql_fill_commandsZOperationalErrorstrwarningsysexitr   r   renameopenjsondump_calc_input_metadata)r   Zdbnamemetadata_fileZtmpdbconr   fpr   r   r   createU   s0    
 
  zDbCreator.createc              
   C   sx   t j|sdS z,t|}t|}W 5 Q R X ||  kW S  tk
rr } zt	d|| W Y dS d }~X Y nX d S )NTzcannot read %s: %s)
r   r   existsr2   r3   loadr5   	Exceptionr(   r.   )r   r6   r8   metar   r   r   r   r'   q   s    
zDbCreator._db_update_neededc                 C   s@   i }| j D ]0}t|}|j|j|j|j|j|jd||< q
|S )N)st_inost_devst_uidst_gidst_sizest_mtime)	r#   r   statr>   r?   r@   rA   rB   rC   )r   r=   pstr   r   r   r5   {   s    

zDbCreator._calc_input_metadatac              
   C   s   | j D ]V}tjdd|gtjd6}| ||j | dkrRtj|jd	|dW 5 Q R X qt

 | jd  | jd< td| jd	 | jd f  d S )
Nz/usr/lib/apt/apt-helperzcat-file)stdoutr   z#/usr/lib/apt/apt-helper cat-file {})
returncodecmdr"   zprocessed %i packages in %.2fsr!   )r#   
subprocessPopenPIPE_parse_single_commands_filerG   waitZCalledProcessErrorrH   formatr   r   r(   r)   )r   r7   fsubr   r   r   r,      s    
 zDbCreator._fill_commandsc                 C   s   | d||f }|S )Nz
            SELECT packages.pkgID, name, version 
            FROM commands 
            INNER JOIN packages on packages.pkgID = commands.pkgID
            WHERE commands.command=? AND packages.name=?;
            executeZfetchone)r   r7   commandpkgnamealready_in_dbr   r   r   _in_db   s
    zDbCreator._in_dbc                 C   s    | d|f | d|f d S )Nz"DELETE FROM packages WHERE pkgID=?z"DELETE FROM commands WHERE pkgID=?rS   )r   r7   Zpkgidr   r   r   _delete_pkgid   s    zDbCreator._delete_pkgidc                 C   s"   | d|f }|r|d S d S )Nz'SELECT pkgID from packages WHERE name=?r   rR   )r   r7   rU   Zhave_pkgr   r   r   
_get_pkgid   s     zDbCreator._get_pkgidc                 C   s   | d||||f}|jS )Nzt
            INSERT INTO packages (name, version, component, priority)
            VALUES (?, ?, ?, ?);
            )rS   Z	lastrowid)r   r7   rU   version	componentpriorityZcurr   r   r   _insert_package   s    
zDbCreator._insert_packagec                 C   s   | d||f d S )NzF
        INSERT INTO commands (command, pkgID) VALUES (?, ?);
        rX   )r   r7   rT   pkg_idr   r   r   _insert_command   s    zDbCreator._insert_commandc              
   C   s2  t |}| sd S |jd }|dr.d S |jd }|jd }|dkrX|| jkrXd S | r.| jd  d7  < |jd }|jd	r|jd	 }|jd
d}t }	|jddrt|jdd	d}	|jd 	dD ]J}
|
|	krqt
d| j | ||
|}W 5 Q R X |r|t ||d dkrhtd|
  t
d| j | ||d  W 5 Q R X ntd|
|f  qtd|
|||f  t
d| j | ||}W 5 Q R X |st| }|t|jdd7 }t
d| j | |||||}W 5 Q R X t
d| j | ||
| W 5 Q R X qqXd S )Nsuitez
-backportsr\   archallr!      namezvisible-pkgnamer[    zignore-commands,ZcommandsZsql_already_db   r   z+replacing exiting %s in DB (higher version)Zsql_delete_already_in_dbz(skipping %s from %s (lower/same version)zadding %s from %s/%s (%s)Zsql_have_pkgzpriority-bonus0Zsql_insert_pkgZsql_insert_cmd)r$   ZTagFilestepZsectionendswithr%   r   getsetsplitr	   rW   Zversion_comparer(   debugrY   rZ   component_prioritiesintr^   r`   )r   r7   r8   Ztagfra   r\   rb   rU   r[   Zignore_commandsrT   rV   r_   r]   r   r   r   rM      s\    







   z%DbCreator._parse_single_commands_fileN)r   r   r   r   r9   r'   r5   r,   rW   rY   rZ   r^   r`   rM   r   r   r   r   r    P   s   

	r    __main__)level   z%usage: %s <output-db-path> <files...>z. e.g.: %s commands.db ./dists/*/*/*/Commands-*zP e.g.: %s /var/lib/command-not-found/commands.db  /var/lib/apt/lists/*Commands-*rd   rh   z%s: %s)r   r3   r(   r   r*   rJ   r/   r   r$   Zinitrp   r+   r	   r   r    r   ZbasicConfigINFOlenargvprintr0   colr9   r   itemsrD   Zamountro   r   r   r   r   <module>   s@    

