More fixes for modern versions of the sqlite module
[joel/kofoto.git] / src / packages / kofoto / shelfschema.py
1 """Schema of the metadata database."""
2
3 schema = """
4     -- EER diagram without attributes:
5     --
6     --                                          .----.
7     --                                        ,'      |
8     --                   ,^.                ,' N    ,^.
9     --                 ,'   '.  N +----------+    ,'   '.
10     --                <  has  >===| category |---< child >
11     --                 '.   .'    +----------+ 0  '.   .'
12     --                   'v'                        'v'
13     --                    | 0
14     --                    |           ,^.
15     --              N +--------+ 0  ,'   '.  N +-----------+
16     --      .---------| object |---<  has  >===| attribute |
17     --      |         +--------+    '.   ,'    +-----------+
18     --    ,/\.          |    |        'v'
19     --  ,'    '.     __/      \__
20     -- < member >   |            |
21     --  '.    ,'   \|/          \|/
22     --    '\/'      |            |
23     --      | 1 +-------+    +-------+
24     --      '---| album |    | image |
25     --          +-------+    +-------+
26     --                        1 | | 1
27     --                       ,-'   '-.
28     --                     ,^.       ,^.
29     --                   ,'   '.   ,'   '.
30     --                  <  has  > <primary>
31     --                   '.   .'   '.   .'
32     --                     'v'       'v'
33     --                     N \       / 0..1
34     --                      +---------+
35     --                      | version |
36     --                      +---------+
37     --
38     --        |
39     -- where \|/ is supposed to look like the subclass relation symbol.
40     --        |
41
42     BEGIN;
43
44     -- Administrative information about the database.
45     CREATE TABLE dbinfo (
46         version     INTEGER NOT NULL
47     );
48
49     -- Superclass of objects in an album.
50     CREATE TABLE object (
51         -- Identifier of the object.
52         id          INTEGER NOT NULL,
53
54         PRIMARY KEY (id)
55     );
56
57     -- Albums in the shelf. Subclass of object.
58     CREATE TABLE album (
59         -- Identifier of the album. Shared primary key with object.
60         id          INTEGER NOT NULL,
61         -- Human-memorizable tag.
62         tag         VARCHAR(256) NOT NULL,
63         -- Whether it is possible to delete the album.
64         deletable   INTEGER NOT NULL,
65         -- Album type (plain, orphans or search).
66         type        VARCHAR(256) NOT NULL,
67
68         UNIQUE      (tag),
69         FOREIGN KEY (id) REFERENCES object,
70         PRIMARY KEY (id)
71     );
72
73     -- Images in the shelf. Subclass of object.
74     CREATE TABLE image (
75         -- Internal identifier of the image. Shared primary key with
76         -- object.
77         id          INTEGER NOT NULL,
78
79         -- The primary version. NULL if no such version exists.
80         primary_version INTEGER,
81
82         FOREIGN KEY (id) REFERENCES object,
83         FOREIGN KEY (primary_version) REFERENCES image_version,
84         PRIMARY KEY (id)
85     );
86
87     -- Image versions.
88     CREATE TABLE image_version (
89         -- Identifier of the image version.
90         id          INTEGER NOT NULL,
91
92         -- Identifier of the image associated with this version.
93         image       INTEGER NOT NULL,
94
95         -- Type (original, important or other).
96         type        VARCHAR(20) NOT NULL,
97
98         -- Arbitrary comment about the version.
99         comment     TEXT NOT NULL,
100
101         -- Identifier string which is derived from the image data and
102         -- identifies the image uniquely. Currently an MD5 checksum
103         -- (in hex format) of all image data.
104         hash        CHAR(32) NOT NULL,
105         -- Directory part of the last known location (local pathname)
106         -- of the image.
107         directory   VARCHAR(256) NOT NULL,
108         -- Filename part of the last known location (local pathname)
109         -- of the image.
110         filename    VARCHAR(256) NOT NULL,
111         -- Last known time of modification (UNIX epoch time).
112         mtime       INTEGER NOT NULL,
113         -- Image width.
114         width       INTEGER NOT NULL,
115         -- Image height.
116         height      INTEGER NOT NULL,
117         
118         FOREIGN KEY (image) REFERENCES image,
119         UNIQUE      (hash),
120         PRIMARY KEY (id)
121     );
122
123     CREATE INDEX image_version_image_index ON image_version (image);
124     CREATE INDEX image_version_location_index ON image_version (directory, filename);
125
126     -- Members in an album.
127     CREATE TABLE member (
128         -- Identifier of the album.
129         album       INTEGER NOT NULL,
130         -- Member position, from 0 and up.
131         position    UNSIGNED NOT NULL,
132         -- Key of the member object.
133         object      INTEGER NOT NULL,
134
135         FOREIGN KEY (album) REFERENCES album,
136         FOREIGN KEY (object) REFERENCES object,
137         PRIMARY KEY (album, position)
138     );
139
140     CREATE INDEX member_object_index ON member (object);
141
142     -- Attributes for objects.
143     CREATE TABLE attribute (
144         -- Key of the object.
145         object      INTEGER NOT NULL,
146         -- Name of the attribute.
147         name        TEXT NOT NULL,
148         -- Value of the attribute.
149         value       TEXT NOT NULL,
150         -- Lowercased value of the attribute.
151         lcvalue     TEXT NOT NULL,
152
153         FOREIGN KEY (object) REFERENCES object,
154         PRIMARY KEY (object, name)
155     );
156
157     -- Categories in the shelf.
158     CREATE TABLE category (
159         -- Key of the category.
160         id          INTEGER NOT NULL,
161         -- Human-memorizable tag.
162         tag         TEXT NOT NULL,
163         -- Short description of the category.
164         description TEXT NOT NULL,
165
166         UNIQUE      (tag),
167         PRIMARY KEY (id)
168     );
169
170     -- Parent-child relations between categories.
171     CREATE TABLE category_child (
172         -- Parent category.
173         parent      INTEGER NOT NULL,
174
175         -- Child category.
176         child       INTEGER NOT NULL,
177
178         FOREIGN KEY (parent) REFERENCES category,
179         FOREIGN KEY (child) REFERENCES category,
180         PRIMARY KEY (parent, child)
181     );
182
183     CREATE INDEX category_child_child ON category_child (child);
184
185     -- Category-object mapping.
186     CREATE TABLE object_category (
187         -- Object.
188         object      INTEGER NOT NULL,
189
190         -- Category.
191         category    INTEGER NOT NULL,
192
193         FOREIGN KEY (object) REFERENCES object,
194         FOREIGN KEY (category) REFERENCES category,
195         PRIMARY KEY (object, category)
196     );
197
198     CREATE INDEX object_category_category ON object_category (category);
199
200     COMMIT;
201 """