diff --git a/resources/metadata_sqlite.sql b/resources/metadata_sqlite.sql index 45d8f26085..6af5466041 100644 --- a/resources/metadata_sqlite.sql +++ b/resources/metadata_sqlite.sql @@ -128,6 +128,17 @@ CREATE TABLE tags ( id INTEGER PRIMARY KEY, name TEXT NOT NULL COLLATE NOCASE, 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, + extra TEXT DEFAULT '', + UNIQUE(user, device, book, format) +); + 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, @@ -278,6 +289,7 @@ CREATE INDEX conversion_options_idx_a ON conversion_options (format COLLATE NOCA 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 formats_idx ON data (format); CREATE INDEX languages_idx ON languages (lang_code COLLATE NOCASE); CREATE INDEX publishers_idx ON publishers (name COLLATE NOCASE); @@ -293,6 +305,7 @@ CREATE TRIGGER books_delete_trg 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 comments WHERE book=OLD.id; DELETE FROM conversion_options WHERE book=OLD.id; DELETE FROM books_plugin_data WHERE book=OLD.id; @@ -340,6 +353,22 @@ CREATE TRIGGER fkc_data_update 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_delete_on_authors BEFORE DELETE ON authors BEGIN @@ -546,4 +575,4 @@ CREATE TRIGGER series_update_trg BEGIN UPDATE series SET sort=title_sort(NEW.name) WHERE id=NEW.id; END; -pragma user_version=22; +pragma user_version=23; diff --git a/src/calibre/db/schema_upgrades.py b/src/calibre/db/schema_upgrades.py index 943ad4850e..a32f593f16 100644 --- a/src/calibre/db/schema_upgrades.py +++ b/src/calibre/db/schema_upgrades.py @@ -641,3 +641,58 @@ class SchemaUpgrade(object): ''' self.db.execute(script) + def upgrade_version_22(self): + ''' Create the last_read_positions table ''' + self.db.execute(''' +DROP TABLE IF EXISTS last_read_positions; +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, + extra TEXT DEFAULT '', + UNIQUE(user, device, book, format) +); +DROP INDEX IF EXISTS lrp_idx; +CREATE INDEX lrp_idx ON last_read_positions (book); + +DROP TRIGGER IF EXISTS books_delete_trg; +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 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; + +DROP TRIGGER IF EXISTS fkc_lrp_insert; +DROP TRIGGER IF EXISTS fkc_lrp_update; +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; + + ''') diff --git a/src/calibre/db/tests/metadata.db b/src/calibre/db/tests/metadata.db index 3c2ad5bd9b..0757bc5e0e 100644 Binary files a/src/calibre/db/tests/metadata.db and b/src/calibre/db/tests/metadata.db differ