more robust disposing of database session

avoid spamming the log with debug messages from libraries
This commit is contained in:
Daniel Pavel 2019-07-14 14:43:40 +03:00
parent be64961de5
commit a836df9a5a
7 changed files with 33 additions and 28 deletions

1
.gitignore vendored
View File

@ -14,6 +14,7 @@ build/
*.egg-info/ *.egg-info/
.installed.cfg .installed.cfg
*.egg *.egg
.pylint.d
# calibre-web # calibre-web
*.db *.db

View File

@ -64,6 +64,7 @@ lm.anonymous_user = ub.Anonymous
ub.init_db(cli.settingspath) ub.init_db(cli.settingspath)
# pylint: disable=no-member
config = config_sql.load_configuration(ub.session) config = config_sql.load_configuration(ub.session)
from . import db, services from . import db, services

View File

@ -27,10 +27,6 @@ import base64
import json import json
import time import time
from datetime import datetime, timedelta from datetime import datetime, timedelta
# try:
# from imp import reload
# except ImportError:
# pass
from babel import Locale as LC from babel import Locale as LC
from babel.dates import format_datetime from babel.dates import format_datetime

View File

@ -52,7 +52,7 @@ class _Settings(_Base):
config_random_books = Column(Integer, default=4) config_random_books = Column(Integer, default=4)
config_authors_max = Column(Integer, default=0) config_authors_max = Column(Integer, default=0)
config_read_column = Column(Integer, default=0) config_read_column = Column(Integer, default=0)
config_title_regex = Column(String, default=u'^(A|The|An|Der|Die|Das|Den|Ein|Eine|Einen|Dem|Des|Einem|Eines)\s+') config_title_regex = Column(String, default=r'^(A|The|An|Der|Die|Das|Den|Ein|Eine|Einen|Dem|Des|Einem|Eines)\s+')
config_log_level = Column(SmallInteger, default=logger.DEFAULT_LOG_LEVEL) config_log_level = Column(SmallInteger, default=logger.DEFAULT_LOG_LEVEL)
config_access_log = Column(SmallInteger, default=0) config_access_log = Column(SmallInteger, default=0)
config_uploading = Column(SmallInteger, default=0) config_uploading = Column(SmallInteger, default=0)
@ -106,7 +106,6 @@ class _Settings(_Base):
# Class holds all application specific settings in calibre-web # Class holds all application specific settings in calibre-web
class _ConfigSQL(object): class _ConfigSQL(object):
# pylint: disable=no-member
def __init__(self, session): def __init__(self, session):
self._session = session self._session = session
self._settings = None self._settings = None
@ -226,8 +225,14 @@ class _ConfigSQL(object):
if self.config_google_drive_watch_changes_response: if self.config_google_drive_watch_changes_response:
self.config_google_drive_watch_changes_response = json.loads(self.config_google_drive_watch_changes_response) self.config_google_drive_watch_changes_response = json.loads(self.config_google_drive_watch_changes_response)
self.db_configured = (self.config_calibre_dir and
(not self.config_use_google_drive or os.path.exists(self.config_calibre_dir + '/metadata.db'))) have_metadata_db = bool(self.config_calibre_dir)
if have_metadata_db:
if not self.config_use_google_drive:
db_file = os.path.join(self.config_calibre_dir, 'metadata.db')
have_metadata_db = os.path.isfile(db_file)
self.db_configured = have_metadata_db
logger.setup(self.config_logfile, self.config_log_level) logger.setup(self.config_logfile, self.config_log_level)
def save(self): def save(self):
@ -264,6 +269,7 @@ def _migrate_table(session, orm_class):
log.debug("%s: %s", column_name, err) log.debug("%s: %s", column_name, err)
column_default = "" if column.default is None else ("DEFAULT %r" % column.default.arg) column_default = "" if column.default is None else ("DEFAULT %r" % column.default.arg)
alter_table = "ALTER TABLE %s ADD COLUMN `%s` %s %s" % (orm_class.__tablename__, column_name, column.type, column_default) alter_table = "ALTER TABLE %s ADD COLUMN `%s` %s %s" % (orm_class.__tablename__, column_name, column.type, column_default)
log.debug(alter_table)
session.execute(alter_table) session.execute(alter_table)
changed = True changed = True

View File

@ -407,15 +407,13 @@ def setup_db(config):
def dispose(): def dispose():
global session global session
engine = None old_session = session
if session:
engine = session.bind
try: session.close()
except: pass
session = None session = None
if old_session:
if engine: try: old_session.close()
try: engine.dispose() except: pass
if old_session.bind:
try: old_session.bind.dispose()
except: pass except: pass
for attr in list(Books.__dict__.keys()): for attr in list(Books.__dict__.keys()):

View File

@ -97,15 +97,20 @@ def setup(log_file, log_level=None):
''' '''
log_file = _absolute_log_file(log_file, DEFAULT_LOG_FILE) log_file = _absolute_log_file(log_file, DEFAULT_LOG_FILE)
log_level = log_level or DEFAULT_LOG_LEVEL
logging.getLogger(__package__).setLevel(log_level)
r = logging.root r = logging.root
r.setLevel(log_level or DEFAULT_LOG_LEVEL) if log_level >= logging.INFO or os.environ.get('FLASK_DEBUG'):
# avoid spamming the log with debug messages from libraries
r.setLevel(log_level)
previous_handler = r.handlers[0] if r.handlers else None previous_handler = r.handlers[0] if r.handlers else None
if previous_handler: if previous_handler:
# if the log_file has not changed, don't create a new handler # if the log_file has not changed, don't create a new handler
if getattr(previous_handler, 'baseFilename', None) == log_file: if getattr(previous_handler, 'baseFilename', None) == log_file:
return return
r.debug("logging to %s level %s", log_file, r.level) logging.debug("logging to %s level %s", log_file, r.level)
if log_file == LOG_TO_STDERR: if log_file == LOG_TO_STDERR:
file_handler = StreamHandler() file_handler = StreamHandler()

View File

@ -478,13 +478,11 @@ def init_db(app_db_path):
def dispose(): def dispose():
global session global session
engine = None old_session = session
if session:
engine = session.bind
try: session.close()
except: pass
session = None session = None
if old_session:
if engine: try: old_session.close()
try: engine.dispose() except: pass
if old_session.bind:
try: old_session.bind.dispose()
except: pass except: pass