]> pd.if.org Git - zpackage/blob - db.sql
remove foreign key from elf tables
[zpackage] / db.sql
1 begin;
2
3 PRAGMA application_id = 0x5a504442;
4 PRAGMA user_version = 1;
5
6 -- should be faster with rowid due to the blob content
7 -- these are really just blobs of data
8 -- TODO copyright and license information should probably
9 -- go here
10 CREATE TABLE files (
11         hash text primary key, -- sha256 of content
12         size integer, -- bigint?  certainly need > 2GB
13         compression text, -- always xz?
14         content blob
15 )
16 ;
17
18 -- information about packages
19 -- a package is identified by a package,version,release triple
20 create table packages (
21         -- primary key columns
22         package text not null,
23         version text not null, -- the upstream version string
24         release integer not null, -- the local release number
25 --      pkgid   text, -- the three above joined with '-'
26
27         -- metadata columns
28         description     text,
29         architecture    text,
30         url     text,
31         status  text,
32         licenses        text, -- hash of actual license?  need table for more than one?
33         packager        text,
34         build_time      integer default (strftime('%s', 'now')),
35         install_time    integer,
36         checksum        text, -- checksum of package contents.  null for incompleted packages
37         primary key (package,version,release),
38         check (typeof(package) = 'text'),
39         check (typeof(version) = 'text'),
40         check (typeof(release) = 'integer'),
41         check (release > 0)
42         -- TODO enforce name and version conventions
43         -- check(instr(version,'-') = 0)
44         -- check(instr(package,'/') = 0)
45         -- check(instr(package,'/') = 0)
46         -- check(instr(version,' ') = 0)
47         -- check(instr(package,' ') = 0)
48         -- check(instr(package,' ') = 0)
49         -- check(length(package) < 64)
50         -- check(length(version) < 32)
51 )
52 without rowid
53 ;
54
55 create view packages_pkgid as
56 select printf('%s-%s-%s', package, version, release) as pkgid, *
57 from packages;
58
59 -- handle package status history with a logging trigger.
60 create trigger logpkgstatus after update of status on packages
61 begin insert into zpmlog (action,target,info)
62         values (printf('status change %s %s', OLD.status, NEW.status),
63                 printf('%s-%s-%s', NEW.package, NEW.version, NEW.release),
64                 NULL); END;
65
66 create table packagetags (
67         -- package id triple
68         package text,
69         version text,
70         release integer,
71         tag     text,
72         set_time integer default (strftime('%s', 'now')),
73         primary key (package,version,release,tag),
74         foreign key (package,version,release) references packages (package,version,release) on delete cascade
75 );
76
77 -- packagefile hash is columns as text, joined with null bytes, then
78 -- sha256 sum of that
79 -- package checksum is package columns as text, joined with null bytes,
80 -- other than the checksum and install_time column
81 -- then that hashed.  finally, that hash, plus the ascii sorted
82 -- hashes of the package files all joined with newlines, hashed.
83 -- really don't like this.
84
85 -- files contained in a package
86 create table packagefiles (
87         -- package id triple
88         package text,
89         version text,
90         release integer,
91
92         path    text, -- filesystem path
93         mode    text not null, -- perms, use text for octal rep?
94         username        text not null, -- name of owner
95         groupname       text not null, -- group of owner
96         uid     integer, -- numeric uid, generally ignored
97         gid     integer, -- numeric gid, generally ignored
98         configuration integer not null default 0, -- boolean if config file
99         filetype varchar not null default 'r',
100         -- r regular file
101         -- d directory
102         -- s symlink
103         -- h hard link -- not supported
104         -- c character special and b device special files add dev number column
105         -- b block special
106         -- p fifos (i.e. pipe)
107         target  text, -- link target for links
108         -- device file dev numbers, should probably be a separate table
109         devmajor        integer,
110         devminor        integer,
111         hash    text, -- null if no actual content, i.e. anything but a regular file
112         mtime   integer, -- seconds since epoch, finer resolution probably not needed
113         primary key (package,version,release,path),
114         foreign key (package,version,release) references packages (package,version,release) on delete cascade,
115         check (not (filetype = 'l' and target is null)),
116         check (not (filetype = 'r' and hash is null)),
117         check (not (filetype = 'c' and (devmajor is null or devminor is null)))
118 )
119 without rowid
120 ;
121
122 create view packagefiles_pkgid as
123 select printf('%s-%s-%s', package, version, release) as pkgid, *
124 from packagefiles
125 ;
126
127 create view installed_ref_count as
128 select I.path, count(*) as refcount
129 from installedfiles I
130 group by I.path
131 ;
132
133 create view packagefiles_status as
134 select P.status, PF.*
135 from packagefiles_pkgid PF
136 left join packages_pkgid P on P.pkgid = PF.pkgid
137 ;
138
139 create view installedfiles as
140 select * from packagefiles_status
141 where status = 'installed'
142 ;
143
144 create view install_status as
145 select 'new' as op, PN.*
146 from packagefiles_status PN
147 left join installed_ref_count RC on RC.path = PN.path
148 where RC.refcount is null
149 and PN.status = 'installing'
150
151 union all
152
153 select 'update' as op, PN.*
154 from packagefiles_status PN
155 inner join installedfiles PI on PI.path = PN.path and PI.package = PN.package
156 left join installed_ref_count RC on RC.path = PN.path
157 where RC.refcount = 1
158 and PN.status = 'installing'
159
160 union all
161
162 select 'conflict' as op, PI.*
163 from packagefiles_status PN
164 inner join installedfiles PI on PI.path = PN.path and PI.package != PN.package
165 where PN.status = 'installing'
166
167 union all
168
169 select 'remove' as op, PI.*
170 from installedfiles PI
171 left join packagefiles_status PN
172     on PI.path = PN.path and PI.package = PN.package
173 where PN.path is null
174 and PN.status = 'installing'
175 ;
176
177 create table pathtags (
178         -- package id triple
179         package text,
180         version text,
181         release integer,
182
183         path    text, -- filesystem path
184         tag     text,
185         primary key (package,version,release,path,tag)
186 )
187 without rowid
188 ;
189
190 create table elfinfo (
191         file    text primary key, -- hash of blob
192         elftype text,
193         foreign key (file) references files on delete cascade
194 )
195 without rowid
196 ;
197
198 create table elfdeps (
199         file    text,
200         soname  text,
201         dependency text,
202         primary key (file, soname, dependency),
203         foreign key (file) references files on delete cascade
204 )
205 without rowid
206 ;
207
208 -- TODO just elf information?
209 -- and just hash, not package?
210 create table elflibraries (
211         file    text primary key,
212         soname  text
213 )
214 without rowid
215 ;
216
217 create table elfneeded (
218         file    text,
219         needed  text, -- soname of dependency
220         primary key (file, needed)
221 )
222 without rowid
223 ;
224
225 -- package scripts: table of package, stage, file
226 create table scripts (
227         package text,
228         version text,
229         release integer,
230         stage   text,
231         hash    text,
232         primary key (package,version,release,stage),
233         foreign key (package,version,release) references packages (package,version,release) on delete cascade
234 );
235
236 create view scripts_pkgid as
237 select printf('%s-%s-%s', package, version, release) as pkgid, *
238 from scripts
239 ;
240
241 -- package dependencies: table of package, dependency, dep type (package, soname)
242 create table packagedeps (
243         package text,
244         version text,
245         release integer,
246         required        text, -- package name
247         -- following can be null for not checked
248         minversion      text,
249         minrelease      integer,
250         maxversion      text,
251         maxrelease      integer
252 );
253
254 -- capability labels
255 create table provides (
256         package text,
257         subpackage      text,
258         label   text -- a capability label
259 );
260
261 create table requires (
262         package text,
263         subpackage      text,
264         label   text -- a capability label
265 );
266
267 create table packagegroups (
268         package text,
269         "group" text
270 );
271
272 -- zpm actions
273 -- not sure how machine readable this needs to be,
274 -- do not at all for now, figure it out later
275 -- could be worth logging all commands in a history table,
276 -- the zpm driver could do that and capture the exit status
277 -- as well
278 -- might want the history table to note a "group" to tie together
279 -- sub-invocations, probably an environment variable set if not
280 -- already set by zpm, probably a uuid or a timestamp
281 create table zpmlog (
282         ts      text default (strftime('%Y-%m-%d %H:%M:%f', 'now')),
283         -- timestamp of action
284         action  text,
285         target  text, -- packagename, repo name, etc
286         info    text -- human readable
287 );
288
289 create table history (
290         ts      integer, -- again, probably needs timestamp sub second
291         cmd     text,
292         args    text,
293         status  integer
294 );
295
296 create table repository (
297         name    text primary key, -- our name for a repo
298         url     text not null,
299         priority        integer not null default 1,
300         refreshed       integer -- last refresh time
301 );
302
303 -- urls for downloading packages.  possibly unneeded
304 create table repository_packages (
305         repo    text,
306         pkg     text, -- glob pattern?  in which case others not needed
307         version text,
308         release text,
309         url     text
310 );
311
312 -- track which repository a package was cloned from, i.e. where we got it
313 create table packagesource (
314         name    text,
315         version text,
316         release integer,
317         repository      text references repository
318 );
319
320 commit;