diff --git a/cps/db.py b/cps/db.py index 520d724b..491e95b3 100644 --- a/cps/db.py +++ b/cps/db.py @@ -426,18 +426,19 @@ class CalibreDB(): # instances alive once they reach the end of their respective scopes instances = WeakSet() - def __init__(self): + def __init__(self, expire_on_commit=False): """ Initialize a new CalibreDB session """ self.session = None if self._init: - self.initSession() + self.initSession(expire_on_commit) self.instances.add(self) - def initSession(self): + def initSession(self, expire_on_commit): self.session = self.session_factory() + self.session.expire_on_commit = expire_on_commit self.update_title_sort(self.config) @classmethod diff --git a/cps/tasks/convert.py b/cps/tasks/convert.py index 659c6e9c..f9d6dd2a 100644 --- a/cps/tasks/convert.py +++ b/cps/tasks/convert.py @@ -9,7 +9,7 @@ from shutil import copyfile from sqlalchemy.exc import SQLAlchemyError from cps.services.worker import CalibreTask -from cps import calibre_db, db +from cps import db from cps import logger, config from cps.subproc_wrapper import process_open from flask_babel import gettext as _ @@ -33,8 +33,10 @@ class TaskConvert(CalibreTask): def run(self, worker_thread): self.worker_thread = worker_thread if config.config_use_google_drive: - cur_book = calibre_db.get_book(self.bookid) - data = calibre_db.get_book_format(self.bookid, self.settings['old_book_format']) + worker_db = db.CalibreDB() + cur_book = worker_db.get_book(self.bookid) + data = worker_db.get_book_format(self.bookid, self.settings['old_book_format']) + worker_db.session.close() df = gdriveutils.getFileFromEbooksFolder(cur_book.path, data.name + "." + self.settings['old_book_format'].lower()) if df: @@ -71,7 +73,7 @@ class TaskConvert(CalibreTask): def _convert_ebook_format(self): error_message = None - local_session = db.CalibreDB().session + local_db = db.CalibreDB() file_path = self.file_path book_id = self.bookid format_old_ext = u'.' + self.settings['old_book_format'].lower() @@ -82,10 +84,11 @@ class TaskConvert(CalibreTask): # this will allow send to kindle workflow to continue to work if os.path.isfile(file_path + format_new_ext): log.info("Book id %d already converted to %s", book_id, format_new_ext) - cur_book = calibre_db.get_book(book_id) + cur_book = local_db.session.get_book(book_id) self.results['path'] = file_path self.results['title'] = cur_book.title self._handleSuccess() + local_db.session.close() return os.path.basename(file_path + format_new_ext) else: log.info("Book id %d - target format of %s does not exist. Moving forward with convert.", @@ -105,18 +108,19 @@ class TaskConvert(CalibreTask): check, error_message = self._convert_calibre(file_path, format_old_ext, format_new_ext) if check == 0: - cur_book = calibre_db.get_book(book_id) + cur_book = local_db.get_book(book_id) if os.path.isfile(file_path + format_new_ext): # self.db_queue.join() new_format = db.Data(name=cur_book.data[0].name, book_format=self.settings['new_book_format'].upper(), book=book_id, uncompressed_size=os.path.getsize(file_path + format_new_ext)) try: - local_session.merge(new_format) - local_session.commit() + local_db.session.merge(new_format) + local_db.session.commit() except SQLAlchemyError as e: - local_session.rollback() + local_db.rollback() log.error("Database error: %s", e) + local_db.session.close() return self.results['path'] = cur_book.path self.results['title'] = cur_book.title @@ -125,6 +129,7 @@ class TaskConvert(CalibreTask): return os.path.basename(file_path + format_new_ext) else: error_message = _('%(format)s format not found on disk', format=format_new_ext.upper()) + local_db.session.close() log.info("ebook converter failed with error while converting book") if not error_message: error_message = _('Ebook converter failed with unknown error')