Add an annotations table to the database

This commit is contained in:
Kovid Goyal 2020-05-26 20:55:11 +05:30
parent 4ab24b8ea2
commit 628ce9aa84
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 99 additions and 1 deletions

View File

@ -106,6 +106,9 @@ CREATE TABLE library_id ( id INTEGER PRIMARY KEY,
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,
@ -139,6 +142,19 @@ CREATE TABLE last_read_positions ( id INTEGER PRIMARY KEY,
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,
UNIQUE(book, user_type, user, format, annot_id)
);
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,
@ -290,6 +306,7 @@ 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);
@ -306,6 +323,7 @@ CREATE TRIGGER books_delete_trg
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;
@ -369,6 +387,22 @@ CREATE TRIGGER fkc_lrp_update
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

View File

@ -696,3 +696,67 @@ CREATE TRIGGER fkc_lrp_update
END;
''')
def upgrade_version_23(self):
''' Create the annotations table '''
self.db.execute('''
DROP TABLE IF EXISTS annotations_dirtied;
CREATE TABLE annotations_dirtied(id INTEGER PRIMARY KEY,
book INTEGER NOT NULL,
UNIQUE(book));
DROP TABLE IF EXISTS annotations;
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,
UNIQUE(book, user_type, user, format, annot_id)
);
DROP INDEX IF EXISTS annot_idx;
CREATE INDEX annot_idx ON annotations (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 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;
DROP TRIGGER IF EXISTS fkc_annot_insert;
DROP TRIGGER IF EXISTS fkc_annot_update;
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;
''')

View File

@ -20,5 +20,5 @@ def get_book_library_details(absolute_path_to_ebook):
dbpath = os.path.join(library_dir, 'metadata.db')
dbpath = os.environ.get('CALIBRE_OVERRIDE_DATABASE_PATH') or dbpath
if not os.path.exists(dbpath):
return None
return
return {'dbpath': dbpath, 'book_id': book_id, 'fmt': absolute_path_to_ebook.rpartition('.')[-1].upper()}