CREATE TABLE authors ( id INTEGER PRIMARY KEY, name TEXT NOT NULL COLLATE NOCASE, sort TEXT COLLATE NOCASE, link TEXT NOT NULL DEFAULT '', UNIQUE(name) ); CREATE TABLE books ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL DEFAULT 'Unknown' COLLATE NOCASE, sort TEXT COLLATE NOCASE, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, pubdate TIMESTAMP DEFAULT CURRENT_TIMESTAMP, series_index REAL NOT NULL DEFAULT 1.0, author_sort TEXT COLLATE NOCASE, path TEXT NOT NULL DEFAULT '', uuid TEXT, has_cover BOOL DEFAULT 0, last_modified TIMESTAMP NOT NULL DEFAULT '2000-01-01 00:00:00+00:00'); CREATE TABLE books_authors_link ( id INTEGER PRIMARY KEY, book INTEGER NOT NULL, author INTEGER NOT NULL, UNIQUE(book, author) ); CREATE TABLE books_languages_link ( id INTEGER PRIMARY KEY, book INTEGER NOT NULL, lang_code INTEGER NOT NULL, item_order INTEGER NOT NULL DEFAULT 0, UNIQUE(book, lang_code) ); CREATE TABLE books_plugin_data(id INTEGER PRIMARY KEY, book INTEGER NOT NULL, name TEXT NOT NULL, val TEXT NOT NULL, UNIQUE(book,name)); CREATE TABLE books_publishers_link ( id INTEGER PRIMARY KEY, book INTEGER NOT NULL, publisher INTEGER NOT NULL, UNIQUE(book) ); CREATE TABLE books_ratings_link ( id INTEGER PRIMARY KEY, book INTEGER NOT NULL, rating INTEGER NOT NULL, UNIQUE(book, rating) ); CREATE TABLE books_series_link ( id INTEGER PRIMARY KEY, book INTEGER NOT NULL, series INTEGER NOT NULL, UNIQUE(book) ); CREATE TABLE books_pages_link ( book INTEGER PRIMARY KEY, pages INTEGER DEFAULT 0 NOT NULL, algorithm INTEGER DEFAULT 0 NOT NULL, format TEXT DEFAULT '' NOT NULL COLLATE NOCASE, format_size INTEGER DEFAULT 0 NOT NULL, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, needs_scan INTEGER NOT NULL DEFAULT 0 CHECK(needs_scan IN (0, 1)), FOREIGN KEY (book) REFERENCES books(id) ON DELETE CASCADE ); CREATE TRIGGER books_pages_link_create_trigger AFTER INSERT ON books FOR EACH ROW BEGIN INSERT INTO books_pages_link(book) VALUES(NEW.id); END; CREATE INDEX books_pages_link_pidx ON books_pages_link (needs_scan); CREATE TABLE books_tags_link ( id INTEGER PRIMARY KEY, book INTEGER NOT NULL, tag INTEGER NOT NULL, UNIQUE(book, tag) ); CREATE TABLE comments ( id INTEGER PRIMARY KEY, book INTEGER NOT NULL, text TEXT NOT NULL COLLATE NOCASE, UNIQUE(book) ); CREATE TABLE conversion_options ( id INTEGER PRIMARY KEY, format TEXT NOT NULL COLLATE NOCASE, book INTEGER, data BLOB NOT NULL, UNIQUE(format,book) ); CREATE TABLE custom_columns ( id INTEGER PRIMARY KEY AUTOINCREMENT, label TEXT NOT NULL, name TEXT NOT NULL, datatype TEXT NOT NULL, mark_for_delete BOOL DEFAULT 0 NOT NULL, editable BOOL DEFAULT 1 NOT NULL, display TEXT DEFAULT '{}' NOT NULL, is_multiple BOOL DEFAULT 0 NOT NULL, normalized BOOL NOT NULL, UNIQUE(label) ); CREATE TABLE data ( id INTEGER PRIMARY KEY, book INTEGER NOT NULL, format TEXT NOT NULL COLLATE NOCASE, uncompressed_size INTEGER NOT NULL, name TEXT NOT NULL, UNIQUE(book, format) ); CREATE TABLE feeds ( id INTEGER PRIMARY KEY, title TEXT NOT NULL, script TEXT NOT NULL, UNIQUE(title) ); CREATE TABLE identifiers ( id INTEGER PRIMARY KEY, book INTEGER NOT NULL, type TEXT NOT NULL DEFAULT 'isbn' COLLATE NOCASE, val TEXT NOT NULL COLLATE NOCASE, UNIQUE(book, type) ); CREATE TABLE languages ( id INTEGER PRIMARY KEY, lang_code TEXT NOT NULL COLLATE NOCASE, link TEXT NOT NULL DEFAULT '', UNIQUE(lang_code) ); CREATE TABLE library_id ( id INTEGER PRIMARY KEY, uuid TEXT NOT NULL, UNIQUE(uuid) ); CREATE TABLE metadata_dirtied(id INTEGER PRIMARY KEY, book INTEGER NOT NULL, UNIQUE(book)); CREATE TABLE annotations_dirtied(id INTEGER PRIMARY KEY, book INTEGER NOT NULL, UNIQUE(book)); CREATE TABLE preferences(id INTEGER PRIMARY KEY, key TEXT NOT NULL, val TEXT NOT NULL, UNIQUE(key)); CREATE TABLE publishers ( id INTEGER PRIMARY KEY, name TEXT NOT NULL COLLATE NOCASE, sort TEXT COLLATE NOCASE, link TEXT NOT NULL DEFAULT '', UNIQUE(name) ); CREATE TABLE ratings ( id INTEGER PRIMARY KEY, rating INTEGER CHECK(rating > -1 AND rating < 11), link TEXT NOT NULL DEFAULT '', UNIQUE (rating) ); CREATE TABLE series ( id INTEGER PRIMARY KEY, name TEXT NOT NULL COLLATE NOCASE, sort TEXT COLLATE NOCASE, link TEXT NOT NULL DEFAULT '', UNIQUE (name) ); CREATE TABLE tags ( id INTEGER PRIMARY KEY, name TEXT NOT NULL COLLATE NOCASE, link TEXT NOT NULL DEFAULT '', UNIQUE (name) ); CREATE TABLE last_read_positions ( id INTEGER PRIMARY KEY, book INTEGER NOT NULL, format TEXT NOT NULL COLLATE NOCASE, user TEXT NOT NULL, device TEXT NOT NULL, cfi TEXT NOT NULL, epoch REAL NOT NULL, pos_frac REAL NOT NULL DEFAULT 0, UNIQUE(user, device, book, format) ); CREATE TABLE annotations ( id INTEGER PRIMARY KEY, book INTEGER NOT NULL, format TEXT NOT NULL COLLATE NOCASE, user_type TEXT NOT NULL, user TEXT NOT NULL, timestamp REAL NOT NULL, annot_id TEXT NOT NULL, annot_type TEXT NOT NULL, annot_data TEXT NOT NULL, searchable_text TEXT NOT NULL DEFAULT '', UNIQUE(book, user_type, user, format, annot_type, annot_id) ); CREATE VIRTUAL TABLE annotations_fts USING fts5(searchable_text, content = 'annotations', content_rowid = 'id', tokenize = 'unicode61 remove_diacritics 2'); CREATE VIRTUAL TABLE annotations_fts_stemmed USING fts5(searchable_text, content = 'annotations', content_rowid = 'id', tokenize = 'porter unicode61 remove_diacritics 2'); CREATE TRIGGER annotations_fts_insert_trg AFTER INSERT ON annotations BEGIN INSERT INTO annotations_fts(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text); INSERT INTO annotations_fts_stemmed(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text); END; CREATE TRIGGER annotations_fts_delete_trg AFTER DELETE ON annotations BEGIN INSERT INTO annotations_fts(annotations_fts, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text); INSERT INTO annotations_fts_stemmed(annotations_fts_stemmed, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text); END; CREATE TRIGGER annotations_fts_update_trg AFTER UPDATE ON annotations BEGIN INSERT INTO annotations_fts(annotations_fts, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text); INSERT INTO annotations_fts(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text); INSERT INTO annotations_fts_stemmed(annotations_fts_stemmed, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text); INSERT INTO annotations_fts_stemmed(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text); END; CREATE VIEW meta AS SELECT id, title, (SELECT sortconcat(bal.id, name) FROM books_authors_link AS bal JOIN authors ON(author = authors.id) WHERE book = books.id) authors, (SELECT name FROM publishers WHERE publishers.id IN (SELECT publisher from books_publishers_link WHERE book=books.id)) publisher, (SELECT rating FROM ratings WHERE ratings.id IN (SELECT rating from books_ratings_link WHERE book=books.id)) rating, timestamp, (SELECT MAX(uncompressed_size) FROM data WHERE book=books.id) size, (SELECT concat(name) FROM tags WHERE tags.id IN (SELECT tag from books_tags_link WHERE book=books.id)) tags, (SELECT text FROM comments WHERE book=books.id) comments, (SELECT name FROM series WHERE series.id IN (SELECT series FROM books_series_link WHERE book=books.id)) series, series_index, sort, author_sort, (SELECT concat(format) FROM data WHERE data.book=books.id) formats, path, pubdate, uuid FROM books; CREATE VIEW tag_browser_authors AS SELECT id, name, (SELECT COUNT(id) FROM books_authors_link WHERE author=authors.id) count, (SELECT AVG(ratings.rating) FROM books_authors_link AS tl, books_ratings_link AS bl, ratings WHERE tl.author=authors.id AND bl.book=tl.book AND ratings.id = bl.rating AND ratings.rating <> 0) avg_rating, sort AS sort FROM authors; CREATE VIEW tag_browser_filtered_authors AS SELECT id, name, (SELECT COUNT(books_authors_link.id) FROM books_authors_link WHERE author=authors.id AND books_list_filter(book)) count, (SELECT AVG(ratings.rating) FROM books_authors_link AS tl, books_ratings_link AS bl, ratings WHERE tl.author=authors.id AND bl.book=tl.book AND ratings.id = bl.rating AND ratings.rating <> 0 AND books_list_filter(bl.book)) avg_rating, sort AS sort FROM authors; CREATE VIEW tag_browser_filtered_publishers AS SELECT id, name, (SELECT COUNT(books_publishers_link.id) FROM books_publishers_link WHERE publisher=publishers.id AND books_list_filter(book)) count, (SELECT AVG(ratings.rating) FROM books_publishers_link AS tl, books_ratings_link AS bl, ratings WHERE tl.publisher=publishers.id AND bl.book=tl.book AND ratings.id = bl.rating AND ratings.rating <> 0 AND books_list_filter(bl.book)) avg_rating, name AS sort FROM publishers; CREATE VIEW tag_browser_filtered_ratings AS SELECT id, rating, (SELECT COUNT(books_ratings_link.id) FROM books_ratings_link WHERE rating=ratings.id AND books_list_filter(book)) count, (SELECT AVG(ratings.rating) FROM books_ratings_link AS tl, books_ratings_link AS bl, ratings WHERE tl.rating=ratings.id AND bl.book=tl.book AND ratings.id = bl.rating AND ratings.rating <> 0 AND books_list_filter(bl.book)) avg_rating, rating AS sort FROM ratings; CREATE VIEW tag_browser_filtered_series AS SELECT id, name, (SELECT COUNT(books_series_link.id) FROM books_series_link WHERE series=series.id AND books_list_filter(book)) count, (SELECT AVG(ratings.rating) FROM books_series_link AS tl, books_ratings_link AS bl, ratings WHERE tl.series=series.id AND bl.book=tl.book AND ratings.id = bl.rating AND ratings.rating <> 0 AND books_list_filter(bl.book)) avg_rating, (title_sort(name)) AS sort FROM series; CREATE VIEW tag_browser_filtered_tags AS SELECT id, name, (SELECT COUNT(books_tags_link.id) FROM books_tags_link WHERE tag=tags.id AND books_list_filter(book)) count, (SELECT AVG(ratings.rating) FROM books_tags_link AS tl, books_ratings_link AS bl, ratings WHERE tl.tag=tags.id AND bl.book=tl.book AND ratings.id = bl.rating AND ratings.rating <> 0 AND books_list_filter(bl.book)) avg_rating, name AS sort FROM tags; CREATE VIEW tag_browser_publishers AS SELECT id, name, (SELECT COUNT(id) FROM books_publishers_link WHERE publisher=publishers.id) count, (SELECT AVG(ratings.rating) FROM books_publishers_link AS tl, books_ratings_link AS bl, ratings WHERE tl.publisher=publishers.id AND bl.book=tl.book AND ratings.id = bl.rating AND ratings.rating <> 0) avg_rating, name AS sort FROM publishers; CREATE VIEW tag_browser_ratings AS SELECT id, rating, (SELECT COUNT(id) FROM books_ratings_link WHERE rating=ratings.id) count, (SELECT AVG(ratings.rating) FROM books_ratings_link AS tl, books_ratings_link AS bl, ratings WHERE tl.rating=ratings.id AND bl.book=tl.book AND ratings.id = bl.rating AND ratings.rating <> 0) avg_rating, rating AS sort FROM ratings; CREATE VIEW tag_browser_series AS SELECT id, name, (SELECT COUNT(id) FROM books_series_link WHERE series=series.id) count, (SELECT AVG(ratings.rating) FROM books_series_link AS tl, books_ratings_link AS bl, ratings WHERE tl.series=series.id AND bl.book=tl.book AND ratings.id = bl.rating AND ratings.rating <> 0) avg_rating, (title_sort(name)) AS sort FROM series; CREATE VIEW tag_browser_tags AS SELECT id, name, (SELECT COUNT(id) FROM books_tags_link WHERE tag=tags.id) count, (SELECT AVG(ratings.rating) FROM books_tags_link AS tl, books_ratings_link AS bl, ratings WHERE tl.tag=tags.id AND bl.book=tl.book AND ratings.id = bl.rating AND ratings.rating <> 0) avg_rating, name AS sort FROM tags; CREATE INDEX authors_idx ON books (author_sort COLLATE NOCASE); CREATE INDEX books_authors_link_aidx ON books_authors_link (author); CREATE INDEX books_authors_link_bidx ON books_authors_link (book); CREATE INDEX books_idx ON books (sort COLLATE NOCASE); CREATE INDEX books_languages_link_aidx ON books_languages_link (lang_code); CREATE INDEX books_languages_link_bidx ON books_languages_link (book); CREATE INDEX books_publishers_link_aidx ON books_publishers_link (publisher); CREATE INDEX books_publishers_link_bidx ON books_publishers_link (book); CREATE INDEX books_ratings_link_aidx ON books_ratings_link (rating); CREATE INDEX books_ratings_link_bidx ON books_ratings_link (book); CREATE INDEX books_series_link_aidx ON books_series_link (series); CREATE INDEX books_series_link_bidx ON books_series_link (book); CREATE INDEX books_tags_link_aidx ON books_tags_link (tag); CREATE INDEX books_tags_link_bidx ON books_tags_link (book); CREATE INDEX comments_idx ON comments (book); CREATE INDEX conversion_options_idx_a ON conversion_options (format COLLATE NOCASE); CREATE INDEX conversion_options_idx_b ON conversion_options (book); CREATE INDEX custom_columns_idx ON custom_columns (label); CREATE INDEX data_idx ON data (book); CREATE INDEX lrp_idx ON last_read_positions (book); CREATE INDEX annot_idx ON annotations (book); CREATE INDEX formats_idx ON data (format); CREATE INDEX languages_idx ON languages (lang_code COLLATE NOCASE); CREATE INDEX publishers_idx ON publishers (name COLLATE NOCASE); CREATE INDEX series_idx ON series (name COLLATE NOCASE); CREATE INDEX tags_idx ON tags (name COLLATE NOCASE); CREATE TRIGGER books_delete_trg AFTER DELETE ON books BEGIN DELETE FROM books_authors_link WHERE book=OLD.id; DELETE FROM books_publishers_link WHERE book=OLD.id; DELETE FROM books_ratings_link WHERE book=OLD.id; DELETE FROM books_series_link WHERE book=OLD.id; DELETE FROM books_tags_link WHERE book=OLD.id; DELETE FROM books_languages_link WHERE book=OLD.id; DELETE FROM data WHERE book=OLD.id; DELETE FROM last_read_positions WHERE book=OLD.id; DELETE FROM annotations WHERE book=OLD.id; DELETE FROM comments WHERE book=OLD.id; DELETE FROM conversion_options WHERE book=OLD.id; DELETE FROM books_plugin_data WHERE book=OLD.id; DELETE FROM identifiers WHERE book=OLD.id; END; CREATE TRIGGER books_insert_trg AFTER INSERT ON books BEGIN UPDATE books SET sort=title_sort(NEW.title),uuid=uuid4() WHERE id=NEW.id; END; CREATE TRIGGER books_update_trg AFTER UPDATE ON books BEGIN UPDATE books SET sort=title_sort(NEW.title) WHERE id=NEW.id AND OLD.title <> NEW.title; END; CREATE TRIGGER fkc_comments_insert BEFORE INSERT ON comments BEGIN SELECT CASE WHEN (SELECT id from books WHERE id=NEW.book) IS NULL THEN RAISE(ABORT, 'Foreign key violation: book not in books') END; END; CREATE TRIGGER fkc_comments_update BEFORE UPDATE OF book ON comments BEGIN SELECT CASE WHEN (SELECT id from books WHERE id=NEW.book) IS NULL THEN RAISE(ABORT, 'Foreign key violation: book not in books') END; END; CREATE TRIGGER fkc_data_insert BEFORE INSERT ON data BEGIN SELECT CASE WHEN (SELECT id from books WHERE id=NEW.book) IS NULL THEN RAISE(ABORT, 'Foreign key violation: book not in books') END; END; CREATE TRIGGER fkc_data_update BEFORE UPDATE OF book ON data BEGIN SELECT CASE WHEN (SELECT id from books WHERE id=NEW.book) IS NULL THEN RAISE(ABORT, 'Foreign key violation: book not in books') END; END; CREATE TRIGGER fkc_lrp_insert BEFORE INSERT ON last_read_positions BEGIN SELECT CASE WHEN (SELECT id from books WHERE id=NEW.book) IS NULL THEN RAISE(ABORT, 'Foreign key violation: book not in books') END; END; CREATE TRIGGER fkc_lrp_update BEFORE UPDATE OF book ON last_read_positions BEGIN SELECT CASE WHEN (SELECT id from books WHERE id=NEW.book) IS NULL THEN RAISE(ABORT, 'Foreign key violation: book not in books') END; END; CREATE TRIGGER fkc_annot_insert BEFORE INSERT ON annotations BEGIN SELECT CASE WHEN (SELECT id from books WHERE id=NEW.book) IS NULL THEN RAISE(ABORT, 'Foreign key violation: book not in books') END; END; CREATE TRIGGER fkc_annot_update BEFORE UPDATE OF book ON annotations BEGIN SELECT CASE WHEN (SELECT id from books WHERE id=NEW.book) IS NULL THEN RAISE(ABORT, 'Foreign key violation: book not in books') END; END; CREATE TRIGGER fkc_delete_on_authors BEFORE DELETE ON authors BEGIN SELECT CASE WHEN (SELECT COUNT(id) FROM books_authors_link WHERE author=OLD.id) > 0 THEN RAISE(ABORT, 'Foreign key violation: authors is still referenced') END; END; CREATE TRIGGER fkc_delete_on_languages BEFORE DELETE ON languages BEGIN SELECT CASE WHEN (SELECT COUNT(id) FROM books_languages_link WHERE lang_code=OLD.id) > 0 THEN RAISE(ABORT, 'Foreign key violation: language is still referenced') END; END; CREATE TRIGGER fkc_delete_on_languages_link BEFORE INSERT ON books_languages_link BEGIN SELECT CASE WHEN (SELECT id from books WHERE id=NEW.book) IS NULL THEN RAISE(ABORT, 'Foreign key violation: book not in books') WHEN (SELECT id from languages WHERE id=NEW.lang_code) IS NULL THEN RAISE(ABORT, 'Foreign key violation: lang_code not in languages') END; END; CREATE TRIGGER fkc_delete_on_publishers BEFORE DELETE ON publishers BEGIN SELECT CASE WHEN (SELECT COUNT(id) FROM books_publishers_link WHERE publisher=OLD.id) > 0 THEN RAISE(ABORT, 'Foreign key violation: publishers is still referenced') END; END; CREATE TRIGGER fkc_delete_on_series BEFORE DELETE ON series BEGIN SELECT CASE WHEN (SELECT COUNT(id) FROM books_series_link WHERE series=OLD.id) > 0 THEN RAISE(ABORT, 'Foreign key violation: series is still referenced') END; END; CREATE TRIGGER fkc_delete_on_tags BEFORE DELETE ON tags BEGIN SELECT CASE WHEN (SELECT COUNT(id) FROM books_tags_link WHERE tag=OLD.id) > 0 THEN RAISE(ABORT, 'Foreign key violation: tags is still referenced') END; END; CREATE TRIGGER fkc_insert_books_authors_link BEFORE INSERT ON books_authors_link BEGIN SELECT CASE WHEN (SELECT id from books WHERE id=NEW.book) IS NULL THEN RAISE(ABORT, 'Foreign key violation: book not in books') WHEN (SELECT id from authors WHERE id=NEW.author) IS NULL THEN RAISE(ABORT, 'Foreign key violation: author not in authors') END; END; CREATE TRIGGER fkc_insert_books_publishers_link BEFORE INSERT ON books_publishers_link BEGIN SELECT CASE WHEN (SELECT id from books WHERE id=NEW.book) IS NULL THEN RAISE(ABORT, 'Foreign key violation: book not in books') WHEN (SELECT id from publishers WHERE id=NEW.publisher) IS NULL THEN RAISE(ABORT, 'Foreign key violation: publisher not in publishers') END; END; CREATE TRIGGER fkc_insert_books_ratings_link BEFORE INSERT ON books_ratings_link BEGIN SELECT CASE WHEN (SELECT id from books WHERE id=NEW.book) IS NULL THEN RAISE(ABORT, 'Foreign key violation: book not in books') WHEN (SELECT id from ratings WHERE id=NEW.rating) IS NULL THEN RAISE(ABORT, 'Foreign key violation: rating not in ratings') END; END; CREATE TRIGGER fkc_insert_books_series_link BEFORE INSERT ON books_series_link BEGIN SELECT CASE WHEN (SELECT id from books WHERE id=NEW.book) IS NULL THEN RAISE(ABORT, 'Foreign key violation: book not in books') WHEN (SELECT id from series WHERE id=NEW.series) IS NULL THEN RAISE(ABORT, 'Foreign key violation: series not in series') END; END; CREATE TRIGGER fkc_insert_books_tags_link BEFORE INSERT ON books_tags_link BEGIN SELECT CASE WHEN (SELECT id from books WHERE id=NEW.book) IS NULL THEN RAISE(ABORT, 'Foreign key violation: book not in books') WHEN (SELECT id from tags WHERE id=NEW.tag) IS NULL THEN RAISE(ABORT, 'Foreign key violation: tag not in tags') END; END; CREATE TRIGGER fkc_update_books_authors_link_a BEFORE UPDATE OF book ON books_authors_link BEGIN SELECT CASE WHEN (SELECT id from books WHERE id=NEW.book) IS NULL THEN RAISE(ABORT, 'Foreign key violation: book not in books') END; END; CREATE TRIGGER fkc_update_books_authors_link_b BEFORE UPDATE OF author ON books_authors_link BEGIN SELECT CASE WHEN (SELECT id from authors WHERE id=NEW.author) IS NULL THEN RAISE(ABORT, 'Foreign key violation: author not in authors') END; END; CREATE TRIGGER fkc_update_books_languages_link_a BEFORE UPDATE OF book ON books_languages_link BEGIN SELECT CASE WHEN (SELECT id from books WHERE id=NEW.book) IS NULL THEN RAISE(ABORT, 'Foreign key violation: book not in books') END; END; CREATE TRIGGER fkc_update_books_languages_link_b BEFORE UPDATE OF lang_code ON books_languages_link BEGIN SELECT CASE WHEN (SELECT id from languages WHERE id=NEW.lang_code) IS NULL THEN RAISE(ABORT, 'Foreign key violation: lang_code not in languages') END; END; CREATE TRIGGER fkc_update_books_publishers_link_a BEFORE UPDATE OF book ON books_publishers_link BEGIN SELECT CASE WHEN (SELECT id from books WHERE id=NEW.book) IS NULL THEN RAISE(ABORT, 'Foreign key violation: book not in books') END; END; CREATE TRIGGER fkc_update_books_publishers_link_b BEFORE UPDATE OF publisher ON books_publishers_link BEGIN SELECT CASE WHEN (SELECT id from publishers WHERE id=NEW.publisher) IS NULL THEN RAISE(ABORT, 'Foreign key violation: publisher not in publishers') END; END; CREATE TRIGGER fkc_update_books_ratings_link_a BEFORE UPDATE OF book ON books_ratings_link BEGIN SELECT CASE WHEN (SELECT id from books WHERE id=NEW.book) IS NULL THEN RAISE(ABORT, 'Foreign key violation: book not in books') END; END; CREATE TRIGGER fkc_update_books_ratings_link_b BEFORE UPDATE OF rating ON books_ratings_link BEGIN SELECT CASE WHEN (SELECT id from ratings WHERE id=NEW.rating) IS NULL THEN RAISE(ABORT, 'Foreign key violation: rating not in ratings') END; END; CREATE TRIGGER fkc_update_books_series_link_a BEFORE UPDATE OF book ON books_series_link BEGIN SELECT CASE WHEN (SELECT id from books WHERE id=NEW.book) IS NULL THEN RAISE(ABORT, 'Foreign key violation: book not in books') END; END; CREATE TRIGGER fkc_update_books_series_link_b BEFORE UPDATE OF series ON books_series_link BEGIN SELECT CASE WHEN (SELECT id from series WHERE id=NEW.series) IS NULL THEN RAISE(ABORT, 'Foreign key violation: series not in series') END; END; CREATE TRIGGER fkc_update_books_tags_link_a BEFORE UPDATE OF book ON books_tags_link BEGIN SELECT CASE WHEN (SELECT id from books WHERE id=NEW.book) IS NULL THEN RAISE(ABORT, 'Foreign key violation: book not in books') END; END; CREATE TRIGGER fkc_update_books_tags_link_b BEFORE UPDATE OF tag ON books_tags_link BEGIN SELECT CASE WHEN (SELECT id from tags WHERE id=NEW.tag) IS NULL THEN RAISE(ABORT, 'Foreign key violation: tag not in tags') END; END; CREATE TRIGGER series_insert_trg AFTER INSERT ON series BEGIN UPDATE series SET sort=title_sort(NEW.name) WHERE id=NEW.id; END; CREATE TRIGGER series_update_trg AFTER UPDATE ON series BEGIN UPDATE series SET sort=title_sort(NEW.name) WHERE id=NEW.id; END; -- Set application id to "cali" as a big endian number PRAGMA application_id = 0x63616c69; pragma user_version=27;