mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Add an annotations table to the database
This commit is contained in:
parent
4ab24b8ea2
commit
628ce9aa84
@ -106,6 +106,9 @@ CREATE TABLE library_id ( id INTEGER PRIMARY KEY,
|
|||||||
CREATE TABLE metadata_dirtied(id INTEGER PRIMARY KEY,
|
CREATE TABLE metadata_dirtied(id INTEGER PRIMARY KEY,
|
||||||
book INTEGER NOT NULL,
|
book INTEGER NOT NULL,
|
||||||
UNIQUE(book));
|
UNIQUE(book));
|
||||||
|
CREATE TABLE annotations_dirtied(id INTEGER PRIMARY KEY,
|
||||||
|
book INTEGER NOT NULL,
|
||||||
|
UNIQUE(book));
|
||||||
CREATE TABLE preferences(id INTEGER PRIMARY KEY,
|
CREATE TABLE preferences(id INTEGER PRIMARY KEY,
|
||||||
key TEXT NOT NULL,
|
key TEXT NOT NULL,
|
||||||
val 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)
|
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
|
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,
|
||||||
@ -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 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 lrp_idx ON last_read_positions (book);
|
||||||
|
CREATE INDEX annot_idx ON annotations (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);
|
||||||
@ -306,6 +323,7 @@ CREATE TRIGGER books_delete_trg
|
|||||||
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 last_read_positions WHERE book=OLD.id;
|
||||||
|
DELETE FROM annotations 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;
|
||||||
@ -369,6 +387,22 @@ CREATE TRIGGER fkc_lrp_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_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
|
CREATE TRIGGER fkc_delete_on_authors
|
||||||
BEFORE DELETE ON authors
|
BEFORE DELETE ON authors
|
||||||
BEGIN
|
BEGIN
|
||||||
|
@ -696,3 +696,67 @@ CREATE TRIGGER fkc_lrp_update
|
|||||||
END;
|
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;
|
||||||
|
|
||||||
|
''')
|
||||||
|
@ -20,5 +20,5 @@ def get_book_library_details(absolute_path_to_ebook):
|
|||||||
dbpath = os.path.join(library_dir, 'metadata.db')
|
dbpath = os.path.join(library_dir, 'metadata.db')
|
||||||
dbpath = os.environ.get('CALIBRE_OVERRIDE_DATABASE_PATH') or dbpath
|
dbpath = os.environ.get('CALIBRE_OVERRIDE_DATABASE_PATH') or dbpath
|
||||||
if not os.path.exists(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()}
|
return {'dbpath': dbpath, 'book_id': book_id, 'fmt': absolute_path_to_ebook.rpartition('.')[-1].upper()}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user