o a/@s<ddlZddlZddlZddlZddlZddlZddlZddlZddlZe dddddddZ d Z Gd d d Z d d Z GdddZedkrejejdeejdkrvedejdedejdedejdedeejddZeejdejD]\ZZedeefqdSdS)NxdP<()mainuniversecontrib restrictedznon-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$eZdZddZddZddZdS)measurecCs||_||_dSN)whatstats)selfrrr Exceptionr.r7)rr@rCmetar#rrrr-qs   zDbCreator._db_update_neededcCs@i}|jD]}t|}|j|j|j|j|j|jd||<q|S)N)st_inost_devst_uidst_gidst_sizest_mtime) r(rstatrIrJrKrLrMrN)rrHpstrrrr>{s   zDbCreator._calc_input_metadatac Cs|jD]B}tjdd|gtjd-}d|vr||||jn|||j|dkr6tj|j d |dWdn1s@wYqt |j d|j d<t d |j d |j dfdS) Nz/usr/lib/apt/apt-helperzcat-file)stdoutContentsrz#/usr/lib/apt/apt-helper cat-file {}) returncodecmdr'zprocessed %i packages in %.2fsr&)r( subprocessPopenPIPE_parse_single_contents_filerR_parse_single_commands_filewaitCalledProcessErrorrTformatrrr.r/)rrBfsubrrrr4s    zDbCreator._fill_commandscCs|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=?; executefetchone)rrBcommandpkgname already_in_dbrrr_in_dbszDbCreator._in_dbcCs |d|f|d|fdS)Nz"DELETE FROM packages WHERE pkgID=?z"DELETE FROM commands WHERE pkgID=?ra)rrBpkgidrrr _delete_pkgidszDbCreator._delete_pkgidcCs"|d|f}|r|dSdS)Nz'SELECT pkgID from packages WHERE name=?rr`)rrBrdhave_pkgrrr _get_pkgidszDbCreator._get_pkgidcCs|d||||f}|jS)Nzt INSERT INTO packages (name, version, component, priority) VALUES (?, ?, ?, ?); )ra lastrowid)rrBrdversion componentprioritycurrrr_insert_packages zDbCreator._insert_packagecCs|d||fdS)NzF INSERT INTO commands (command, pkgID) VALUES (?, ?); rg)rrBrcpkg_idrrr_insert_commandszDbCreator._insert_commandc Cst|}|s dS|jd}|drdS|jd}|jd}|dkr,||jkr,dS|rM|jdd7<|jd}|jd rJ|jd }|jd d }t} |jd d rgt|jd d  d } |jd d D]} | | vrvqot d|j| || |} Wdn1swY| rt || ddkrt d| t d|j||| dWdn1swYn t d| |fqot d| |||ft d|j|||} Wdn1swY| s(t|} | t|jdd7} t d|j|||||| } Wdn 1s#wYt d|j||| | Wdn 1sAwYqo|s1dSdS)Nsuitez -backportsrnarchallr&namezvisible-pkgnamermzignore-commands,commandssql_already_dbr+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_pkgzpriority-bonus0sql_insert_pkgsql_insert_cmd)r)TagFilestepsectionendswithr+rgetsetsplitr rfversion_comparer.debugrirkcomponent_prioritiesintrqrs)rrBrCtagfrtrnrurdrmignore_commandsrcrerrrorrrrZsf         z%DbCreator._parse_single_commands_filec Csd}|D]}|d}|ds!|ds!|ds!|ds!qz |dd\}}Wn ty4Yqwtj|}|dD]}z |dd\} }Wnty]|}d } Ynwt | dd kro| d\} } nd } d} t d |j | |||} Wdn1swY| r td||fq@td||| |ft d|j |||} Wdn1swY| st| }t d|j |||| | |} Wdn1swYt d|j |||| Wdn 1swYq@qdS)Nzutf-8zusr/sbinzusr/binbinsbinrwrz/unknownr}rr|Frr~rrrrrr)decode startswithr ValueErrorrr"basenamestriprsplitlenr rrfr)rr.rrirkrrqrs)rrBr^rCrtlrcpkgnamesrdrrnrmrerrrorrrrYsd     z%DbCreator._parse_single_contents_fileN)rrrrrDr-r>r4rfrirkrqrsrZrYrrrrr%Ps    9r%__main__)levelz%usage: %s z. e.g.: %s commands.db ./dists/*/*/*/Commands-*zP e.g.: %s /var/lib/command-not-found/commands.db /var/lib/apt/lists/*Commands-*rwr}z%s: %s)r r<r.rr0rVr8rr)initrr3r r$r%r basicConfigINFOrargvprintr9colrDritemsrOamountrrrrrsF  S