
    {c/                        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j                          ddddddddZ
d	Z G d
 d      Zd Z G d d      Zedk(  r ej                   ej"                          eej&                        dk  rX edej&                  d    z          edej&                  d    z          edej&                  d            ej*                  d        eej&                  dd       Zej/                  ej&                  d          ej0                  j3                         D ]  \  ZZ ej8                  ede        yy)    Nx   d   P   <   (      )mainuniversecontribznon-free-firmware
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                       e Zd Zd Zd Zd Zy)measurec                      || _         || _        y N)whatstats)selfr   r   s      </usr/lib/python3/dist-packages/CommandNotFound/db/creator.py__init__zmeasure.__init__>   s    	
    c                 6    t        j                          | _        y r   )timenow)r   s    r   	__enter__zmeasure.__enter__A   s    99;r   c                     | j                   | j                  vrd| j                  | j                   <   | j                  | j                   xx   t        j                         | j                  z
  z  cc<   y )Nr   )r   r   r   r   )r   argss     r   __exit__zmeasure.__exit__C   sK    yyDJJ&$%DJJtyy!

499txx!77r   N)__name__
__module____qualname__r   r   r    r   r   r   r   =   s    8r   r   c                     	 t        j                  |        y # t        $ r(}|j                  t        j                  k7  r Y d }~y d }~ww xY wr   )osremoveOSErrorerrnoENOENT)pathes     r   rm_fr+   I   s:    
		$ 77ell" #s    	A	AA	c                   T    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zy)	DbCreatorc                     || _         t        j                         d   | _        dt	        j                         d| _        y )Nr   )total
total_time)filesapt_pkgget_architecturesprimary_archr   r   )r   r1   s     r   r   zDbCreator.__init__R   s1    
#557: tyy{;
r   c                    |dz   }| j                  |      st        j                  d|       y |dz   }t        j                  |      5 }	 |j                  t               | j                  |       d d d        t        |       t        j                  ||       t!        |d      5 }t#        j$                  | j'                         |       d d d        y # t        j                  $ rF}t        |      dk(  r,t        j                  d|       t        j                  d       n|Y d }~d }~ww xY w# 1 sw Y   xY w# 1 sw Y   y xY w)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*   fps          r   createzDbCreator.createV   s   {*%%m4LLBFLv__U# 	s!!-0##C(	 	]
		% -% 	7IId//126	7 	7 ++ 	 q611OODeMHHQKG  			 	&	7 	7s<   D/
&C%%D;D,&<D'"D/'D,,D//D8;Ec                 .   t         j                  j                  |      sy	 t        |      5 }t	        j
                  |      }d d d        | j                         k7  S # 1 sw Y   xY w# t        $ r!}t        j                  d||       Y d }~yd }~ww xY w)NTzcannot read %s: %s)
r$   r)   existsrE   rF   loadrH   	Exceptionr8   rA   )r   rJ   rM   metar*   s        r   r7   zDbCreator._db_update_neededr   s    ww~~m,	m$ %yy}%444666% %  	OO0-C	s.   A* AA* A'#A* *	B3BBc                     i }| j                   D ]_  }t        j                  |      }|j                  |j                  |j
                  |j                  |j                  |j                  d||<   a |S )N)st_inost_devst_uidst_gidst_sizest_mtime)	r1   r$   statrU   rV   rW   rX   rY   rZ   )r   rS   psts       r   rH   zDbCreator._calc_input_metadata|   sc     		AB))))))))::KKDG		 r   c                 p   | j                   D ]  }t        j                  dd|gt        j                        5 }d|v r| j	                  |||j
                         n| j                  ||j
                         |j                         dk7  r0t        j                  |j                  dj                  |            	 d d d         t        j                         | j                  d   z
  | j                  d<   t        j                  d	| j                  d
   | j                  d   fz         y # 1 sw Y   (xY w)Nz/usr/lib/apt/apt-helperzcat-file)stdoutContentsr   z#/usr/lib/apt/apt-helper cat-file {})
returncodecmdr0   zprocessed %i packages in %.2fsr/   )r1   
subprocessPopenPIPE_parse_single_contents_filer_   _parse_single_commands_filewaitCalledProcessErrorra   formatr   r   r8   r9   )r   rL   fsubs       r   r>   zDbCreator._fill_commands   s    	nA!!#<j!"LU_UdUde nil?44S!SZZH44S#**E88:?$773>>=b=i=ijk=ln n #n n	n $(99;L1I#I

< 5JJwL!99; ; 	<n ns   BD++D5	c                 J    |j                  d||f      j                         }|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   rL   commandpkgnamealready_in_dbs        r   _in_dbzDbCreator._in_db   s3    
 7#% &.XZ 	 r   c                 P    |j                  d|f       |j                  d|f       y )Nz"DELETE FROM packages WHERE pkgID=?z"DELETE FROM commands WHERE pkgID=?ro   )r   rL   pkgids      r   _delete_pkgidzDbCreator._delete_pkgid   s$    85(D85(Dr   c                 T    |j                  d|f      j                         }|r|d   S y )Nz'SELECT pkgID from packages WHERE name=?r   rn   )r   rL   rr   have_pkgs       r   
_get_pkgidzDbCreator._get_pkgid   s2    ;;5zCCK8: 	A;r   c                 F    |j                  d||||f      }|j                  S )Nzt
            INSERT INTO packages (name, version, component, priority)
            VALUES (?, ?, ?, ?);
            )ro   	lastrowid)r   rL   rr   version	componentprioritycurs          r   _insert_packagezDbCreator._insert_package   s/    KK  7Ix8: }}r   c                 ,    |j                  d||f       y )NzF
        INSERT INTO commands (command, pkgID) VALUES (?, ?);
        rv   )r   rL   rq   pkg_ids       r   _insert_commandzDbCreator._insert_command   s     v	 r   c                    t        j                  |      }|j                         sy |j                  d   }|j	                  d      ry |j                  d   }|j                  d   }|dk7  r|| j
                  k7  ry |j                         r| j                  dxx   dz  cc<   |j                  d   }|j                  j                  d	      r|j                  d	   }|j                  j                  d
d      }t               }	|j                  j                  dd      r4t        |j                  j                  dd      j                  d            }	|j                  d   j                  d      D ]  }
|
|	v r	t        d| j                        5  | j                  ||
|      }d d d        rt        j                  ||d         dkD  rMt        j                  d|
z         t        d| j                        5  | j                  ||d          d d d        nt        j                  d|
d|d       t        j                  d|
d|d|d|d	       t        d| j                        5  | j!                  ||      }d d d        srt"        j                  |d      }|t%        |j                  j                  dd            z  }t        d| j                        5  | j'                  |||||      }d d d        t        d| j                        5  | j)                  ||
|       d d d         |j                         ry y # 1 sw Y   xY w# 1 sw Y   'xY w# 1 sw Y   xY w# 1 sw Y   xxY w# 1 sw Y   xY w) Nsuitez
-backportsr   archallr/      namezvisible-pkgnamer~    zignore-commands,commandssql_already_db   r   z+replacing exiting %s in DB (higher version)sql_delete_already_in_db	skipping  from  (lower/same version)adding / ()sql_have_pkgzpriority-bonus0sql_insert_pkgsql_insert_cmd)r2   TagFilestepsectionendswithr4   r   getsetsplitr   rt   version_comparer8   debugrx   r{   component_prioritiesintr   r   )r   rL   rM   tagfr   r   r   rr   r~   ignore_commandsrq   rs   r   r   s                 r   rg   z%DbCreator._parse_single_commands_file   s   r"yy{ll7#>>,',,{+	\\&!5=TT%6%66iikJJw1$LL(G || 12,,'89LL$$Y3GEO|| 126 #DLL$4$45F$K$Q$QRU$V W<<
399#> ?o--tzz: E"&++c7G"DME  ..wa8HIAM&SV]&]^$%?L F ..sM!4DEF F  T[]b&cd Wgu6 7 ^TZZ8 ;!__S':F;377	1EHDLL$4$45Es$K LLH !14::> b!%!5!5c7GYX`!ab-tzz: ?((gv>? ?5? iikk E EF F; ;
b b? ?s<   M7M+MM)M5M	M	M&	)M2	5M?	c                 "   d }|D ]#  }|j                  d      }|j                  d      s4|j                  d      s#|j                  d      s|j                  d      sZ	 |j                  d d      \  }}t        j
                  j                  |      }|j                  d      D ]  }	 |j                         j                  dd      \  }	}t        |	j                  d            d
k(  r|	j                  d      \  }
}	nd}
d }t        d| j                        5  | j                  |||      }d d d        r	 t        j                   d|d|d       t        j                   d|d|d|d|d	       t        d| j                        5  | j%                  ||      }d d d        sJt&        j)                  |
d      }t        d| j                        5  | j+                  ||||
|      }d d d        t        d| j                        5  | j-                  |||       d d d         & y # t        $ r Y 4w xY w# t        $ r |j                         }d	}	Y w xY w# 1 sw Y   4xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w)Nzutf-8zusr/sbinzusr/binbinsbinr   r   r   unknownr   r	   r   r   r   r   r   r   r   r   r   r   r   )decode
startswithr   
ValueErrorr$   r)   basenamestriprsplitlenr   r   rt   r2   r   r8   r   rx   r{   r   r   r   r   )r   rL   rk   rM   r   lrq   pkgnamesrr   r   r   r~   rs   r   r   s                  r   rf   z%DbCreator._parse_single_contents_file   se    0	?A!ALL,Y0GLL'1<<+?$%GGD!$4! gg&&w/G#>>#. $?('.}}'='=c1'E$GW w}}S)*a/)0s);&Iw &I -tzz: E"&++c7G"DME  
  T[]b&cd Wgu6 7 ^TZZ8 ;!__S':F;377	1EH !14::> b!%!5!5c7GYX`!ab-tzz: ?((gv>? ?G$?0	?   " (%mmoG'G(E E; ;b b? ?sT    H-*#H=II,I8
J-	H:9H:=III),I58JJN)r   r    r!   r   rN   r7   rH   r>   rt   rx   r{   r   r   rg   rf   r"   r   r   r-   r-   Q   s@    <78	<E 7?r4?r   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-*r   r   z: )r'   rF   r8   r$   r:   rc   rB   r   r2   initr   r=   r   r+   r-   r   basicConfigINFOr   argvprintrC   colrN   r   itemsr[   amountr   r"   r   r   <module>r      sL      	   
     :	8 	8O? O?d zGgll+
388}q5CD>!LM`bebjbjklbmn
CHHQRL
!CJJsxx{		) 1f$/01 r   