Add db table to track last read positions

This commit is contained in:
Kovid Goyal 2017-02-22 12:59:30 +05:30
parent 7d1773ab73
commit e6c53ab033
3 changed files with 85 additions and 1 deletions

View File

@ -128,6 +128,17 @@ CREATE TABLE tags ( id INTEGER PRIMARY KEY,
name TEXT NOT NULL COLLATE NOCASE, name TEXT NOT NULL COLLATE NOCASE,
UNIQUE (name) 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 CREATE VIEW meta AS
SELECT id, title, 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 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 conversion_options_idx_b ON conversion_options (book);
CREATE INDEX custom_columns_idx ON custom_columns (label); CREATE INDEX custom_columns_idx ON custom_columns (label);
CREATE INDEX data_idx ON data (book); 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 formats_idx ON data (format);
CREATE INDEX languages_idx ON languages (lang_code COLLATE NOCASE); CREATE INDEX languages_idx ON languages (lang_code COLLATE NOCASE);
CREATE INDEX publishers_idx ON publishers (name 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_tags_link WHERE book=OLD.id;
DELETE FROM books_languages_link WHERE book=OLD.id; DELETE FROM books_languages_link WHERE book=OLD.id;
DELETE FROM data 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 comments WHERE book=OLD.id;
DELETE FROM conversion_options WHERE book=OLD.id; DELETE FROM conversion_options WHERE book=OLD.id;
DELETE FROM books_plugin_data 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') THEN RAISE(ABORT, 'Foreign key violation: book not in books')
END; END;
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 CREATE TRIGGER fkc_delete_on_authors
BEFORE DELETE ON authors BEFORE DELETE ON authors
BEGIN BEGIN
@ -546,4 +575,4 @@ CREATE TRIGGER series_update_trg
BEGIN BEGIN
UPDATE series SET sort=title_sort(NEW.name) WHERE id=NEW.id; UPDATE series SET sort=title_sort(NEW.name) WHERE id=NEW.id;
END; END;
pragma user_version=22; pragma user_version=23;

View File

@ -641,3 +641,58 @@ class SchemaUpgrade(object):
''' '''
self.db.execute(script) 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;
''')

Binary file not shown.