]> pd.if.org Git - zpackage/blob - schema/syncinfo.sql
add check for preserved libraries
[zpackage] / schema / syncinfo.sql
1 create view syncinfo as
2 with
3 -- paths to libraries we need to keep around
4 preserve as (
5 select
6 PFL.*
7 from packagefiles PFL
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
11 join packages PN
12 on PFN.package = PN.package and PFN.version = PN.version and PFN.release = PN.release
13 where
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)
16 ),
17 waspreserved as (
18         select PF.path
19         from packagefiles PF
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
23         join packages P
24         on PL.path = P.package and PL.version = P.version and PL.release = P.release
25         where
26         P.status = 'removing' or P.status = 'installed' or P.status = 'updating'
27 )
28
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
33 select
34 'new' as 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,
38         PFI.configuration
39         -- + case when PFC.configuration = 1 then 2 else 0 end
40         as configuration,
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
44         null as omds
45 from
46
47 packagefiles PFI
48 join packages PI
49 on PFI.package = PI.package and PFI.version = PI.version and PFI.release = PI.release
50
51 /*
52 left join packagefiles PFC on PFI.path = PFC.path
53
54 left join packages PC
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
58 */
59
60 where
61 PI.status = 'installing'
62 and
63 not exists (select PFC.path
64         from packagefiles PFC
65         join packages PC
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')
69 )
70
71 /*
72 (PFC.path is null
73         or
74 PC.status not in ('installed','removing','updating')
75 )
76 */
77
78 union
79 select
80 case
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
84         then 'noop'
85 when PC.status = 'installed' then 'md conflict'
86 else 'update'
87 end as op,
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
92         as configuration,
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
96 from
97
98 packagefiles PFI
99 join packages P
100 on PFI.package = P.package and PFI.version = P.version and PFI.release = P.release
101
102 join packagefiles PFC on PFI.path = PFC.path
103
104 join packages PC
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
109
110 where
111 P.status = 'installing'
112 --and PFC.path is not null
113
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
116 union
117 select 'remove',
118         printf('%s-%s-%s', PFR.package, PFR.version, PFR.release) as pkgid,
119         PFR.path, 
120         PFR.username, PFR.uid, PFR.groupname, PFR.gid, PFR.mode, PFR.filetype,
121         PFR.mtime, PFR.hash,
122         PFR.configuration, 
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,
126         null as ohash,
127         --PFI.package,
128         printf('%s:%s:%s:%s', PFR.filetype, PFR.mode, PFR.username, PFR.groupname) as mds,
129         null as omds
130 from packagefiles PFR
131 join packages PU
132 on PFR.package = PU.package and PFR.version = PU.version and PFR.release = PU.release
133 and PU.status in ('removing','updating')
134
135 where
136 not exists (select path from
137         packagefiles PFI
138         join packages P
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
141
142 )
143 and path not in (select path from preserve)
144
145 -- paths in 'installed' or 'updated' are no-ops
146
147 union
148 select 'preserve',
149         printf('%s-%s-%s', PFP.package, PFP.version, PFP.release) as pkgid,
150         PFP.path, 
151         PFP.username, PFP.uid, PFP.groupname, PFP.gid, PFP.mode, PFP.filetype,
152         PFP.mtime, PFP.hash,
153         PFP.configuration as configuration,
154         PFP.target, PFP.device,
155         null as ohash,
156         printf('%s:%s:%s:%s', PFP.filetype, PFP.mode, PFP.username, PFP.groupname) as mds,
157         null as omds
158 from preserve PFP
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')
162 ;