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rše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 ¡ qŒdS dS )é    Néx   éd   éP   é<   é(   é   )ÚmainÚuniverseÚcontribÚ
restrictedznon-freeÚ
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_pkgÚ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 s�w   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Úsqlite3ÚconnectÚexecutescriptÚcreate_db_sqlÚ_fill_commandsÚOperationalErrorÚstrÚwarningÚsysÚexitr$   r   ÚrenameÚopenÚjsonÚdumpÚ_calc_input_metadata)r   ÚdbnameÚmetadata_fileÚ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"   Úexistsr;   r<   Úloadr>   Ú	Exceptionr.   r7   )r   r@   rC   Ú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   ÚstatrI   rJ   rK   rL   rM   rN   )r   rH   ÚpÚstr   r   r   r>   {   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)ÚstdoutÚContentsr   z#/usr/lib/apt/apt-helper cat-file {})Ú
returncodeÚcmdr'   zprocessed %i packages in %.2fsr&   )r(   Ú
subprocessÚPopenÚPIPEÚ_parse_single_contents_filerR   Ú_parse_single_commands_fileÚwaitÚCalledProcessErrorrT   Úformatr   r   r.   r/   )r   rB   ÚfÚsubr   r   r   r4   ˆ   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=?;
            ©ÚexecuteÚfetchone)r   rB   Ú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=?©ra   )r   rB   Ú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   r`   )r   rB   rd   Ú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 (?, ?, ?, ?);
            )ra   Ú	lastrowid)r   rB   rd   ÚversionÚ	componentÚpriorityÚcurr   r   r   Ú_insert_package¨   s   
ýzDbCreator._insert_packagec                 C   s   |  d||f¡ d S )NzF
        INSERT INTO commands (command, pkgID) VALUES (?, ?);
        rg   )r   rB   rc   Ú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 sŽw   Y  |rÏt  ||d ¡dkrÅt d|
 ¡ t
d| jƒ� |  ||d ¡ W d   ƒ n1 s¿w   Y  n
t d|
|f ¡ qot d|
|||f ¡ t
d| jƒ� |  ||¡}W d   ƒ n1 sñw   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
-backportsrn   ÚarchÚallr&   é   Únamezvisible-pkgnamerm   Ú zignore-commandsú,Ú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)   ÚTagFileÚstepÚsectionÚendswithr+   r   ÚgetÚsetÚsplitr   rf   Úversion_comparer.   Údebugri   rk   Úcomponent_prioritiesÚintrq   rs   )r   rB   rC   Útagfrt   rn   ru   rd   rm   Úignore_commandsrc   re   rr   ro   r   r   r   rZ   ²   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 s‹w   Y  |r�	 t d||f ¡ q@t d||||f ¡ t
d| jƒ� |  ||¡}W d   ƒ n1 s¿w   Y  |sét|
 }t
d| jƒ� |  ||||
|¡}W d   ƒ n1 säw   Y  t
d| jƒ� |  |||¡ W d   ƒ n	1 �sw   Y  q@qd S )Nzutf-8zusr/sbinzusr/binÚbinÚsbinrw   rz   ú/Úunknownr}   r   r|   Fr   r~   r   r€   r�   r‚   r„   r…   )ÚdecodeÚ
startswithrŒ   Ú
ValueErrorr   r"   ÚbasenameÚstripÚrsplitÚlenr   r   rf   r)   r�   r.   rŽ   ri   rk   r�   rq   rs   )r   rB   r^   rC   rt   Úlrc   Úpkgnamesrd   rˆ   rn   rm   re   rr   ro   r   r   r   rY   ë   sd   

ÿÿÿþÿÿÿÿÿ€Ýôz%DbCreator._parse_single_contents_fileN)r   r   r   r   rD   r-   r>   r4   rf   ri   rk   rq   rs   rZ   rY   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-*rw   r}   z%s: %s)r    r<   r.   r   r0   rV   r8   r   r)   Úinitr�   r3   r   r$   r%   r   ÚbasicConfigÚINFOr�   ÚargvÚprintr9   ÚcolrD   r   ÚitemsrO   ÚamountrŽ   r   r   r   r   Ú<module>   sF   ú S
ö	