]> pd.if.org Git - zpackage/blob - db.sql
e1565e69aee73f8b6541b84522b8b058122e31cc
[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         foreign key (file) references files on delete cascade
214 )
215 without rowid
216 ;
217
218 create table elfneeded (
219         file    text,
220         needed  text, -- soname of dependency
221         primary key (file, needed),
222         foreign key (file) references files on delete cascade
223 )
224 without rowid
225 ;
226
227 -- package scripts: table of package, stage, file
228 create table scripts (
229         package text,
230         version text,
231         release integer,
232         stage   text,
233         hash    text,
234         primary key (package,version,release,stage),
235         foreign key (package,version,release) references packages (package,version,release) on delete cascade
236 );
237
238 create view scripts_pkgid as
239 select printf('%s-%s-%s', package, version, release) as pkgid, *
240 from scripts
241 ;
242
243 -- package dependencies: table of package, dependency, dep type (package, soname)
244 create table packagedeps (
245         package text,
246         version text,
247         release integer,
248         required        text, -- package name
249         -- following can be null for not checked
250         minversion      text,
251         minrelease      integer,
252         maxversion      text,
253         maxrelease      integer
254 );
255
256 -- capability labels
257 create table provides (
258         package text,
259         subpackage      text,
260         label   text -- a capability label
261 );
262
263 create table requires (
264         package text,
265         subpackage      text,
266         label   text -- a capability label
267 );
268
269 create table packagegroups (
270         package text,
271         "group" text
272 );
273
274 -- zpm actions
275 -- not sure how machine readable this needs to be,
276 -- do not at all for now, figure it out later
277 -- could be worth logging all commands in a history table,
278 -- the zpm driver could do that and capture the exit status
279 -- as well
280 -- might want the history table to note a "group" to tie together
281 -- sub-invocations, probably an environment variable set if not
282 -- already set by zpm, probably a uuid or a timestamp
283 create table zpmlog (
284         ts      text default (strftime('%Y-%m-%d %H:%M:%f', 'now')),
285         -- timestamp of action
286         action  text,
287         target  text, -- packagename, repo name, etc
288         info    text -- human readable
289 );
290
291 create table history (
292         ts      integer, -- again, probably needs timestamp sub second
293         cmd     text,
294         args    text,
295         status  integer
296 );
297
298 create table repository (
299         name    text primary key, -- our name for a repo
300         url     text not null,
301         priority        integer not null default 1,
302         refreshed       integer -- last refresh time
303 );
304
305 -- urls for downloading packages.  possibly unneeded
306 create table repository_packages (
307         repo    text,
308         pkg     text, -- glob pattern?  in which case others not needed
309         version text,
310         release text,
311         url     text
312 );
313
314 -- track which repository a package was cloned from, i.e. where we got it
315 create table packagesource (
316         name    text,
317         version text,
318         release integer,
319         repository      text references repository
320 );
321
322 commit;