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   <   (      )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 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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 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
-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 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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
	