o c^B@sdZddlZzddlZWneyddlmZYnwddlmZmZddl m Z ddl m Z Gddde ZGd d d e ZGd d d eZGd ddeZGdddeZGdddeZGdddeZddZddZddZdS)zEProvide access to the persistent data used by L{PackageTaskHandler}s.N)dbapi2) iteritemslong)bpickle) with_cursorc@eZdZdZdS)UnknownHashIDRequestz$Raised for unknown hash id requests.N__name__ __module__ __qualname____doc__rrA/usr/lib/python3/dist-packages/landscape/lib/apt/package/store.pyrrc@r)InvalidHashIdDbzARaised when trying to add an invalid hash=>id lookaside database.Nr rrrrrrrc@sleZdZdZdZddZddZeddZed d Z ed d Z ed dZ eddZ eddZ dS) HashIdStoreaC{HashIdStore} stores package hash=>id mappings in a file. The file is a SQLite database that contains a single table called "hash". The table schema is defined in L{ensure_hash_id_schema}. @param filename: The file where the mappings are persisted to. NcCs ||_dSN) _filenameselffilenamerrr__init__!s zHashIdStore.__init__cCst|jdSr)ensure_hash_id_schema_dbrrrr_ensure_schema$szHashIdStore._ensure_schemacCs,t|D]\}}|d|t|fqdS)zbSet the ids of a set of hashes. @param hash_ids: a C{dict} of hash=>id mappings. zREPLACE INTO hash VALUES (?, ?)N)rexecutesqlite3Binary)rcursorhash_idshashidrrr set_hash_ids's  zHashIdStore.set_hash_idscCs,|dt|f|}|r|dSdS)zReturn the id associated to C{hash}, or C{None} if not available. @param hash: a C{bytes} representing a hash. SELECT id FROM hash WHERE hash=?rN)rrrfetchone)rr r"valuerrr get_hash_id1s zHashIdStore.get_hash_idcC|ddd|DS)z=Return a C{dict} holding all the available hash=>id mappings.zSELECT hash, id FROM hashcSsi|] }t|d|dqSrbytes.0rowrrr Bsz,HashIdStore.get_hash_ids..rfetchallrr rrr get_hash_ids> zHashIdStore.get_hash_idscCs<t|ttfs J|d|f|}|rt|dSdS)zAReturn the hash associated to C{id}, or C{None} if not available.z SELECT hash FROM hash WHERE id=?rN) isinstanceintrrr&r-)rr r#r'rrr get_id_hashDs  zHashIdStore.get_id_hashcC|ddS)zDelete all hash=>id mappings.zDELETE FROM hashNrr4rrrclear_hash_idsNzHashIdStore.clear_hash_idscCs.z |ddWdStjyt|jw)zCheck database integrity. @raise: L{InvalidHashIdDb} if the filenme passed to the constructor is not a SQLite database or does not have a table called "hash" with a compatible schema. r%)N)rr DatabaseErrorrrr4rrr check_sanitySs  zHashIdStore.check_sanity)r r r r rrrrr$r(r5r9r<r@rrrrrs"     rcseZdZdZfddZfddZddZdd Zd d Zd d Z e ddZ e ddZ e ddZ e ddZe ddZe ddZe ddZe ddZe ddZe d d!Ze d"d#Ze d$d%Ze d&d'Ze d(d)Ze d*d+Ze d,d-Ze d.d/Ze d0d1Ze d2d3Ze d4d5Ze d6d7Ze d8d9Z e d:d;Z!e dd?Z#e d@dAZ$e dBdCZ%e dDdEZ&e dFdGZ'e dHdIZ(e dMdKdLZ)Z*S)N PackageStoreaPersist data about system packages and L{PackageTaskHandler}'s tasks. This class extends L{HashIdStore} by adding tables to the SQLite database backend for storing information about the status of the system packages and about the tasks to be performed by L{PackageTaskHandler}s. The additional tables and schemas are defined in L{ensure_package_schema}. @param filename: The file where data is persisted to. cstt||g|_dSr)superrAr_hash_id_storesr __class__rrrms zPackageStore.__init__ctt|t|jdSr)rBrArensure_package_schemarrrDrrrqzPackageStore._ensure_schemac CsBt|}z|Wnty}z|d}~ww|j|dS)a  Attach an additional "lookaside" hash=>id database. This method can be called more than once to attach several hash=>id databases, which will be queried *before* the main database, in the same the order they were added. If C{filename} is not a SQLite database or does not have a table called "hash" with a compatible schema, L{InvalidHashIdDb} is raised. @param filename: a secondary SQLite databases to look for pre-canned hash=>id mappings. N)rr@rrCappend)rr hash_id_storeerrradd_hash_id_dbus zPackageStore.add_hash_id_dbcCst|jdkS)z?Return C{True} if one or more lookaside databases are attached.r)lenrCrrrrhas_hash_id_dbzPackageStore.has_hash_id_dbcCs<t|tsJ|jD] }||}|r|Sq t||S)a Return the id associated to C{hash}, or C{None} if not available. This method composes the L{HashIdStore.get_hash_id} methods of all the attached lookaside databases, falling back to the main one, as described in L{add_hash_id_db}. )r7r-rCr(r)rr"storer#rrrr(s   zPackageStore.get_hash_idcCs2|jD]}||}|dur|Sqt||S)a'Return the hash associated to C{id}, or C{None} if not available. This method composes the L{HashIdStore.get_id_hash} methods of all the attached lookaside databases, falling back to the main one in case the hash associated to C{id} is not found in any of them. N)rCr9r)rr#rPr"rrrr9s   zPackageStore.get_id_hashcC|D] }|d|fqdS)Nz!REPLACE INTO available VALUES (?)r;rr idsr#rrr add_availablezPackageStore.add_availablecC&ddd|D}|d|dS)N,cs|] }tt|VqdSrstrr8r/r#rrr z0PackageStore.remove_available..z&DELETE FROM available WHERE id IN (%s)joinrrr rSid_listrrrremove_availablezPackageStore.remove_availablecC|ddS)NzDELETE FROM availabler;r4rrrclear_availablerOzPackageStore.clear_availablecCr))NzSELECT id FROM availablecSg|]}|dqSrrr.rrr z.PackageStore.get_available..r2r4rrr get_available zPackageStore.get_availablecCrQ)Nz)REPLACE INTO available_upgrade VALUES (?)r;rRrrradd_available_upgradesrUz#PackageStore.add_available_upgradescCrV)NrWcsrXrrYr[rrrr\r]z9PackageStore.remove_available_upgrades..z.DELETE FROM available_upgrade WHERE id IN (%s)r^r`rrrremove_available_upgradess z&PackageStore.remove_available_upgradescCrd)NzDELETE FROM available_upgrader;r4rrrclear_available_upgradesrOz%PackageStore.clear_available_upgradescCr))Nz SELECT id FROM available_upgradecSrfrgrr.rrrrhriz7PackageStore.get_available_upgrades..r2r4rrrget_available_upgradesrkz#PackageStore.get_available_upgradescCrQ)Nz%REPLACE INTO autoremovable VALUES (?)r;rRrrradd_autoremovablerUzPackageStore.add_autoremovablecCrV)NrWcsrXrrYr[rrrr\r]z4PackageStore.remove_autoremovable..z*DELETE FROM autoremovable WHERE id IN (%s)r^r`rrrremove_autoremovablercz!PackageStore.remove_autoremovablecCrd)NzDELETE FROM autoremovabler;r4rrrclear_autoremovablerOz PackageStore.clear_autoremovablecCr))NzSELECT id FROM autoremovablecSrfrgrr.rrrrhriz2PackageStore.get_autoremovable..r2r4rrrget_autoremovablerkzPackageStore.get_autoremovablecCrQ)Nz REPLACE INTO security VALUES (?)r;rRrrr add_securityrUzPackageStore.add_securitycCrV)NrWcsrXrrYr[rrrr\r]z/PackageStore.remove_security..z%DELETE FROM security WHERE id IN (%s)r^r`rrrremove_securityrczPackageStore.remove_securitycCrd)NzDELETE FROM securityr;r4rrrclear_securityrOzPackageStore.clear_securitycCr))NzSELECT id FROM securitycSrfrgrr.rrrrhriz-PackageStore.get_security..r2r4rrr get_securityrkzPackageStore.get_securitycCrQ)Nz!REPLACE INTO installed VALUES (?)r;rRrrr add_installedrUzPackageStore.add_installedcCrV)NrWcsrXrrYr[rrrr\r]z0PackageStore.remove_installed..z&DELETE FROM installed WHERE id IN (%s)r^r`rrrremove_installedrczPackageStore.remove_installedcCrd)NzDELETE FROM installedr;r4rrrclear_installedrOzPackageStore.clear_installedcCr))NzSELECT id FROM installedcSrfrgrr.rrrrhriz.PackageStore.get_installed..r2r4rrr get_installed rkzPackageStore.get_installedcCr))z+Get the package ids of all locked packages.zSELECT id FROM lockedcSrfrgrr.rrrrhriz+PackageStore.get_locked..r2r4rrr get_lockedr6zPackageStore.get_lockedcCs|D] }|d|fqdS)z9Add the given package ids to the list of locked packages.zREPLACE INTO locked VALUES (?)Nr;rRrrr add_lockedszPackageStore.add_lockedcCrV)NrWcsrXrrYr[rrrr\r]z-PackageStore.remove_locked..z#DELETE FROM locked WHERE id IN (%s)r^r`rrr remove_lockedrczPackageStore.remove_lockedcCr:)z/Remove all the package ids in the locked table.zDELETE FROM lockedNr;r4rrr clear_locked"r=zPackageStore.clear_lockedcCs6t|}|dtt|tft|j|j S)Nz.r2r4rrriter_hash_id_requests7s z"PackageStore.iter_hash_id_requestscCrd)NzDELETE FROM hash_id_requestr;r4rrrclear_hash_id_requests<rOz#PackageStore.clear_hash_id_requestscCs4t|}|d|tt|ft|j|jS)Nz8INSERT INTO task (queue, timestamp, data) VALUES (?,?,?)) rrrrrr PackageTaskrr)rr queuedatarrradd_task@s zPackageStore.add_taskcCs.|d|f|}|rt|j|dSdS)Nz4SELECT id FROM task WHERE queue=? ORDER BY timestampr)rr&rr)rr rr0rrr get_next_taskHszPackageStore.get_next_taskrcCs"|dddd|DdS)Nz%DELETE FROM task WHERE id NOT IN (%s)rWcSsg|]}t|jqSr)rZr#)r/taskrrrrhTsz,PackageStore.clear_tasks..)rr_)rr except_tasksrrr clear_tasksQs zPackageStore.clear_tasks)r)+r r r r rrrLrNr(r9rrTrbrerjrlrmrnrorprqrrrsrtrurvrwrxryrzr{r|r}r~rrrrrrrr __classcell__rrrDrrAas                               rAcsPeZdZdZfddZeddZeddZedd Zed d Z Z S) FakePackageStorezT A L{PackageStore} with an additional message table to store sent messages. crFr)rBrrensure_fake_package_schemarrrDrrr\rHzFakePackageStore._ensure_schemacCs|dtt|fdS)Nz%INSERT INTO message (data) VALUES (?))rrrrr)rr messagerrr save_message`szFakePackageStore.save_messagecCsdd|dDS)NcSrfrgrr.rrrrhgriz4FakePackageStore.get_message_ids..zSELECT id FROM messager2r4rrrget_message_idses z FakePackageStore.get_message_idscCs|ddd|DdS)Nz#INSERT INTO message (id) VALUES (?)cSsg|]}|fqSrr)r/ message_idrrrrhnsz5FakePackageStore.save_message_ids..) executemany)rr message_idsrrrsave_message_idsjs z!FakePackageStore.save_message_idscCs:ddgt|}|d|t|}dd|DS)Nz, ?z9SELECT id, data FROM message WHERE id IN (%s) ORDER BY idcSs g|] }|dt|dfqSr*r,r.rrrrhvs z8FakePackageStore.get_messages_by_ids..)r_rMrtupler3)rr rparamsresultrrrget_messages_by_idspsz$FakePackageStore.get_messages_by_ids) r r r r rrrrrrrrrrDrrWs    rc@steZdZddZeeddZeddZeddZeeeZ ed d Z ed d Z ee e Z ed dZ dS)rcCs||_||_dSr)rr#)rdbr#rrrr{s zHashIDRequest.__init__cCs&|d|jftt|dS)Nz-SELECT hashes FROM hash_id_request WHERE id=?r)rr#rloadsr-r&r4rrrrszHashIDRequest.hashescC|d|jf|dS)Nz0SELECT timestamp FROM hash_id_request WHERE id=?rrr#r&r4rrr_get_timestamp zHashIDRequest._get_timestampcC|d||jfdS)Nz1UPDATE hash_id_request SET timestamp=? WHERE id=?rr#rr r'rrr_set_timestampzHashIDRequest._set_timestampcCr)Nz1SELECT message_id FROM hash_id_request WHERE id=?rrr4rrr_get_message_idrzHashIDRequest._get_message_idcCr)Nz2UPDATE hash_id_request SET message_id=? WHERE id=?rrrrr_set_message_idrzHashIDRequest._set_message_idcC|d|jfdS)Nz&DELETE FROM hash_id_request WHERE id=?rr4rrrremovezHashIDRequest.removeN)r r r rpropertyrrrr timestamprrrrrrrrrys"       rc@s eZdZddZeddZdS)rcCsn||_||_|}z|d|f|}W|n|w|d|_|d|_t t |d|_ dS)Nz2SELECT queue, timestamp, data FROM task WHERE id=?rr+) rr#r rr&closerrrrr-r)rrr#r r0rrrrs   zPackageTask.__init__cCr)NzDELETE FROM task WHERE id=?rr4rrrrrzPackageTask.removeN)r r r rrrrrrrrsrc CsX|}z|dWntjtjfy!||YdSw||dS)zeCreate all tables needed by a L{HashIdStore}. @param db: A connection to a SQLite database. zs*    Jw", %