1
CREATE TABLE authors ( id INTEGER PRIMARY KEY,
2
name TEXT NOT NULL COLLATE NOCASE,
3
sort TEXT COLLATE NOCASE,
6
CREATE TABLE books ( id INTEGER PRIMARY KEY AUTOINCREMENT,
7
title TEXT NOT NULL DEFAULT 'Unknown' COLLATE NOCASE,
8
sort TEXT COLLATE NOCASE,
9
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
11
series_index INTEGER NOT NULL DEFAULT 1,
12
author_sort TEXT COLLATE NOCASE,
13
isbn TEXT DEFAULT "" COLLATE NOCASE,
14
path TEXT NOT NULL DEFAULT ""
16
CREATE TABLE books_authors_link ( id INTEGER PRIMARY KEY,
17
book INTEGER NOT NULL,
18
author INTEGER NOT NULL,
21
CREATE TABLE books_publishers_link ( id INTEGER PRIMARY KEY,
22
book INTEGER NOT NULL,
23
publisher INTEGER NOT NULL,
26
CREATE TABLE books_ratings_link ( id INTEGER PRIMARY KEY,
27
book INTEGER NOT NULL,
28
rating INTEGER NOT NULL,
31
CREATE TABLE books_series_link ( id INTEGER PRIMARY KEY,
32
book INTEGER NOT NULL,
33
series INTEGER NOT NULL,
36
CREATE TABLE books_tags_link ( id INTEGER PRIMARY KEY,
37
book INTEGER NOT NULL,
41
CREATE TABLE comments ( id INTEGER PRIMARY KEY,
42
book INTEGER NON NULL,
43
text TEXT NON NULL COLLATE NOCASE,
46
CREATE TABLE conversion_options ( id INTEGER PRIMARY KEY,
47
format TEXT NOT NULL COLLATE NOCASE,
52
CREATE TABLE feeds ( id INTEGER PRIMARY KEY,
57
CREATE TABLE publishers ( id INTEGER PRIMARY KEY,
58
name TEXT NOT NULL COLLATE NOCASE,
59
sort TEXT COLLATE NOCASE,
62
CREATE TABLE ratings ( id INTEGER PRIMARY KEY,
63
rating INTEGER CHECK(rating > -1 AND rating < 11),
66
CREATE TABLE series ( id INTEGER PRIMARY KEY,
67
name TEXT NOT NULL COLLATE NOCASE,
68
sort TEXT COLLATE NOCASE,
71
CREATE TABLE tags ( id INTEGER PRIMARY KEY,
72
name TEXT NOT NULL COLLATE NOCASE,
75
CREATE TABLE data ( id INTEGER PRIMARY KEY,
76
book INTEGER NON NULL,
77
format TEXT NON NULL COLLATE NOCASE,
78
uncompressed_size INTEGER NON NULL,
85
(SELECT concat(name) FROM authors WHERE authors.id IN (SELECT author from books_authors_link WHERE book=books.id)) authors,
86
(SELECT name FROM publishers WHERE publishers.id IN (SELECT publisher from books_publishers_link WHERE book=books.id)) publisher,
87
(SELECT rating FROM ratings WHERE ratings.id IN (SELECT rating from books_ratings_link WHERE book=books.id)) rating,
89
(SELECT MAX(uncompressed_size) FROM data WHERE book=books.id) size,
90
(SELECT concat(name) FROM tags WHERE tags.id IN (SELECT tag from books_tags_link WHERE book=books.id)) tags,
91
(SELECT text FROM comments WHERE book=books.id) comments,
92
(SELECT name FROM series WHERE series.id IN (SELECT series FROM books_series_link WHERE book=books.id)) series,
96
(SELECT concat(format) FROM data WHERE data.book=books.id) formats,
99
CREATE INDEX authors_idx ON books (author_sort COLLATE NOCASE);
100
CREATE INDEX books_authors_link_aidx ON books_authors_link (author);
101
CREATE INDEX books_authors_link_bidx ON books_authors_link (book);
102
CREATE INDEX books_idx ON books (sort COLLATE NOCASE);
103
CREATE INDEX books_publishers_link_aidx ON books_publishers_link (publisher);
104
CREATE INDEX books_publishers_link_bidx ON books_publishers_link (book);
105
CREATE INDEX books_ratings_link_aidx ON books_ratings_link (rating);
106
CREATE INDEX books_ratings_link_bidx ON books_ratings_link (book);
107
CREATE INDEX books_series_link_aidx ON books_series_link (series);
108
CREATE INDEX books_series_link_bidx ON books_series_link (book);
109
CREATE INDEX books_tags_link_aidx ON books_tags_link (tag);
110
CREATE INDEX books_tags_link_bidx ON books_tags_link (book);
111
CREATE INDEX comments_idx ON comments (book);
112
CREATE INDEX conversion_options_idx_a ON conversion_options (format COLLATE NOCASE);
113
CREATE INDEX conversion_options_idx_b ON conversion_options (book);
114
CREATE INDEX data_idx ON data (book);
115
CREATE INDEX publishers_idx ON publishers (name COLLATE NOCASE);
116
CREATE INDEX series_idx ON series (sort COLLATE NOCASE);
117
CREATE INDEX tags_idx ON tags (name COLLATE NOCASE);
118
CREATE TRIGGER books_delete_trg
119
AFTER DELETE ON books
121
DELETE FROM books_authors_link WHERE book=OLD.id;
122
DELETE FROM books_publishers_link WHERE book=OLD.id;
123
DELETE FROM books_ratings_link WHERE book=OLD.id;
124
DELETE FROM books_series_link WHERE book=OLD.id;
125
DELETE FROM books_tags_link WHERE book=OLD.id;
126
DELETE FROM data WHERE book=OLD.id;
127
DELETE FROM comments WHERE book=OLD.id;
128
DELETE FROM conversion_options WHERE book=OLD.id;
130
CREATE TRIGGER books_insert_trg
131
AFTER INSERT ON books
133
UPDATE books SET sort=title_sort(NEW.title) WHERE id=NEW.id;
135
CREATE TRIGGER books_update_trg
136
AFTER UPDATE ON books
138
UPDATE books SET sort=title_sort(NEW.title) WHERE id=NEW.id;
140
CREATE TRIGGER fkc_comments_insert
141
BEFORE INSERT ON comments
144
WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
145
THEN RAISE(ABORT, 'Foreign key violation: book not in books')
148
CREATE TRIGGER fkc_comments_update
149
BEFORE UPDATE OF book ON comments
152
WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
153
THEN RAISE(ABORT, 'Foreign key violation: book not in books')
156
CREATE TRIGGER fkc_data_insert
157
BEFORE INSERT ON data
160
WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
161
THEN RAISE(ABORT, 'Foreign key violation: book not in books')
164
CREATE TRIGGER fkc_data_update
165
BEFORE UPDATE OF book ON data
168
WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
169
THEN RAISE(ABORT, 'Foreign key violation: book not in books')
172
CREATE TRIGGER fkc_delete_books_authors_link
173
BEFORE DELETE ON authors
176
WHEN (SELECT COUNT(id) FROM books_authors_link WHERE book=OLD.book) > 0
177
THEN RAISE(ABORT, 'Foreign key violation: author is still referenced')
180
CREATE TRIGGER fkc_delete_books_publishers_link
181
BEFORE DELETE ON publishers
184
WHEN (SELECT COUNT(id) FROM books_publishers_link WHERE book=OLD.book) > 0
185
THEN RAISE(ABORT, 'Foreign key violation: publisher is still referenced')
188
CREATE TRIGGER fkc_delete_books_series_link
189
BEFORE DELETE ON series
192
WHEN (SELECT COUNT(id) FROM books_series_link WHERE series=OLD.id) > 0
193
THEN RAISE(ABORT, 'Foreign key violation: series is still referenced')
196
CREATE TRIGGER fkc_delete_books_tags_link
197
BEFORE DELETE ON tags
200
WHEN (SELECT COUNT(id) FROM books_tags_link WHERE tag=OLD.id) > 0
201
THEN RAISE(ABORT, 'Foreign key violation: tag is still referenced')
204
CREATE TRIGGER fkc_insert_books_authors_link
205
BEFORE INSERT ON books_authors_link
208
WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
209
THEN RAISE(ABORT, 'Foreign key violation: book not in books')
210
WHEN (SELECT id from authors WHERE id=NEW.author) IS NULL
211
THEN RAISE(ABORT, 'Foreign key violation: author not in authors')
214
CREATE TRIGGER fkc_insert_books_publishers_link
215
BEFORE INSERT ON books_publishers_link
218
WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
219
THEN RAISE(ABORT, 'Foreign key violation: book not in books')
220
WHEN (SELECT id from publishers WHERE id=NEW.publisher) IS NULL
221
THEN RAISE(ABORT, 'Foreign key violation: publisher not in publishers')
224
CREATE TRIGGER fkc_insert_books_ratings_link
225
BEFORE INSERT ON books_ratings_link
228
WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
229
THEN RAISE(ABORT, 'Foreign key violation: book not in books')
230
WHEN (SELECT id from ratings WHERE id=NEW.rating) IS NULL
231
THEN RAISE(ABORT, 'Foreign key violation: rating not in ratings')
234
CREATE TRIGGER fkc_insert_books_series_link
235
BEFORE INSERT ON books_series_link
238
WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
239
THEN RAISE(ABORT, 'Foreign key violation: book not in books')
240
WHEN (SELECT id from series WHERE id=NEW.series) IS NULL
241
THEN RAISE(ABORT, 'Foreign key violation: series not in series')
244
CREATE TRIGGER fkc_insert_books_tags_link
245
BEFORE INSERT ON books_tags_link
248
WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
249
THEN RAISE(ABORT, 'Foreign key violation: book not in books')
250
WHEN (SELECT id from tags WHERE id=NEW.tag) IS NULL
251
THEN RAISE(ABORT, 'Foreign key violation: tag not in tags')
254
CREATE TRIGGER fkc_update_books_authors_link_a
255
BEFORE UPDATE OF book ON books_authors_link
258
WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
259
THEN RAISE(ABORT, 'Foreign key violation: book not in books')
262
CREATE TRIGGER fkc_update_books_authors_link_b
263
BEFORE UPDATE OF author ON books_authors_link
266
WHEN (SELECT id from authors WHERE id=NEW.author) IS NULL
267
THEN RAISE(ABORT, 'Foreign key violation: author not in authors')
270
CREATE TRIGGER fkc_update_books_publishers_link_a
271
BEFORE UPDATE OF book ON books_publishers_link
274
WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
275
THEN RAISE(ABORT, 'Foreign key violation: book not in books')
278
CREATE TRIGGER fkc_update_books_publishers_link_b
279
BEFORE UPDATE OF publisher ON books_publishers_link
282
WHEN (SELECT id from publishers WHERE id=NEW.publisher) IS NULL
283
THEN RAISE(ABORT, 'Foreign key violation: publisher not in publishers')
286
CREATE TRIGGER fkc_update_books_ratings_link_a
287
BEFORE UPDATE OF book ON books_ratings_link
290
WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
291
THEN RAISE(ABORT, 'Foreign key violation: book not in books')
294
CREATE TRIGGER fkc_update_books_ratings_link_b
295
BEFORE UPDATE OF rating ON books_ratings_link
298
WHEN (SELECT id from ratings WHERE id=NEW.rating) IS NULL
299
THEN RAISE(ABORT, 'Foreign key violation: rating not in ratings')
302
CREATE TRIGGER fkc_update_books_series_link_a
303
BEFORE UPDATE OF book ON books_series_link
306
WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
307
THEN RAISE(ABORT, 'Foreign key violation: book not in books')
310
CREATE TRIGGER fkc_update_books_series_link_b
311
BEFORE UPDATE OF series ON books_series_link
314
WHEN (SELECT id from series WHERE id=NEW.series) IS NULL
315
THEN RAISE(ABORT, 'Foreign key violation: series not in series')
318
CREATE TRIGGER fkc_update_books_tags_link_a
319
BEFORE UPDATE OF book ON books_tags_link
322
WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
323
THEN RAISE(ABORT, 'Foreign key violation: book not in books')
326
CREATE TRIGGER fkc_update_books_tags_link_b
327
BEFORE UPDATE OF tag ON books_tags_link
330
WHEN (SELECT id from tags WHERE id=NEW.tag) IS NULL
331
THEN RAISE(ABORT, 'Foreign key violation: tag not in tags')
334
CREATE TRIGGER series_insert_trg
335
AFTER INSERT ON series
337
UPDATE series SET sort=NEW.name WHERE id=NEW.id;
339
CREATE TRIGGER series_update_trg
340
AFTER UPDATE ON series
342
UPDATE series SET sort=NEW.name WHERE id=NEW.id;