X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=schema%2Fsyncinfo.sql;h=6739cce2a731ec28c51418da9e253a5fd803334b;hb=4e2e7c3d2780fdca649cb084523750f27afa5542;hp=3b38f6b7fe8d5dc0ee04cef755bc09746fae7380;hpb=e88d7fd4b079dc423ac628539ee891fe6504f6ba;p=zpackage diff --git a/schema/syncinfo.sql b/schema/syncinfo.sql index 3b38f6b..6739cce 100644 --- a/schema/syncinfo.sql +++ b/schema/syncinfo.sql @@ -2,7 +2,8 @@ create view syncinfo as with -- paths to libraries we need to keep around preserve as ( -select distinct PFL.* +select +PFL.* from packagefiles PFL join elflibraries EL on EL.file = PFL.hash join elfneeded EN on EN.needed = EL.soname @@ -26,77 +27,95 @@ waspreserved as ( ) -- every path in 'installing' is either new or update, or no-op +-- but we have to calculate them separately I think. +-- once for new, once for update, and once for no-op, might be able +-- to combine update and no-op select -case -when PFC.path is null and PFC.path not in (select path from waspreserved) then 'new' -when - printf('%s:%s:%s:%s', PFI.filetype, PFI.mode, PFI.username, PFI.groupname) is - printf('%s:%s:%s:%s', PFC.filetype, PFC.mode, PFC.username, PFC.groupname) - and PFI.hash is PFC.hash - then 'noop' -else 'update' -end as op, +'new' as op, printf('%s-%s-%s', PFI.package, PFI.version, PFI.release) as pkgid, - PFI.path, - PFI.username, PFI.uid, PFI.groupname, PFI.gid, PFI.mode, PFI.filetype, - PFI.mtime, PFI.hash, - PFI.configuration + case when PFC.configuration = 1 then 2 else 0 end + PFI.path, PFI.username, PFI.uid, PFI.groupname, PFI.gid, PFI.mode, + PFI.filetype, PFI.mtime, PFI.hash, + PFI.configuration + -- + case when PFC.configuration = 1 then 2 else 0 end as configuration, - PFI.target, PFI.device, - PFC.hash as ohash, + PFI.target, PFI.device, null as ohash, printf('%s:%s:%s:%s', PFI.filetype, PFI.mode, PFI.username, PFI.groupname) as mds, - printf('%s:%s:%s:%s', PFC.filetype, PFC.mode, PFC.username, PFC.groupname) as omds + --printf('%s:%s:%s:%s', PFC.filetype, PFC.mode, PFC.username, PFC.groupname) as omds + null as omds from + packagefiles PFI join packages PI on PFI.package = PI.package and PFI.version = PI.version and PFI.release = PI.release + +/* +left join packagefiles PFC on PFI.path = PFC.path + left join packages PC -on PC.package = PI.package and PC.status in ('installed','removing','updating') -left join packagefiles PFC - on PFC.package = PC.package - and PFC.version = PC.version - and PFC.release = PC.release - and PFC.path = PFI.path +on (PFI.package is not PC.package or PFI.release is not PC.release or PC.version is not PFI.version) +and PC.status in ('installed','removing','updating') +and PFC.package = PC.package and PFC.version = PC.version and PFC.release = PC.release +*/ + where PI.status = 'installing' +and +not exists (select PFC.path + from packagefiles PFC + join packages PC +on PFC.package = PC.package and PFC.version = PC.version and PFC.release = PC.release + where PFC.path = PFI.path + and PC.status in ('installed','removing','updating') +) + +/* +(PFC.path is null + or +PC.status not in ('installed','removing','updating') +) +*/ + +-- every path in updating and removing is either remove or no-op +-- not true, could be an update, but should be handled above --- every path in updating is either remove or no-op union -select 'remove', - printf('%s-%s-%s', PFU.package, PFU.version, PFU.release) as pkgid, - PFU.path, - PFU.username, PFU.uid, PFU.groupname, PFU.gid, PFU.mode, PFU.filetype, - PFU.mtime, PFU.hash, - PFU.configuration + case when PFC.configuration = 1 then 2 else 0 end +select +case +when PFI.filetype is PFC.filetype + and PFI.mode is PFC.mode and PFI.username is PFC.username + and PFI.groupname is PFC.groupname and PFI.hash is PFC.hash + then 'noop' +when PC.status = 'installed' then 'md conflict' +else 'update' +end as op, + printf('%s-%s-%s', PFI.package, PFI.version, PFI.release) as pkgid, + PFI.path, PFI.username, PFI.uid, PFI.groupname, PFI.gid, PFI.mode, + PFI.filetype, PFI.mtime, PFI.hash, + PFI.configuration + case when PFC.configuration = 1 then 2 else 0 end as configuration, - PFU.target, PFU.device, - null as ohash, - printf('%s:%s:%s:%s', PFU.filetype, PFU.mode, PFU.username, PFU.groupname) as mds, - null as omds -from packagefiles PFU -join packages PU -on PFU.package = PU.package and PFU.version = PU.version and PFU.release = PU.release --- inner join because the installing package must exist or this shouldn't --- be an 'updating' package -join packages P on PU.package = P.package and P.status = 'installing' -left join packagefiles PFI on - PFI.package = P.package - and PFI.version = P.version - and PFI.release = P.release - and PFI.path = PFU.path - --- handle paths owned by other installed packages -left join packages PI on PI.status = 'installed' -left join packagefiles PFC -on PFC.package = PI.package and PFC.version = PI.version and PFC.release = PI.release and PFC.path = PFU.path + PFI.target, PFI.device, PFC.hash as ohash, + printf('%s:%s:%s:%s', PFI.filetype, PFI.mode, PFI.username, PFI.groupname) as mds, + printf('%s:%s:%s:%s', PFC.filetype, PFC.mode, PFC.username, PFC.groupname) as omds +from + +packagefiles PFI +join packages P +on PFI.package = P.package and PFI.version = P.version and PFI.release = P.release + +join packagefiles PFC on PFI.path = PFC.path + +join packages PC +on (PFI.package is not PC.package or PFI.release is not PC.release or PC.version is not PFI.version) +-- er, no, it's a conflict if it's in installed and it doesn't match +and PC.status in ('installed','updating','removing') +and PFC.package = PC.package and PFC.version = PC.version and PFC.release = PC.release where -PU.status in ('updating') -and PFI.path is null -and PFC.path is null -and PFU.path not in (select path from preserve) +P.status = 'installing' +--and PFC.path is not null + --- every path in removing is either remove or no-op +-- every path in updating and removing is either remove or no-op -- not true, could be an update, but should be handled above union select 'remove', @@ -104,29 +123,27 @@ select 'remove', PFR.path, PFR.username, PFR.uid, PFR.groupname, PFR.gid, PFR.mode, PFR.filetype, PFR.mtime, PFR.hash, - PFR.configuration + case when PFC.configuration = 1 then 2 else 0 end - as configuration, - PFR.target, PFR.device, + PFR.configuration, + --PFR.target, coalesce(P.status, ' null status '), --PFR.device, + -- PFI.path, coalesce(PFI.status, ' null status '), --PFR.device, + PFR.target, PFR.device, null as ohash, + --PFI.package, printf('%s:%s:%s:%s', PFR.filetype, PFR.mode, PFR.username, PFR.groupname) as mds, null as omds from packagefiles PFR join packages PU on PFR.package = PU.package and PFR.version = PU.version and PFR.release = PU.release -left join packages P on PU.package = P.package and P.status = 'installing' -left join packagefiles PFI on PFI.path = PFR.path -and PFI.package = P.package and PFI.version = P.version and PFI.release = P.release - --- handle paths owned by other installed packages -left join packages PI on PI.status = 'installed' -left join packagefiles PFC -on PFC.package = PI.package and PFC.version = PI.version and PFC.release = PI.release and PFC.path = PFR.path +and PU.status in ('removing','updating') where -PU.status in ('removing') -and PFI.path is null -and PFC.path is null -and PFR.path not in (select path from preserve) +not exists (select path from + packagefiles PFI + join packages P + on PFI.package = P.package and PFI.version = P.version and PFI.release = P.release and P.status in ('installing','installed') + where PFI.path = PFR.path + +) -- paths in 'installed' or 'updated' are no-ops