1 create view syncinfo as
3 -- paths to libraries we need to keep around
8 join elflibraries EL on EL.file = PFL.hash
9 join elfneeded EN on EN.needed = EL.soname
10 join packagefiles PFN on EN.file = PFN.hash
12 on PFN.package = PN.package and PFN.version = PN.version and PFN.release = PN.release
14 PN.status = 'installing' or PN.status = 'installed'
15 and not (PFN.package = PFL.package and PFN.version = PFN.version and PFN.release = PFL.release)
20 join elflibraries EL on EL.file = PF.hash
21 join elfneeded EN on EN.needed = EL.soname
22 join packagefiles PL on EN.file = PL.hash
24 on PL.path = P.package and PL.version = P.version and PL.release = P.release
26 P.status = 'removing' or P.status = 'installed' or P.status = 'updating'
29 -- every path in 'installing' is either new or update, or no-op
30 -- but we have to calculate them separately I think.
31 -- once for new, once for update, and once for no-op, might be able
32 -- to combine update and no-op
35 printf('%s-%s-%s', PFI.package, PFI.version, PFI.release) as pkgid,
36 PFI.path, PFI.username, PFI.uid, PFI.groupname, PFI.gid, PFI.mode,
37 PFI.filetype, PFI.mtime, PFI.hash,
39 -- + case when PFC.configuration = 1 then 2 else 0 end
41 PFI.target, PFI.device, null as ohash,
42 printf('%s:%s:%s:%s', PFI.filetype, PFI.mode, PFI.username, PFI.groupname) as mds,
43 --printf('%s:%s:%s:%s', PFC.filetype, PFC.mode, PFC.username, PFC.groupname) as omds
49 on PFI.package = PI.package and PFI.version = PI.version and PFI.release = PI.release
52 left join packagefiles PFC on PFI.path = PFC.path
55 on (PFI.package is not PC.package or PFI.release is not PC.release or PC.version is not PFI.version)
56 and PC.status in ('installed','removing','updating')
57 and PFC.package = PC.package and PFC.version = PC.version and PFC.release = PC.release
61 PI.status = 'installing'
63 not exists (select PFC.path
66 on PFC.package = PC.package and PFC.version = PC.version and PFC.release = PC.release
67 where PFC.path = PFI.path
68 and PC.status in ('installed','removing','updating')
74 PC.status not in ('installed','removing','updating')
81 when PFI.filetype is PFC.filetype
82 and PFI.mode is PFC.mode and PFI.username is PFC.username
83 and PFI.groupname is PFC.groupname and PFI.hash is PFC.hash
85 when PC.status = 'installed' then 'md conflict'
88 printf('%s-%s-%s', PFI.package, PFI.version, PFI.release) as pkgid,
89 PFI.path, PFI.username, PFI.uid, PFI.groupname, PFI.gid, PFI.mode,
90 PFI.filetype, PFI.mtime, PFI.hash,
91 PFI.configuration + case when PFC.configuration = 1 then 2 else 0 end
93 PFI.target, PFI.device, PFC.hash as ohash,
94 printf('%s:%s:%s:%s', PFI.filetype, PFI.mode, PFI.username, PFI.groupname) as mds,
95 printf('%s:%s:%s:%s', PFC.filetype, PFC.mode, PFC.username, PFC.groupname) as omds
100 on PFI.package = P.package and PFI.version = P.version and PFI.release = P.release
102 join packagefiles PFC on PFI.path = PFC.path
105 on (PFI.package is not PC.package or PFI.release is not PC.release or PC.version is not PFI.version)
106 -- er, no, it's a conflict if it's in installed and it doesn't match
107 and PC.status in ('installed','updating','removing')
108 and PFC.package = PC.package and PFC.version = PC.version and PFC.release = PC.release
111 P.status = 'installing'
112 --and PFC.path is not null
114 -- every path in updating and removing is either remove or no-op
115 -- not true, could be an update, but should be handled above
118 printf('%s-%s-%s', PFR.package, PFR.version, PFR.release) as pkgid,
120 PFR.username, PFR.uid, PFR.groupname, PFR.gid, PFR.mode, PFR.filetype,
123 --PFR.target, coalesce(P.status, ' null status '), --PFR.device,
124 -- PFI.path, coalesce(PFI.status, ' null status '), --PFR.device,
125 PFR.target, PFR.device,
128 printf('%s:%s:%s:%s', PFR.filetype, PFR.mode, PFR.username, PFR.groupname) as mds,
130 from packagefiles PFR
132 on PFR.package = PU.package and PFR.version = PU.version and PFR.release = PU.release
133 and PU.status in ('removing','updating')
136 not exists (select path from
139 on PFI.package = P.package and PFI.version = P.version and PFI.release = P.release and P.status in ('installing','installed')
140 where PFI.path = PFR.path
143 and path not in (select path from preserve)
145 -- paths in 'installed' or 'updated' are no-ops
149 printf('%s-%s-%s', PFP.package, PFP.version, PFP.release) as pkgid,
151 PFP.username, PFP.uid, PFP.groupname, PFP.gid, PFP.mode, PFP.filetype,
153 PFP.configuration as configuration,
154 PFP.target, PFP.device,
156 printf('%s:%s:%s:%s', PFP.filetype, PFP.mode, PFP.username, PFP.groupname) as mds,
159 -- TODO don't include installed or installing
160 -- left join packages P on P.package = PFP.package ...
161 -- where P.status not in ('installed','installing')