metadata_sqlite.sql 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641
  1. CREATE TABLE authors ( id INTEGER PRIMARY KEY,
  2. name TEXT NOT NULL COLLATE NOCASE,
  3. sort TEXT COLLATE NOCASE,
  4. link TEXT NOT NULL DEFAULT '',
  5. UNIQUE(name)
  6. );
  7. CREATE TABLE books ( id INTEGER PRIMARY KEY AUTOINCREMENT,
  8. title TEXT NOT NULL DEFAULT 'Unknown' COLLATE NOCASE,
  9. sort TEXT COLLATE NOCASE,
  10. timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  11. pubdate TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  12. series_index REAL NOT NULL DEFAULT 1.0,
  13. author_sort TEXT COLLATE NOCASE,
  14. isbn TEXT DEFAULT '' COLLATE NOCASE,
  15. lccn TEXT DEFAULT '' COLLATE NOCASE,
  16. path TEXT NOT NULL DEFAULT '',
  17. flags INTEGER NOT NULL DEFAULT 1,
  18. uuid TEXT,
  19. has_cover BOOL DEFAULT 0,
  20. last_modified TIMESTAMP NOT NULL DEFAULT '2000-01-01 00:00:00+00:00');
  21. CREATE TABLE books_authors_link ( id INTEGER PRIMARY KEY,
  22. book INTEGER NOT NULL,
  23. author INTEGER NOT NULL,
  24. UNIQUE(book, author)
  25. );
  26. CREATE TABLE books_languages_link ( id INTEGER PRIMARY KEY,
  27. book INTEGER NOT NULL,
  28. lang_code INTEGER NOT NULL,
  29. item_order INTEGER NOT NULL DEFAULT 0,
  30. UNIQUE(book, lang_code)
  31. );
  32. CREATE TABLE books_plugin_data(id INTEGER PRIMARY KEY,
  33. book INTEGER NOT NULL,
  34. name TEXT NOT NULL,
  35. val TEXT NOT NULL,
  36. UNIQUE(book,name));
  37. CREATE TABLE books_publishers_link ( id INTEGER PRIMARY KEY,
  38. book INTEGER NOT NULL,
  39. publisher INTEGER NOT NULL,
  40. UNIQUE(book)
  41. );
  42. CREATE TABLE books_ratings_link ( id INTEGER PRIMARY KEY,
  43. book INTEGER NOT NULL,
  44. rating INTEGER NOT NULL,
  45. UNIQUE(book, rating)
  46. );
  47. CREATE TABLE books_series_link ( id INTEGER PRIMARY KEY,
  48. book INTEGER NOT NULL,
  49. series INTEGER NOT NULL,
  50. UNIQUE(book)
  51. );
  52. CREATE TABLE books_tags_link ( id INTEGER PRIMARY KEY,
  53. book INTEGER NOT NULL,
  54. tag INTEGER NOT NULL,
  55. UNIQUE(book, tag)
  56. );
  57. CREATE TABLE comments ( id INTEGER PRIMARY KEY,
  58. book INTEGER NOT NULL,
  59. text TEXT NOT NULL COLLATE NOCASE,
  60. UNIQUE(book)
  61. );
  62. CREATE TABLE conversion_options ( id INTEGER PRIMARY KEY,
  63. format TEXT NOT NULL COLLATE NOCASE,
  64. book INTEGER,
  65. data BLOB NOT NULL,
  66. UNIQUE(format,book)
  67. );
  68. CREATE TABLE custom_columns (
  69. id INTEGER PRIMARY KEY AUTOINCREMENT,
  70. label TEXT NOT NULL,
  71. name TEXT NOT NULL,
  72. datatype TEXT NOT NULL,
  73. mark_for_delete BOOL DEFAULT 0 NOT NULL,
  74. editable BOOL DEFAULT 1 NOT NULL,
  75. display TEXT DEFAULT '{}' NOT NULL,
  76. is_multiple BOOL DEFAULT 0 NOT NULL,
  77. normalized BOOL NOT NULL,
  78. UNIQUE(label)
  79. );
  80. CREATE TABLE data ( id INTEGER PRIMARY KEY,
  81. book INTEGER NOT NULL,
  82. format TEXT NOT NULL COLLATE NOCASE,
  83. uncompressed_size INTEGER NOT NULL,
  84. name TEXT NOT NULL,
  85. UNIQUE(book, format)
  86. );
  87. CREATE TABLE feeds ( id INTEGER PRIMARY KEY,
  88. title TEXT NOT NULL,
  89. script TEXT NOT NULL,
  90. UNIQUE(title)
  91. );
  92. CREATE TABLE identifiers ( id INTEGER PRIMARY KEY,
  93. book INTEGER NOT NULL,
  94. type TEXT NOT NULL DEFAULT 'isbn' COLLATE NOCASE,
  95. val TEXT NOT NULL COLLATE NOCASE,
  96. UNIQUE(book, type)
  97. );
  98. CREATE TABLE languages ( id INTEGER PRIMARY KEY,
  99. lang_code TEXT NOT NULL COLLATE NOCASE,
  100. link TEXT NOT NULL DEFAULT '',
  101. UNIQUE(lang_code)
  102. );
  103. CREATE TABLE library_id ( id INTEGER PRIMARY KEY,
  104. uuid TEXT NOT NULL,
  105. UNIQUE(uuid)
  106. );
  107. CREATE TABLE metadata_dirtied(id INTEGER PRIMARY KEY,
  108. book INTEGER NOT NULL,
  109. UNIQUE(book));
  110. CREATE TABLE annotations_dirtied(id INTEGER PRIMARY KEY,
  111. book INTEGER NOT NULL,
  112. UNIQUE(book));
  113. CREATE TABLE preferences(id INTEGER PRIMARY KEY,
  114. key TEXT NOT NULL,
  115. val TEXT NOT NULL,
  116. UNIQUE(key));
  117. CREATE TABLE publishers ( id INTEGER PRIMARY KEY,
  118. name TEXT NOT NULL COLLATE NOCASE,
  119. sort TEXT COLLATE NOCASE,
  120. link TEXT NOT NULL DEFAULT '',
  121. UNIQUE(name)
  122. );
  123. CREATE TABLE ratings ( id INTEGER PRIMARY KEY,
  124. rating INTEGER CHECK(rating > -1 AND rating < 11),
  125. link TEXT NOT NULL DEFAULT '',
  126. UNIQUE (rating)
  127. );
  128. CREATE TABLE series ( id INTEGER PRIMARY KEY,
  129. name TEXT NOT NULL COLLATE NOCASE,
  130. sort TEXT COLLATE NOCASE,
  131. link TEXT NOT NULL DEFAULT '',
  132. UNIQUE (name)
  133. );
  134. CREATE TABLE tags ( id INTEGER PRIMARY KEY,
  135. name TEXT NOT NULL COLLATE NOCASE,
  136. link TEXT NOT NULL DEFAULT '',
  137. UNIQUE (name)
  138. );
  139. CREATE TABLE last_read_positions ( id INTEGER PRIMARY KEY,
  140. book INTEGER NOT NULL,
  141. format TEXT NOT NULL COLLATE NOCASE,
  142. user TEXT NOT NULL,
  143. device TEXT NOT NULL,
  144. cfi TEXT NOT NULL,
  145. epoch REAL NOT NULL,
  146. pos_frac REAL NOT NULL DEFAULT 0,
  147. UNIQUE(user, device, book, format)
  148. );
  149. CREATE TABLE annotations ( id INTEGER PRIMARY KEY,
  150. book INTEGER NOT NULL,
  151. format TEXT NOT NULL COLLATE NOCASE,
  152. user_type TEXT NOT NULL,
  153. user TEXT NOT NULL,
  154. timestamp REAL NOT NULL,
  155. annot_id TEXT NOT NULL,
  156. annot_type TEXT NOT NULL,
  157. annot_data TEXT NOT NULL,
  158. searchable_text TEXT NOT NULL DEFAULT '',
  159. UNIQUE(book, user_type, user, format, annot_type, annot_id)
  160. );
  161. CREATE VIRTUAL TABLE annotations_fts USING fts5(searchable_text, content = 'annotations', content_rowid = 'id', tokenize = 'unicode61 remove_diacritics 2');
  162. CREATE VIRTUAL TABLE annotations_fts_stemmed USING fts5(searchable_text, content = 'annotations', content_rowid = 'id', tokenize = 'porter unicode61 remove_diacritics 2');
  163. CREATE TRIGGER annotations_fts_insert_trg AFTER INSERT ON annotations
  164. BEGIN
  165. INSERT INTO annotations_fts(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text);
  166. INSERT INTO annotations_fts_stemmed(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text);
  167. END;
  168. CREATE TRIGGER annotations_fts_delete_trg AFTER DELETE ON annotations
  169. BEGIN
  170. INSERT INTO annotations_fts(annotations_fts, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text);
  171. INSERT INTO annotations_fts_stemmed(annotations_fts_stemmed, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text);
  172. END;
  173. CREATE TRIGGER annotations_fts_update_trg AFTER UPDATE ON annotations
  174. BEGIN
  175. INSERT INTO annotations_fts(annotations_fts, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text);
  176. INSERT INTO annotations_fts(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text);
  177. INSERT INTO annotations_fts_stemmed(annotations_fts_stemmed, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text);
  178. INSERT INTO annotations_fts_stemmed(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text);
  179. END;
  180. CREATE VIEW meta AS
  181. SELECT id, title,
  182. (SELECT sortconcat(bal.id, name) FROM books_authors_link AS bal JOIN authors ON(author = authors.id) WHERE book = books.id) authors,
  183. (SELECT name FROM publishers WHERE publishers.id IN (SELECT publisher from books_publishers_link WHERE book=books.id)) publisher,
  184. (SELECT rating FROM ratings WHERE ratings.id IN (SELECT rating from books_ratings_link WHERE book=books.id)) rating,
  185. timestamp,
  186. (SELECT MAX(uncompressed_size) FROM data WHERE book=books.id) size,
  187. (SELECT concat(name) FROM tags WHERE tags.id IN (SELECT tag from books_tags_link WHERE book=books.id)) tags,
  188. (SELECT text FROM comments WHERE book=books.id) comments,
  189. (SELECT name FROM series WHERE series.id IN (SELECT series FROM books_series_link WHERE book=books.id)) series,
  190. series_index,
  191. sort,
  192. author_sort,
  193. (SELECT concat(format) FROM data WHERE data.book=books.id) formats,
  194. isbn,
  195. path,
  196. lccn,
  197. pubdate,
  198. flags,
  199. uuid
  200. FROM books;
  201. CREATE VIEW tag_browser_authors AS SELECT
  202. id,
  203. name,
  204. (SELECT COUNT(id) FROM books_authors_link WHERE author=authors.id) count,
  205. (SELECT AVG(ratings.rating)
  206. FROM books_authors_link AS tl, books_ratings_link AS bl, ratings
  207. WHERE tl.author=authors.id AND bl.book=tl.book AND
  208. ratings.id = bl.rating AND ratings.rating <> 0) avg_rating,
  209. sort AS sort
  210. FROM authors;
  211. CREATE VIEW tag_browser_filtered_authors AS SELECT
  212. id,
  213. name,
  214. (SELECT COUNT(books_authors_link.id) FROM books_authors_link WHERE
  215. author=authors.id AND books_list_filter(book)) count,
  216. (SELECT AVG(ratings.rating)
  217. FROM books_authors_link AS tl, books_ratings_link AS bl, ratings
  218. WHERE tl.author=authors.id AND bl.book=tl.book AND
  219. ratings.id = bl.rating AND ratings.rating <> 0 AND
  220. books_list_filter(bl.book)) avg_rating,
  221. sort AS sort
  222. FROM authors;
  223. CREATE VIEW tag_browser_filtered_publishers AS SELECT
  224. id,
  225. name,
  226. (SELECT COUNT(books_publishers_link.id) FROM books_publishers_link WHERE
  227. publisher=publishers.id AND books_list_filter(book)) count,
  228. (SELECT AVG(ratings.rating)
  229. FROM books_publishers_link AS tl, books_ratings_link AS bl, ratings
  230. WHERE tl.publisher=publishers.id AND bl.book=tl.book AND
  231. ratings.id = bl.rating AND ratings.rating <> 0 AND
  232. books_list_filter(bl.book)) avg_rating,
  233. name AS sort
  234. FROM publishers;
  235. CREATE VIEW tag_browser_filtered_ratings AS SELECT
  236. id,
  237. rating,
  238. (SELECT COUNT(books_ratings_link.id) FROM books_ratings_link WHERE
  239. rating=ratings.id AND books_list_filter(book)) count,
  240. (SELECT AVG(ratings.rating)
  241. FROM books_ratings_link AS tl, books_ratings_link AS bl, ratings
  242. WHERE tl.rating=ratings.id AND bl.book=tl.book AND
  243. ratings.id = bl.rating AND ratings.rating <> 0 AND
  244. books_list_filter(bl.book)) avg_rating,
  245. rating AS sort
  246. FROM ratings;
  247. CREATE VIEW tag_browser_filtered_series AS SELECT
  248. id,
  249. name,
  250. (SELECT COUNT(books_series_link.id) FROM books_series_link WHERE
  251. series=series.id AND books_list_filter(book)) count,
  252. (SELECT AVG(ratings.rating)
  253. FROM books_series_link AS tl, books_ratings_link AS bl, ratings
  254. WHERE tl.series=series.id AND bl.book=tl.book AND
  255. ratings.id = bl.rating AND ratings.rating <> 0 AND
  256. books_list_filter(bl.book)) avg_rating,
  257. (title_sort(name)) AS sort
  258. FROM series;
  259. CREATE VIEW tag_browser_filtered_tags AS SELECT
  260. id,
  261. name,
  262. (SELECT COUNT(books_tags_link.id) FROM books_tags_link WHERE
  263. tag=tags.id AND books_list_filter(book)) count,
  264. (SELECT AVG(ratings.rating)
  265. FROM books_tags_link AS tl, books_ratings_link AS bl, ratings
  266. WHERE tl.tag=tags.id AND bl.book=tl.book AND
  267. ratings.id = bl.rating AND ratings.rating <> 0 AND
  268. books_list_filter(bl.book)) avg_rating,
  269. name AS sort
  270. FROM tags;
  271. CREATE VIEW tag_browser_publishers AS SELECT
  272. id,
  273. name,
  274. (SELECT COUNT(id) FROM books_publishers_link WHERE publisher=publishers.id) count,
  275. (SELECT AVG(ratings.rating)
  276. FROM books_publishers_link AS tl, books_ratings_link AS bl, ratings
  277. WHERE tl.publisher=publishers.id AND bl.book=tl.book AND
  278. ratings.id = bl.rating AND ratings.rating <> 0) avg_rating,
  279. name AS sort
  280. FROM publishers;
  281. CREATE VIEW tag_browser_ratings AS SELECT
  282. id,
  283. rating,
  284. (SELECT COUNT(id) FROM books_ratings_link WHERE rating=ratings.id) count,
  285. (SELECT AVG(ratings.rating)
  286. FROM books_ratings_link AS tl, books_ratings_link AS bl, ratings
  287. WHERE tl.rating=ratings.id AND bl.book=tl.book AND
  288. ratings.id = bl.rating AND ratings.rating <> 0) avg_rating,
  289. rating AS sort
  290. FROM ratings;
  291. CREATE VIEW tag_browser_series AS SELECT
  292. id,
  293. name,
  294. (SELECT COUNT(id) FROM books_series_link WHERE series=series.id) count,
  295. (SELECT AVG(ratings.rating)
  296. FROM books_series_link AS tl, books_ratings_link AS bl, ratings
  297. WHERE tl.series=series.id AND bl.book=tl.book AND
  298. ratings.id = bl.rating AND ratings.rating <> 0) avg_rating,
  299. (title_sort(name)) AS sort
  300. FROM series;
  301. CREATE VIEW tag_browser_tags AS SELECT
  302. id,
  303. name,
  304. (SELECT COUNT(id) FROM books_tags_link WHERE tag=tags.id) count,
  305. (SELECT AVG(ratings.rating)
  306. FROM books_tags_link AS tl, books_ratings_link AS bl, ratings
  307. WHERE tl.tag=tags.id AND bl.book=tl.book AND
  308. ratings.id = bl.rating AND ratings.rating <> 0) avg_rating,
  309. name AS sort
  310. FROM tags;
  311. CREATE INDEX authors_idx ON books (author_sort COLLATE NOCASE);
  312. CREATE INDEX books_authors_link_aidx ON books_authors_link (author);
  313. CREATE INDEX books_authors_link_bidx ON books_authors_link (book);
  314. CREATE INDEX books_idx ON books (sort COLLATE NOCASE);
  315. CREATE INDEX books_languages_link_aidx ON books_languages_link (lang_code);
  316. CREATE INDEX books_languages_link_bidx ON books_languages_link (book);
  317. CREATE INDEX books_publishers_link_aidx ON books_publishers_link (publisher);
  318. CREATE INDEX books_publishers_link_bidx ON books_publishers_link (book);
  319. CREATE INDEX books_ratings_link_aidx ON books_ratings_link (rating);
  320. CREATE INDEX books_ratings_link_bidx ON books_ratings_link (book);
  321. CREATE INDEX books_series_link_aidx ON books_series_link (series);
  322. CREATE INDEX books_series_link_bidx ON books_series_link (book);
  323. CREATE INDEX books_tags_link_aidx ON books_tags_link (tag);
  324. CREATE INDEX books_tags_link_bidx ON books_tags_link (book);
  325. CREATE INDEX comments_idx ON comments (book);
  326. CREATE INDEX conversion_options_idx_a ON conversion_options (format COLLATE NOCASE);
  327. CREATE INDEX conversion_options_idx_b ON conversion_options (book);
  328. CREATE INDEX custom_columns_idx ON custom_columns (label);
  329. CREATE INDEX data_idx ON data (book);
  330. CREATE INDEX lrp_idx ON last_read_positions (book);
  331. CREATE INDEX annot_idx ON annotations (book);
  332. CREATE INDEX formats_idx ON data (format);
  333. CREATE INDEX languages_idx ON languages (lang_code COLLATE NOCASE);
  334. CREATE INDEX publishers_idx ON publishers (name COLLATE NOCASE);
  335. CREATE INDEX series_idx ON series (name COLLATE NOCASE);
  336. CREATE INDEX tags_idx ON tags (name COLLATE NOCASE);
  337. CREATE TRIGGER books_delete_trg
  338. AFTER DELETE ON books
  339. BEGIN
  340. DELETE FROM books_authors_link WHERE book=OLD.id;
  341. DELETE FROM books_publishers_link WHERE book=OLD.id;
  342. DELETE FROM books_ratings_link WHERE book=OLD.id;
  343. DELETE FROM books_series_link WHERE book=OLD.id;
  344. DELETE FROM books_tags_link WHERE book=OLD.id;
  345. DELETE FROM books_languages_link WHERE book=OLD.id;
  346. DELETE FROM data WHERE book=OLD.id;
  347. DELETE FROM last_read_positions WHERE book=OLD.id;
  348. DELETE FROM annotations WHERE book=OLD.id;
  349. DELETE FROM comments WHERE book=OLD.id;
  350. DELETE FROM conversion_options WHERE book=OLD.id;
  351. DELETE FROM books_plugin_data WHERE book=OLD.id;
  352. DELETE FROM identifiers WHERE book=OLD.id;
  353. END;
  354. CREATE TRIGGER books_insert_trg AFTER INSERT ON books
  355. BEGIN
  356. UPDATE books SET sort=title_sort(NEW.title),uuid=uuid4() WHERE id=NEW.id;
  357. END;
  358. CREATE TRIGGER books_update_trg
  359. AFTER UPDATE ON books
  360. BEGIN
  361. UPDATE books SET sort=title_sort(NEW.title)
  362. WHERE id=NEW.id AND OLD.title <> NEW.title;
  363. END;
  364. CREATE TRIGGER fkc_comments_insert
  365. BEFORE INSERT ON comments
  366. BEGIN
  367. SELECT CASE
  368. WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
  369. THEN RAISE(ABORT, 'Foreign key violation: book not in books')
  370. END;
  371. END;
  372. CREATE TRIGGER fkc_comments_update
  373. BEFORE UPDATE OF book ON comments
  374. BEGIN
  375. SELECT CASE
  376. WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
  377. THEN RAISE(ABORT, 'Foreign key violation: book not in books')
  378. END;
  379. END;
  380. CREATE TRIGGER fkc_data_insert
  381. BEFORE INSERT ON data
  382. BEGIN
  383. SELECT CASE
  384. WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
  385. THEN RAISE(ABORT, 'Foreign key violation: book not in books')
  386. END;
  387. END;
  388. CREATE TRIGGER fkc_data_update
  389. BEFORE UPDATE OF book ON data
  390. BEGIN
  391. SELECT CASE
  392. WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
  393. THEN RAISE(ABORT, 'Foreign key violation: book not in books')
  394. END;
  395. END;
  396. CREATE TRIGGER fkc_lrp_insert
  397. BEFORE INSERT ON last_read_positions
  398. BEGIN
  399. SELECT CASE
  400. WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
  401. THEN RAISE(ABORT, 'Foreign key violation: book not in books')
  402. END;
  403. END;
  404. CREATE TRIGGER fkc_lrp_update
  405. BEFORE UPDATE OF book ON last_read_positions
  406. BEGIN
  407. SELECT CASE
  408. WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
  409. THEN RAISE(ABORT, 'Foreign key violation: book not in books')
  410. END;
  411. END;
  412. CREATE TRIGGER fkc_annot_insert
  413. BEFORE INSERT ON annotations
  414. BEGIN
  415. SELECT CASE
  416. WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
  417. THEN RAISE(ABORT, 'Foreign key violation: book not in books')
  418. END;
  419. END;
  420. CREATE TRIGGER fkc_annot_update
  421. BEFORE UPDATE OF book ON annotations
  422. BEGIN
  423. SELECT CASE
  424. WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
  425. THEN RAISE(ABORT, 'Foreign key violation: book not in books')
  426. END;
  427. END;
  428. CREATE TRIGGER fkc_delete_on_authors
  429. BEFORE DELETE ON authors
  430. BEGIN
  431. SELECT CASE
  432. WHEN (SELECT COUNT(id) FROM books_authors_link WHERE author=OLD.id) > 0
  433. THEN RAISE(ABORT, 'Foreign key violation: authors is still referenced')
  434. END;
  435. END;
  436. CREATE TRIGGER fkc_delete_on_languages
  437. BEFORE DELETE ON languages
  438. BEGIN
  439. SELECT CASE
  440. WHEN (SELECT COUNT(id) FROM books_languages_link WHERE lang_code=OLD.id) > 0
  441. THEN RAISE(ABORT, 'Foreign key violation: language is still referenced')
  442. END;
  443. END;
  444. CREATE TRIGGER fkc_delete_on_languages_link
  445. BEFORE INSERT ON books_languages_link
  446. BEGIN
  447. SELECT CASE
  448. WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
  449. THEN RAISE(ABORT, 'Foreign key violation: book not in books')
  450. WHEN (SELECT id from languages WHERE id=NEW.lang_code) IS NULL
  451. THEN RAISE(ABORT, 'Foreign key violation: lang_code not in languages')
  452. END;
  453. END;
  454. CREATE TRIGGER fkc_delete_on_publishers
  455. BEFORE DELETE ON publishers
  456. BEGIN
  457. SELECT CASE
  458. WHEN (SELECT COUNT(id) FROM books_publishers_link WHERE publisher=OLD.id) > 0
  459. THEN RAISE(ABORT, 'Foreign key violation: publishers is still referenced')
  460. END;
  461. END;
  462. CREATE TRIGGER fkc_delete_on_series
  463. BEFORE DELETE ON series
  464. BEGIN
  465. SELECT CASE
  466. WHEN (SELECT COUNT(id) FROM books_series_link WHERE series=OLD.id) > 0
  467. THEN RAISE(ABORT, 'Foreign key violation: series is still referenced')
  468. END;
  469. END;
  470. CREATE TRIGGER fkc_delete_on_tags
  471. BEFORE DELETE ON tags
  472. BEGIN
  473. SELECT CASE
  474. WHEN (SELECT COUNT(id) FROM books_tags_link WHERE tag=OLD.id) > 0
  475. THEN RAISE(ABORT, 'Foreign key violation: tags is still referenced')
  476. END;
  477. END;
  478. CREATE TRIGGER fkc_insert_books_authors_link
  479. BEFORE INSERT ON books_authors_link
  480. BEGIN
  481. SELECT CASE
  482. WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
  483. THEN RAISE(ABORT, 'Foreign key violation: book not in books')
  484. WHEN (SELECT id from authors WHERE id=NEW.author) IS NULL
  485. THEN RAISE(ABORT, 'Foreign key violation: author not in authors')
  486. END;
  487. END;
  488. CREATE TRIGGER fkc_insert_books_publishers_link
  489. BEFORE INSERT ON books_publishers_link
  490. BEGIN
  491. SELECT CASE
  492. WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
  493. THEN RAISE(ABORT, 'Foreign key violation: book not in books')
  494. WHEN (SELECT id from publishers WHERE id=NEW.publisher) IS NULL
  495. THEN RAISE(ABORT, 'Foreign key violation: publisher not in publishers')
  496. END;
  497. END;
  498. CREATE TRIGGER fkc_insert_books_ratings_link
  499. BEFORE INSERT ON books_ratings_link
  500. BEGIN
  501. SELECT CASE
  502. WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
  503. THEN RAISE(ABORT, 'Foreign key violation: book not in books')
  504. WHEN (SELECT id from ratings WHERE id=NEW.rating) IS NULL
  505. THEN RAISE(ABORT, 'Foreign key violation: rating not in ratings')
  506. END;
  507. END;
  508. CREATE TRIGGER fkc_insert_books_series_link
  509. BEFORE INSERT ON books_series_link
  510. BEGIN
  511. SELECT CASE
  512. WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
  513. THEN RAISE(ABORT, 'Foreign key violation: book not in books')
  514. WHEN (SELECT id from series WHERE id=NEW.series) IS NULL
  515. THEN RAISE(ABORT, 'Foreign key violation: series not in series')
  516. END;
  517. END;
  518. CREATE TRIGGER fkc_insert_books_tags_link
  519. BEFORE INSERT ON books_tags_link
  520. BEGIN
  521. SELECT CASE
  522. WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
  523. THEN RAISE(ABORT, 'Foreign key violation: book not in books')
  524. WHEN (SELECT id from tags WHERE id=NEW.tag) IS NULL
  525. THEN RAISE(ABORT, 'Foreign key violation: tag not in tags')
  526. END;
  527. END;
  528. CREATE TRIGGER fkc_update_books_authors_link_a
  529. BEFORE UPDATE OF book ON books_authors_link
  530. BEGIN
  531. SELECT CASE
  532. WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
  533. THEN RAISE(ABORT, 'Foreign key violation: book not in books')
  534. END;
  535. END;
  536. CREATE TRIGGER fkc_update_books_authors_link_b
  537. BEFORE UPDATE OF author ON books_authors_link
  538. BEGIN
  539. SELECT CASE
  540. WHEN (SELECT id from authors WHERE id=NEW.author) IS NULL
  541. THEN RAISE(ABORT, 'Foreign key violation: author not in authors')
  542. END;
  543. END;
  544. CREATE TRIGGER fkc_update_books_languages_link_a
  545. BEFORE UPDATE OF book ON books_languages_link
  546. BEGIN
  547. SELECT CASE
  548. WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
  549. THEN RAISE(ABORT, 'Foreign key violation: book not in books')
  550. END;
  551. END;
  552. CREATE TRIGGER fkc_update_books_languages_link_b
  553. BEFORE UPDATE OF lang_code ON books_languages_link
  554. BEGIN
  555. SELECT CASE
  556. WHEN (SELECT id from languages WHERE id=NEW.lang_code) IS NULL
  557. THEN RAISE(ABORT, 'Foreign key violation: lang_code not in languages')
  558. END;
  559. END;
  560. CREATE TRIGGER fkc_update_books_publishers_link_a
  561. BEFORE UPDATE OF book ON books_publishers_link
  562. BEGIN
  563. SELECT CASE
  564. WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
  565. THEN RAISE(ABORT, 'Foreign key violation: book not in books')
  566. END;
  567. END;
  568. CREATE TRIGGER fkc_update_books_publishers_link_b
  569. BEFORE UPDATE OF publisher ON books_publishers_link
  570. BEGIN
  571. SELECT CASE
  572. WHEN (SELECT id from publishers WHERE id=NEW.publisher) IS NULL
  573. THEN RAISE(ABORT, 'Foreign key violation: publisher not in publishers')
  574. END;
  575. END;
  576. CREATE TRIGGER fkc_update_books_ratings_link_a
  577. BEFORE UPDATE OF book ON books_ratings_link
  578. BEGIN
  579. SELECT CASE
  580. WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
  581. THEN RAISE(ABORT, 'Foreign key violation: book not in books')
  582. END;
  583. END;
  584. CREATE TRIGGER fkc_update_books_ratings_link_b
  585. BEFORE UPDATE OF rating ON books_ratings_link
  586. BEGIN
  587. SELECT CASE
  588. WHEN (SELECT id from ratings WHERE id=NEW.rating) IS NULL
  589. THEN RAISE(ABORT, 'Foreign key violation: rating not in ratings')
  590. END;
  591. END;
  592. CREATE TRIGGER fkc_update_books_series_link_a
  593. BEFORE UPDATE OF book ON books_series_link
  594. BEGIN
  595. SELECT CASE
  596. WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
  597. THEN RAISE(ABORT, 'Foreign key violation: book not in books')
  598. END;
  599. END;
  600. CREATE TRIGGER fkc_update_books_series_link_b
  601. BEFORE UPDATE OF series ON books_series_link
  602. BEGIN
  603. SELECT CASE
  604. WHEN (SELECT id from series WHERE id=NEW.series) IS NULL
  605. THEN RAISE(ABORT, 'Foreign key violation: series not in series')
  606. END;
  607. END;
  608. CREATE TRIGGER fkc_update_books_tags_link_a
  609. BEFORE UPDATE OF book ON books_tags_link
  610. BEGIN
  611. SELECT CASE
  612. WHEN (SELECT id from books WHERE id=NEW.book) IS NULL
  613. THEN RAISE(ABORT, 'Foreign key violation: book not in books')
  614. END;
  615. END;
  616. CREATE TRIGGER fkc_update_books_tags_link_b
  617. BEFORE UPDATE OF tag ON books_tags_link
  618. BEGIN
  619. SELECT CASE
  620. WHEN (SELECT id from tags WHERE id=NEW.tag) IS NULL
  621. THEN RAISE(ABORT, 'Foreign key violation: tag not in tags')
  622. END;
  623. END;
  624. CREATE TRIGGER series_insert_trg
  625. AFTER INSERT ON series
  626. BEGIN
  627. UPDATE series SET sort=title_sort(NEW.name) WHERE id=NEW.id;
  628. END;
  629. CREATE TRIGGER series_update_trg
  630. AFTER UPDATE ON series
  631. BEGIN
  632. UPDATE series SET sort=title_sort(NEW.name) WHERE id=NEW.id;
  633. END;
  634. pragma user_version=26;