def _upgrade_database(self, from_version, to_version): """ Performs sequential upgrades to the database, bringing it from C{from_version} to C{to_version}. If C{from_version} is -1, the database structure will simply be re-created at the current version. """ if from_version == -1: self._create_tables() return if from_version != to_version: upgrades = range(from_version, to_version) log.info( _("Upgrading library database version from %(from)d to %(to)d." ), { "from": from_version, "to": to_version }) if 0 in upgrades: # Upgrade from Comix database structure to DB version 1 # (Added table 'info') self._create_table_info() if 1 in upgrades: # Upgrade to database structure version 2. # (Added table 'watchlist' for storing auto-add directories) self._create_table_watchlist() if 2 in upgrades: # Changed 'added' field in 'book' from date to datetime. self._con.execute('''alter table book rename to book_old''') self._create_table_book() self._con.execute('''insert into book (id, name, path, pages, format, size, added) select id, name, path, pages, format, size, datetime(added) from book_old''') self._con.execute('''drop table book_old''') if 3 in upgrades: # Added field 'recursive' to table 'watchlist' self._con.execute( '''alter table watchlist rename to watchlist_old''') self._create_table_watchlist() self._con.execute('''insert into watchlist (path, collection, recursive) select path, collection, 0 from watchlist_old''') self._con.execute('''drop table watchlist_old''') if 4 in upgrades: # Added table 'recent' to store recently viewed book information and # create a collection (-2, Recent) self._create_table_recent() lastread = last_read_page.LastReadPage(self) lastread.migrate_database_to_library(COLLECTION_RECENT) self._con.execute( '''update info set value = ? where key = 'version' ''', (str(_LibraryBackend.DB_VERSION), ))
def setUp(self): # Database file fp, self.db = tempfile.mkstemp('.db', 'mcomix-test') os.close(fp) # Dummy archive (files are checked for existance) fp, self.archive1 = tempfile.mkstemp('.zip', 'test-archive') os.close(fp) fp, self.archive2 = tempfile.mkstemp('.rar', 'test-archive') os.close(fp) self.lastread = last_read_page.LastReadPage(self.db) self.lastread.set_enabled(True)
def test_reopen(self): self.lastread.set_page(self.archive1, 1) self.lastread.set_page(self.archive2, 2) self.assertEqual(1, self.lastread.get_page(self.archive1)) self.assertEqual(2, self.lastread.get_page(self.archive2)) self.lastread.cleanup() self.lastread = last_read_page.LastReadPage(self.db) self.lastread.set_enabled(True) self.assertEqual(1, self.lastread.get_page(self.archive1), 'Page should be remembered after shutdown') self.assertEqual(2, self.lastread.get_page(self.archive2), 'Page should be remembered after shutdown')
def test_reopen(self): self.lastread.set_page(self.archive1, 1) self.lastread.set_page(self.archive2, 2) self.assertEqual(1, self.lastread.get_page(self.archive1)) self.assertEqual(2, self.lastread.get_page(self.archive2)) self.backend.close() self.backend = backend.LibraryBackend() self.lastread = last_read_page.LastReadPage(self.backend) self.lastread.set_enabled(True) self.assertEqual(1, self.lastread.get_page(self.archive1), 'Page should be remembered after shutdown') self.assertEqual(2, self.lastread.get_page(self.archive2), 'Page should be remembered after shutdown')
def setUp(self): # Database file fp, self.db = tempfile.mkstemp('.db', 'mcomix-test') os.close(fp) constants.LIBRARY_DATABASE_PATH = self.db # Dummy archive (files are checked for existance) self.archive1 = os.path.abspath(u'test/files/archives/01-ZIP-Normal.zip') self.archive2 = os.path.abspath(u'test/files/archives/02-TAR-Normal.tar') # Library backend self.backend = backend.LibraryBackend() self.lastread = last_read_page.LastReadPage(self.backend) self.lastread.set_enabled(True)
def __init__(self, window): #: Indicates if files/archives are currently loaded/loading. self.file_loaded = False self.file_loading = False #: Indicate if files/archives load has failed. self.file_load_failed = False #: None if current file is not an archive, or unrecognized format. self.archive_type = None #: Either path to the current archive, or first file in image list. #: This is B{not} the path to the currently open page. self._current_file = None #: Reference to L{MainWindow}. self._window = window #: Path to opened archive file, or directory containing current images. self._base_path = None #: Temporary directory used for extracting archives. self._tmp_dir = tempfile.mkdtemp(prefix=u'mcomix.', suffix=os.sep) #: If C{True}, no longer wait for files to get extracted. self._stop_waiting = False #: List of comment files inside of the currently opened archive. self._comment_files = [] #: Mapping of absolute paths to archive path names. self._name_table = {} #: Archive extractor. self._extractor = archive_extractor.Extractor() self._extractor.file_extracted += self._extracted_file self._extractor.contents_listed += self._listed_contents #: Condition to wait on when extracting archives and waiting on files. self._condition = None #: Provides a list of available files/archives in the open directory. self._file_provider = None #: Keeps track of the last read page in archives self.last_read_page = last_read_page.LastReadPage( backend.LibraryBackend()) #: Regexp used for determining which archive files are images. self._image_re = constants.SUPPORTED_IMAGE_REGEX #: Regexp used for determining which archive files are comment files. self._comment_re = None self.update_comment_extensions() #: Forces call to window.draw_image (if loading is delayed by user interaction) self._must_call_draw = False self.last_read_page.set_enabled(bool(prefs['store recent file info']))