~eA dZddlZ ddlZddlmZmZddl m Z ddl m Z Gdde ZGd d e ZGd d ZGd deZGddeZGddZGddZdZdZdZy#e$r ddlmZYuwxYw)zEProvide access to the persistent data used by L{PackageTaskHandler}s.N)dbapi2) iteritemslong)bpickle) with_cursorceZdZdZy)UnknownHashIDRequestz$Raised for unknown hash id requests.N__name__ __module__ __qualname____doc__A/usr/lib/python3/dist-packages/landscape/lib/apt/package/store.pyr r s.rr ceZdZdZy)InvalidHashIdDbzARaised when trying to add an invalid hash=>id lookaside database.Nr rrrrrsKrrceZdZdZdZdZdZedZedZ edZ edZ ed Z ed Z y) 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. Nc||_yN) _filename)selffilenames r__init__zHashIdStore.__init__"s !rc.t|jyr)ensure_hash_id_schema_dbrs r_ensure_schemazHashIdStore._ensure_schema%sdhh'rcxt|D],\}}|jd|tj|f.y)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_idshashids r set_hash_idszHashIdStore.set_hash_ids(s< "(+ HD" NN1W^^D)*  rc~|jdtj|f|j}|r|dSy)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)r"r#r$fetchone)rr%r'values r get_hash_idzHashIdStore.get_hash_id4s?  . ^^D ! # ! 8Orc|jd|jDcic]}t|d|dc}Scc}w)z=Return a C{dict} holding all the available hash=>id mappings.zSELECT hash, id FROM hashr)r"fetchallbytesrr%rows r get_hash_idszHashIdStore.get_hash_idsCs= 23171BC#c!f s1v%CCCsAct|ttfsJ|jd|f|j }|rt |dSy)zAReturn the hash associated to C{id}, or C{None} if not available.z SELECT hash FROM hash WHERE id=?rN) isinstanceintrr"r,r2)rr%r(r-s r get_id_hashzHashIdStore.get_id_hashIsI"sDk***9B5A! q? "rc&|jdy)zDelete all hash=>id mappings.zDELETE FROM hashNr"rr%s rclear_hash_idszHashIdStore.clear_hash_idsSs )*rc |jddy#tj$rt|jwxYw)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)r"r# DatabaseErrorrrr<s r check_sanityzHashIdStore.check_sanityXs: 2 NN=u E$$ 2!$..1 1 2s)>)r r r rrrr rr)r.r5r9r=rArrrrrs C"(    DD ++ 2 2rrc6eZdZdZfdZfdZdZdZdZdZ e dZ e d Z e d Z e d Ze d Ze d Ze dZe dZe dZe dZe dZe dZe dZe dZe dZe dZe dZe dZe dZe dZe dZe dZ e dZ!e dZ"e d Z#e d!Z$e d"Z%e d#Z&e d$Z'e d%Z(e d'd&Z)xZ*S)( 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. c2t||g|_yr)superr_hash_id_stores)rr __class__s rrzPackageStore.__init__rs "!rcLt|t|jyr)rEr ensure_package_schemarrrGs rr zPackageStore._ensure_schemavs  dhh'rct|} |j|jj |y#t$r}|d}~wwxYw)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)rrArrFappend)rr hash_id_storees radd_hash_id_dbzPackageStore.add_hash_id_dbzsL$H-    & & ( ##M2  G s9 A AA c2t|jdkDS)z?Return C{True} if one or more lookaside databases are attached.r)lenrFrs rhas_hash_id_dbzPackageStore.has_hash_id_dbs4''(1,,rct|tsJ|jD]}|j|}|s|cStj||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}. )r7r2rFr.r)rr'storer(s rr.zPackageStore.get_hash_idsX$&&&)) E""4(B   &&tT22rc~|jD]}|j|}||cStj||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. )rFr9r)rr(rTr's rr9zPackageStore.get_id_hashsI)) E$$R(D  &&tR00rc8|D]}|jd|fy)Nz!REPLACE INTO available VALUES (?)r;rr%idsr(s r add_availablezPackageStore.add_available$ GB NN> F Grc^djd|D}|jd|dy)N,c3DK|]}tt|ywrstrr8.0r(s r z0PackageStore.remove_available..6B3s2w<6 z#DELETE FROM available WHERE id IN ()joinr"rr%rXid_lists rremove_availablezPackageStore.remove_available,((6#66.rcrdz+DELETE FROM available_upgrade WHERE id IN (rerfrhs rremove_available_upgradesz&PackageStore.remove_available_upgradess.((6#669'! D rc&|jdy)NzDELETE FROM available_upgrader;r<s rclear_available_upgradesz%PackageStore.clear_available_upgradess67rcp|jd|jDcgc]}|d c}Scc}w)Nz SELECT id FROM available_upgraderrpr3s rget_available_upgradesz#PackageStore.get_available_upgradess.9:"(//"343A444rsc8|D]}|jd|fy)Nz%REPLACE INTO autoremovable VALUES (?)r;rWs radd_autoremovablezPackageStore.add_autoremovables$ KB NNBRE J Krc^djd|D}|jd|dy)Nr\c3DK|]}tt|ywrr^r`s rrbz4PackageStore.remove_autoremovable..rcrdz'DELETE FROM autoremovable WHERE id IN (rerfrhs rremove_autoremovablez!PackageStore.remove_autoremovables,((6#66@ KLrc&|jdy)NzDELETE FROM autoremovabler;r<s rclear_autoremovablez PackageStore.clear_autoremovables23rcp|jd|jDcgc]}|d c}Scc}w)NzSELECT id FROM autoremovablerrpr3s rget_autoremovablezPackageStore.get_autoremovables.56"(//"343A444rsc8|D]}|jd|fy)Nz REPLACE INTO security VALUES (?)r;rWs r add_securityzPackageStore.add_securitys$ FB NN=u E Frc^djd|D}|jd|dy)Nr\c3DK|]}tt|ywrr^r`s rrbz/PackageStore.remove_security..rcrdz"DELETE FROM security WHERE id IN (rerfrhs rremove_securityzPackageStore.remove_securitys,((6#66;G9AFGrc&|jdy)NzDELETE FROM securityr;r<s rclear_securityzPackageStore.clear_securitys-.rcp|jd|jDcgc]}|d c}Scc}w)NzSELECT id FROM securityrrpr3s r get_securityzPackageStore.get_securitys.01"(//"343A444rsc8|D]}|jd|fy)Nz!REPLACE INTO installed VALUES (?)r;rWs r add_installedzPackageStore.add_installedrZrc^djd|D}|jd|dy)Nr\c3DK|]}tt|ywrr^r`s rrbz0PackageStore.remove_installed.. rcrdz#DELETE FROM installed WHERE id IN (rerfrhs rremove_installedzPackageStore.remove_installed rkrc&|jdy)NzDELETE FROM installedr;r<s rclear_installedzPackageStore.clear_installedrnrcp|jd|jDcgc]}|d c}Scc}w)NzSELECT id FROM installedrrpr3s r get_installedzPackageStore.get_installedrrrscp|jd|jDcgc]}|d c}Scc}w)z+Get the package ids of all locked packages.zSELECT id FROM lockedrrpr3s r get_lockedzPackageStore.get_lockeds0 ./"(//"343A444rsc8|D]}|jd|fy)z9Add the given package ids to the list of locked packages.zREPLACE INTO locked VALUES (?)Nr;rWs r add_lockedzPackageStore.add_lockeds& DB NN;bU C Drc^djd|D}|jd|dy)Nr\c3DK|]}tt|ywrr^r`s rrbz-PackageStore.remove_locked..%rcrdz DELETE FROM locked WHERE id IN (rerfrhs r remove_lockedzPackageStore.remove_locked#s,((6#669'!DErc&|jdy)z/Remove all the package ids in the locked table.zDELETE FROM lockedNr;r<s r clear_lockedzPackageStore.clear_locked(s +,rct|}|jdtjt j |t j ft|j|jS)Nz 6 M  &z2 2TXXz22rc|jd|jDcgc]}t|j|dc}Scc}w)NzSELECT id FROM hash_id_requestr)r"r1rrr3s riter_hash_id_requestsz"PackageStore.iter_hash_id_requests@s978;A??;LMC dhhA/MMMs Ac&|jdy)NzDELETE FROM hash_id_requestr;r<s rclear_hash_id_requestsz#PackageStore.clear_hash_id_requestsEs45rctj|}tj}|jd||t j |ft |j|j|||S)Nz8INSERT INTO task (queue, timestamp, data) VALUES (?,?,?)) rrrr"r#r$ PackageTaskrr)rr%queuedatanows radd_taskzPackageStore.add_taskIs\}}T"iik F C- . 488V%5%5uc4HHrc|jd|f|j}|r%t|j|d|d|d|dSy)NzLSELECT id, queue, timestamp, data FROM task WHERE queue=? ORDER BY timestamprr0)r"r,rr)rr%rr4s r get_next_taskzPackageStore.get_next_taskSsS / H oo txxQQQQH Hrc |jdjdj|Dcgc]}t|jc}ycc}w)Nz%DELETE FROM task WHERE id NOT IN ({})r\)r"formatrgr_r()rr% except_taskstasks r clear_taskszPackageStore.clear_tasks_s> 3 : :<@4#dgg,@A  @sA)r)+r r r rrr rOrRr.r9rrYrjrmrqrurxrzr|r~rrrrrrrrrrrrrrrrrrrrrr __classcell__rGs@rrCrCfs "(32-3$ 1GGII0055OO  8855KKMM4455FFHH//55GGII005555 DD FF--9933NN66II    rrCcbeZdZdZfdZedZedZedZedZ xZ S)FakePackageStorezT A L{PackageStore} with an additional message table to store sent messages. cLt|t|jyr)rEr ensure_fake_package_schemarrJs rr zFakePackageStore._ensure_schemams  "488,rcv|jdtjtj|fy)Nz%INSERT INTO message (data) VALUES (?))r"r#r$rr)rr%messages r save_messagezFakePackageStore.save_messageqs) 3 ^^GMM'2 3 5 rcl|jdjDcgc]}|d c}Scc}w)NzSELECT id FROM messagerrpr3s rget_message_idsz FakePackageStore.get_message_idsxs;~~&>?HHJ  F   s 1cP|jd|Dcgc]}|fc}ycc}w)Nz#INSERT INTO message (id) VALUES (?)) executemany)rr% message_ids message_ids rsave_message_idsz!FakePackageStore.save_message_idss& 1-8 9zj] 9 9s # cdjdgt|z}|jd|dt|j }|Dcgc]}|dt |dfc}Scc}w)Nz, ?z*SELECT id, data FROM message WHERE id IN (z ) ORDER BY idrr0)rgrQr"tupler1r2)rr%rparamsresultr4s rget_messages_by_idsz$FakePackageStore.get_messages_by_idsswC53{#3348A  +   (*  4::CQs1v':::sA-) r r r rr rrrrrrrs@rrrhs]-      ;;rrceZdZdZeedZedZedZeeeZ edZ edZ ee e Z edZ y) rc ||_||_yr)rr()rdbr(s rrzHashIDRequest.__init__src|jd|jftjt |j dS)Nz-SELECT hashes FROM hash_id_request WHERE id=?r)r"r(rloadsr2r,r<s rrzHashIDRequest.hashess>  ; WWJ }}U6??#4Q#7899rcb|jd|jf|jdS)Nz0SELECT timestamp FROM hash_id_request WHERE id=?rr"r(r,r<s r_get_timestampzHashIDRequest._get_timestamps. > WWJ  ##rc@|jd||jfy)Nz1UPDATE hash_id_request SET timestamp=? WHERE id=?r"r(rr%r-s r_set_timestampzHashIDRequest._set_timestamps ? DGG  rcb|jd|jf|jdS)Nz1SELECT message_id FROM hash_id_request WHERE id=?rrr<s r_get_message_idzHashIDRequest._get_message_ids. ? WWJ  ##rc@|jd||jfy)Nz2UPDATE hash_id_request SET message_id=? WHERE id=?rrs r_set_message_idzHashIDRequest._set_message_ids @ DGG  rc>|jd|jfy)Nz&DELETE FROM hash_id_request WHERE id=?rr<s rremovezHashIDRequest.removes?$''LrN)r r r rpropertyrrrr timestamprrrrrrrrrs::$$  8I$$  /?;JMMrrc"eZdZdZedZy)rcp||_||_||_||_t j ||_yr)rr(rrrrr)rrcidrrrs rrzPackageTask.__init__s. "MM$' rc>|jd|jfy)NzDELETE FROM task WHERE id=?rr<s rrzPackageTask.removes4twwjArN)r r r rrrrrrrrs(BBrrc|j} |jd|j|jy#tj tj f$r#|j|jYywxYw)zeCreate all tables needed by a L{HashIdStore}. @param db: A connection to a SQLite database. zrsK ,2!+/9/LiLL2L2^ ; D&;|&;R2M2Mj B B$$N M,+,sA44 BB