o
    a/                     @   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rejejd eejdk rve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  qdS 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v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   sF   zt |  W d S  ty" } z|jtjkr W Y d }~d S d }~ww r
   )osremoveOSErrorerrnoENOENT)pather   r   r   rm_fH   s   r    c                   @   sl   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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|<}z|t | | W n' tjyN } zt	|dkrBt
d| td n|W Y d }~nd }~ww W d    n1 sYw   Y  t| t|| t|d}t|  | W d    d S 1 sw   Y  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   s8   

"zDbCreator.createc              
   C   s   t j|sdS z t|}t|}W d    n1 sw   Y  ||  kW S  tyB } zt	d|| W Y d }~dS d }~ww )NTzcannot read %s: %s)
r   r   existsr3   r4   loadr6   	Exceptionr)   r/   )r   r7   r9   metar   r   r   r   r(   q   s   
zDbCreator._db_update_neededc                 C   s@   i }| j D ]}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@   rA   rB   rC   rD   )r   r>   pstr   r   r   r6   {   s   

zDbCreator._calc_input_metadatac              	   C   s   | j D ]B}tjdd|gtjd-}d|v r| |||j n| ||j | dkr6tj|j	d
|dW d    n1 s@w   Y  qt | jd  | jd< td	| jd
 | jd f  d S )Nz/usr/lib/apt/apt-helperzcat-file)stdoutZContentsr   z#/usr/lib/apt/apt-helper cat-file {})
returncodecmdr#   zprocessed %i packages in %.2fsr"   )r$   
subprocessPopenPIPE_parse_single_contents_filerH   _parse_single_commands_filewaitZCalledProcessErrorrI   formatr   r   r)   r*   )r   r8   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   r8   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=?rU   )r   r8   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   rT   )r   r8   rW   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 (?, ?, ?, ?);
            )rU   Z	lastrowid)r   r8   rW   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 (?, ?);
        rZ   )r   r8   rV   pkg_idr   r   r   _insert_command   s   zDbCreator._insert_commandc              	   C   s  t |}| sd S |jd }|drd S |jd }|jd }|dkr,|| jkr,d S | rM| jd  d7  < |jd }|jd	rJ|jd	 }|jd
d}t }	|jddrgt|jdd	d}	|jd 	dD ]}
|
|	v rvqot
d| j | ||
|}W d    n1 sw   Y  |rt ||d dkrtd|
  t
d| j | ||d  W d    n1 sw   Y  n
td|
|f  qotd|
|||f  t
d| j | ||}W d    n1 sw   Y  |s(t| }|t|jdd7 }t
d| j | |||||}W d    n	1 s#w   Y  t
d| j | ||
| W d    n	1 sAw   Y  qo| s1d S d S )Nsuitez
-backportsr^   archallr"      namezvisible-pkgnamer]    zignore-commands,Zcommandssql_already_db   r   +replacing exiting %s in DB (higher version)sql_delete_already_in_db(skipping %s from %s (lower/same version)adding %s from %s/%s (%s)sql_have_pkgzpriority-bonus0sql_insert_pkgsql_insert_cmd)r%   ZTagFilestepsectionendswithr&   r   getsetsplitr	   rY   version_comparer)   debugr[   r\   component_prioritiesintr`   rb   )r   r8   r9   Ztagfrc   r^   rd   rW   r]   Zignore_commandsrV   rX   ra   r_   r   r   r   rO      sf   







z%DbCreator._parse_single_commands_filec              
   C   s  d }|D ]}| d}|ds!|ds!|ds!|ds!qz
|d d\}}W n	 ty4   Y qw tj|}|dD ]}z| dd\}	}W n ty]   | }d	}	Y nw t	|	dd
kro|	d\}
}	nd}
d }t
d| j | |||}W d    n1 sw   Y  |r	 td||f  q@td||||f  t
d| j | ||}W d    n1 sw   Y  |st|
 }t
d| j | ||||
|}W d    n1 sw   Y  t
d| j | ||| W d    n	1 sw   Y  q@qd S )Nzutf-8zusr/sbinzusr/binbinZsbinrf   ri   /unknownrk   r   rj   Fr   rl   rm   rn   ro   rp   rr   rs   )decode
startswithry   
ValueErrorr   r   basenamestriprsplitlenr	   r   rY   r%   rz   r)   r{   r[   r\   r|   r`   rb   )r   r8   rR   r9   rc   lrV   ZpkgnamesrW   ru   r^   r]   rX   ra   r_   r   r   r   rN      sd   

z%DbCreator._parse_single_contents_fileN)r   r   r   r   r:   r(   r6   r-   rY   r[   r\   r`   rb   rO   rN   r   r   r   r   r!   P   s    
	9r!   __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-*rf   rk   z%s: %s)r   r4   r)   r   r+   rK   r0   r   r%   Zinitr|   r,   r	   r    r!   r   ZbasicConfigINFOr   argvprintr1   colr:   r   itemsrE   amountr{   r   r   r   r   <module>   sF    S
	