From e6c53ab033889ab97bbf58664ea719c8a81c06b3 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 22 Feb 2017 12:59:30 +0530 Subject: [PATCH] Add db table to track last read positions --- resources/metadata_sqlite.sql | 31 ++++++++++++++++- src/calibre/db/schema_upgrades.py | 55 ++++++++++++++++++++++++++++++ src/calibre/db/tests/metadata.db | Bin 240640 -> 245760 bytes 3 files changed, 85 insertions(+), 1 deletion(-) 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 3c2ad5bd9b7f182dcdcdb47bdf81833a5450f22b..0757bc5e0ec99bf74ac1407af0ff321623e4ae8f 100644 GIT binary patch delta 977 zcmaJ-Gw$((^A4$_>Q0HuHzUB0NACsA|+~+v5G)y*ooE5Sy|9q=Q2?D0_rJ8ckiViv#1aC6s=|(toyD` zQ1FX7UOa`iAv6_#Fy?m4D_{VvfSwuV8Ttf25?kjcrH38#Q5!6-@kU7Axn7f;YjhK{ zwMK{v02PW>|3h@M;J#gOLwZrE;ASS4tw^A3e!z4i5v;*qz)$Nsabrv!H`*OubXi_V zNK12>bW~0(&Bd}xG$X|l(R3;+D{^Wf3w8$23BHhk1EODu;DbawEaEE3*fpI>&GM@e zHBw{udQmQ{#HQz@Dw!v%VBqV)S0Ud(P^iYQz2G6Ig$>Z5ZR8-&E@q|7gCuG(B%~{H zT>B%TRwka5%TQEGr{b3|tv!gv;Sd(X!Jx;4sYpvoCWb>oB!vCKkS`nz;qLDJP*@C% zh6Pud)`N9U$%D%+d2lk7nU5*Fi62tOjP^0F_Vy)e@2%2Bw66*XzR@Yyl>$$h61+dj zK4RCQ*$BZN0DE*AJN36%b)v>`++Ld>CT}|XwRHosSjrz~^^ymKvjNdWRIY#FgYaG0{HWyVg^305s zNzTTj;CK3s&pc%*AENOpaB@9Ky;xlca)54pTR2c=Yd NTOogb6?XlP{4XoLHo^b^ delta 402 zcmZo@;BUCWH$hsJnSp`fH4wwVMj(R)#sSidKrA*{kVjsSnL+m%H!F}E!ekCo@Oomw zip_#NN{pMWn07NVvTy#z%p)Pdz`)EP$^b;^3`an!CJV`I;%c*GXP4F$=jgGV&b*V^ zVfvg^%zV>Vu`+Q@c92t<{)?4KYArOJkzi2Vpc%nTJL67LE>ib zX4Zpqg{H6GjbuE}^n1IR<)gTdafrW#Ig`tH3h^{g&U|I$Ys*=g;