tempfile.mkdtemp does not like bytes in py3k
[~helmut/debian-dedup.git] / schema.sql
1 CREATE TABLE package (          -- binary Debian packages
2         id INTEGER PRIMARY KEY,
3         name TEXT UNIQUE NOT NULL,
4         -- binary package name
5         version TEXT,           -- Debian version
6         architecture TEXT,
7         source TEXT);           -- name of the source package it was built from
8
9 CREATE TABLE content (          -- a file contained in a binary package
10         id INTEGER PRIMARY KEY,
11         pid INTEGER NOT NULL REFERENCES package(id) ON DELETE CASCADE,
12         -- which package the file is contained in
13         filename TEXT NOT NULL,
14         size INTEGER NOT NULL);
15
16 CREATE TABLE function (                 -- hash functions
17         id INTEGER PRIMARY KEY,
18         name TEXT UNIQUE NOT NULL,
19         eqclass INTEGER);
20         -- hash values of different hash functions are comparable if they share
21         -- an eqclass
22
23 INSERT INTO function (id, name, eqclass) VALUES
24         (1, 'sha512', 1),
25         (2, 'gzip_sha512', 1),
26         -- decompress a gzip file, then hash
27         (3, 'png_sha512', 2),
28         -- decompress a PNG file, hash RGBA image contents + dimension
29         (4, 'gif_sha512', 2);
30         -- decompress a GIF file, hash RGBA image contents + dimension
31
32 CREATE TABLE hash (             -- hash values of files in binary packages
33         cid INTEGER NOT NULL REFERENCES content(id) ON DELETE CASCADE,
34         -- which file has been hashed
35         fid INTEGER NOT NULL REFERENCES function(id),
36         -- using which function
37         hash TEXT NOT NULL);    -- textual hash value
38
39 CREATE TABLE dependency (       -- binary package dependencies
40         pid INTEGER NOT NULL REFERENCES package(id) ON DELETE CASCADE,
41         -- the package that carries a Depends: header
42         required TEXT NOT NULL);
43         -- the name of a package that is depended upon without alternative
44
45 CREATE INDEX content_package_size_index ON content (pid, size);
46 CREATE INDEX hash_cid_index ON hash (cid);
47 CREATE INDEX hash_hash_index ON hash (hash);
48
49 -- All tables below this line can be recomputed from the tables above.
50 -- Recomputation is done using the update_sharing.py script.
51
52 -- The sharing table caches two values for each pair of packages pid1, pid2 and
53 -- pair of hash functions fid1, fid2:
54 --  * files is the number of files in pid1 that could be eliminated by reusing
55 --    files from pid2. Since the functions may be different, this may mean
56 --    replacing a compressed file with an uncompressed one.
57 --  * size is the number of bytes that would be freed by doing the above.
58 -- Note: If pid1=pid2, one copy of each file must be preserved.
59 CREATE TABLE sharing (
60         pid1 INTEGER NOT NULL REFERENCES package(id) ON DELETE CASCADE,
61         pid2 INTEGER NOT NULL REFERENCES package(id) ON DELETE CASCADE,
62         fid1 INTEGER NOT NULL REFERENCES function(id),
63         fid2 INTEGER NOT NULL REFERENCES function(id),
64         files INTEGER NOT NULL,
65         size INTEGER NOT NULL);
66 CREATE INDEX sharing_insert_index ON sharing (pid1, pid2, fid1, fid2);
67
68 -- The duplicate table caches all files that have any non-unique hash value.
69 -- It is used in webapp.py to speed up one query, but could be dropped
70 -- otherwise.
71 CREATE TABLE duplicate (
72         cid INTEGER PRIMARY KEY REFERENCES content(id) ON DELETE CASCADE);
73
74 -- The issue table contains auxillary notices per file. For example, when a
75 -- filename ends in ".gz", but is not gzip decompressible (has no gzip_sha512
76 -- hash), it is recorded here.
77 CREATE TABLE issue (
78         cid INTEGER NOT NULL REFERENCES content(id) ON DELETE CASCADE,
79         issue TEXT NOT NULL);           -- a human readable comment on the file