diff --git a/resources/metadata_sqlite.sql b/resources/metadata_sqlite.sql index 6af5466041..454b271465 100644 --- a/resources/metadata_sqlite.sql +++ b/resources/metadata_sqlite.sql @@ -135,7 +135,7 @@ CREATE TABLE last_read_positions ( id INTEGER PRIMARY KEY, device TEXT NOT NULL, cfi TEXT NOT NULL, epoch REAL NOT NULL, - extra TEXT DEFAULT '', + pos_frac REAL NOT NULL DEFAULT 0, UNIQUE(user, device, book, format) ); diff --git a/src/calibre/db/cache.py b/src/calibre/db/cache.py index 3f878ed281..ff24c62655 100644 --- a/src/calibre/db/cache.py +++ b/src/calibre/db/cache.py @@ -2136,14 +2136,14 @@ class Cache(object): def get_last_read_positions(self, book_id, fmt, user): fmt = fmt.upper() ans = [] - for device, cfi, epoch in self.backend.execute( - 'SELECT device,cfi,epoch FROM last_read_positions WHERE book=? AND format=? AND user=?', + for device, cfi, epoch, pos_frac in self.backend.execute( + 'SELECT device,cfi,epoch,pos_frac FROM last_read_positions WHERE book=? AND format=? AND user=?', (book_id, fmt, user)): - ans.append({'device':device, 'cfi': cfi, 'epoch':epoch}) + ans.append({'device':device, 'cfi': cfi, 'epoch':epoch, 'pos_frac':pos_frac}) return ans @write_api - def set_last_read_position(self, book_id, fmt, user='_', device='_', cfi=None, epoch=None): + def set_last_read_position(self, book_id, fmt, user='_', device='_', cfi=None, epoch=None, pos_frac=0): fmt = fmt.upper() device = device or '_' user = user or '_' @@ -2153,8 +2153,8 @@ class Cache(object): (book_id, fmt, user, device)) else: self.backend.execute( - 'INSERT OR REPLACE INTO last_read_positions(book,format,user,device,cfi,epoch) VALUES (?,?,?,?,?,?)', - (book_id, fmt, user, device, cfi, epoch or time())) + 'INSERT OR REPLACE INTO last_read_positions(book,format,user,device,cfi,epoch,pos_frac) VALUES (?,?,?,?,?,?,?)', + (book_id, fmt, user, device, cfi, epoch or time(), pos_frac)) @read_api def export_library(self, library_key, exporter, progress=None, abort=None): diff --git a/src/calibre/db/schema_upgrades.py b/src/calibre/db/schema_upgrades.py index a32f593f16..decb6278bc 100644 --- a/src/calibre/db/schema_upgrades.py +++ b/src/calibre/db/schema_upgrades.py @@ -652,7 +652,7 @@ CREATE TABLE last_read_positions ( id INTEGER PRIMARY KEY, device TEXT NOT NULL, cfi TEXT NOT NULL, epoch REAL NOT NULL, - extra TEXT DEFAULT '', + pos_frac REAL NOT NULL DEFAULT 0, UNIQUE(user, device, book, format) ); DROP INDEX IF EXISTS lrp_idx; diff --git a/src/calibre/db/tests/metadata.db b/src/calibre/db/tests/metadata.db index 0757bc5e0e..fb8345a101 100644 Binary files a/src/calibre/db/tests/metadata.db and b/src/calibre/db/tests/metadata.db differ diff --git a/src/calibre/db/tests/reading.py b/src/calibre/db/tests/reading.py index 050e4edd9b..0886680414 100644 --- a/src/calibre/db/tests/reading.py +++ b/src/calibre/db/tests/reading.py @@ -675,9 +675,9 @@ class ReadingTest(BaseTest): self.assertFalse(cache.get_last_read_positions(1, 'x', 'u')) self.assertRaises(Exception, cache.set_last_read_position, 12, 'x', cfi='c') epoch = time() - cache.set_last_read_position(1, 'EPUB', 'user', 'device', 'cFi', epoch) + cache.set_last_read_position(1, 'EPUB', 'user', 'device', 'cFi', epoch, 0.3) self.assertFalse(cache.get_last_read_positions(1, 'x', 'u')) - self.assertEqual(cache.get_last_read_positions(1, 'ePuB', 'user'), [{'epoch':epoch, 'device':'device', 'cfi':'cFi'}]) + self.assertEqual(cache.get_last_read_positions(1, 'ePuB', 'user'), [{'epoch':epoch, 'device':'device', 'cfi':'cFi', 'pos_frac':0.3}]) cache.set_last_read_position(1, 'EPUB', 'user', 'device') self.assertFalse(cache.get_last_read_positions(1, 'ePuB', 'user')) # }}}