Move digest_directory and easybake to Util mixin.
This commit is contained in:
parent
87886a0a13
commit
c4d0de7f97
1 changed files with 125 additions and 119 deletions
|
@ -1064,127 +1064,10 @@ class PDBUserMixin:
|
||||||
return objects.User(self, data)
|
return objects.User(self, data)
|
||||||
|
|
||||||
|
|
||||||
class PhotoDB(
|
class PDBUtilMixin:
|
||||||
PDBAlbumMixin,
|
def __init__(self):
|
||||||
PDBBookmarkMixin,
|
|
||||||
PDBPhotoMixin,
|
|
||||||
PDBSQLMixin,
|
|
||||||
PDBTagMixin,
|
|
||||||
PDBUserMixin,
|
|
||||||
):
|
|
||||||
def __init__(
|
|
||||||
self,
|
|
||||||
data_directory=None,
|
|
||||||
*,
|
|
||||||
create=True,
|
|
||||||
ephemeral=False,
|
|
||||||
skip_version_check=False,
|
|
||||||
):
|
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
self.ephemeral = ephemeral
|
|
||||||
|
|
||||||
# DATA DIR PREP
|
|
||||||
if data_directory is None:
|
|
||||||
if self.ephemeral:
|
|
||||||
# In addition to the data_dir as a pathclass object, keep the
|
|
||||||
# TempDir object so we can use the cleanup method later.
|
|
||||||
self.ephemeral_directory = tempfile.TemporaryDirectory(prefix='etiquette_ephem_')
|
|
||||||
data_directory = self.ephemeral_directory.name
|
|
||||||
else:
|
|
||||||
data_directory = constants.DEFAULT_DATADIR
|
|
||||||
elif self.ephemeral:
|
|
||||||
raise exceptions.NotExclusive(['data_directory', 'ephemeral'])
|
|
||||||
|
|
||||||
data_directory = helpers.remove_path_badchars(data_directory, allowed=':/\\')
|
|
||||||
self.data_directory = pathclass.Path(data_directory)
|
|
||||||
|
|
||||||
if self.data_directory.exists and not self.data_directory.is_dir:
|
|
||||||
raise exceptions.BadDataDirectory(self.data_directory.absolute_path)
|
|
||||||
|
|
||||||
self.log = logging.getLogger('etiquette:%s' % self.data_directory.absolute_path)
|
|
||||||
self.log.setLevel(logging.DEBUG)
|
|
||||||
|
|
||||||
# DATABASE
|
|
||||||
if self.ephemeral:
|
|
||||||
self.sql = sqlite3.connect(':memory:')
|
|
||||||
existing_database = False
|
|
||||||
else:
|
|
||||||
self.database_filepath = self.data_directory.with_child(constants.DEFAULT_DBNAME)
|
|
||||||
existing_database = self.database_filepath.exists
|
|
||||||
|
|
||||||
if not create and not self.ephemeral and not existing_database:
|
|
||||||
raise FileNotFoundError('"%s" does not exist and create is off.' % self.data_directory)
|
|
||||||
|
|
||||||
if not self.ephemeral:
|
|
||||||
os.makedirs(self.data_directory.absolute_path, exist_ok=True)
|
|
||||||
self.sql = sqlite3.connect(self.database_filepath.absolute_path)
|
|
||||||
|
|
||||||
if existing_database:
|
|
||||||
if not skip_version_check:
|
|
||||||
self._check_version()
|
|
||||||
else:
|
|
||||||
self._first_time_setup()
|
|
||||||
|
|
||||||
# THUMBNAIL DIRECTORY
|
|
||||||
self.thumbnail_directory = self.data_directory.with_child(constants.DEFAULT_THUMBDIR)
|
|
||||||
os.makedirs(self.thumbnail_directory.absolute_path, exist_ok=True)
|
|
||||||
|
|
||||||
# CONFIG
|
|
||||||
self.config_filepath = self.data_directory.with_child(constants.DEFAULT_CONFIGNAME)
|
|
||||||
self.config = self.load_config()
|
|
||||||
self.log.setLevel(self.config['log_level'])
|
|
||||||
|
|
||||||
# OTHER
|
|
||||||
|
|
||||||
self._cached_frozen_children = None
|
|
||||||
|
|
||||||
self._album_cache.maxlen = self.config['cache_size']['album']
|
|
||||||
self._bookmark_cache.maxlen = self.config['cache_size']['bookmark']
|
|
||||||
self._photo_cache.maxlen = self.config['cache_size']['photo']
|
|
||||||
self._tag_cache.maxlen = self.config['cache_size']['tag']
|
|
||||||
self._user_cache.maxlen = self.config['cache_size']['user']
|
|
||||||
self.caches = {
|
|
||||||
'album': self._album_cache,
|
|
||||||
'bookmark': self._bookmark_cache,
|
|
||||||
'photo': self._photo_cache,
|
|
||||||
'tag': self._tag_cache,
|
|
||||||
'user': self._user_cache,
|
|
||||||
}
|
|
||||||
|
|
||||||
def _check_version(self):
|
|
||||||
cur = self.sql.cursor()
|
|
||||||
|
|
||||||
cur.execute('PRAGMA user_version')
|
|
||||||
existing_version = cur.fetchone()[0]
|
|
||||||
if existing_version != constants.DATABASE_VERSION:
|
|
||||||
exc = exceptions.DatabaseOutOfDate(
|
|
||||||
current=existing_version,
|
|
||||||
new=constants.DATABASE_VERSION,
|
|
||||||
)
|
|
||||||
raise exc
|
|
||||||
|
|
||||||
def _first_time_setup(self):
|
|
||||||
self.log.debug('Running first-time setup.')
|
|
||||||
cur = self.sql.cursor()
|
|
||||||
|
|
||||||
statements = constants.DB_INIT.split(';')
|
|
||||||
for statement in statements:
|
|
||||||
cur.execute(statement)
|
|
||||||
self.sql.commit()
|
|
||||||
|
|
||||||
def __del__(self):
|
|
||||||
self.close()
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
if self.ephemeral:
|
|
||||||
return 'PhotoDB(ephemeral=True)'
|
|
||||||
else:
|
|
||||||
return 'PhotoDB(data_directory={datadir})'.format(datadir=repr(self.data_directory))
|
|
||||||
|
|
||||||
def _uncache(self):
|
|
||||||
self._cached_frozen_children = None
|
|
||||||
|
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
def digest_directory(
|
def digest_directory(
|
||||||
self,
|
self,
|
||||||
|
@ -1382,6 +1265,129 @@ class PhotoDB(
|
||||||
output_notes.append(note)
|
output_notes.append(note)
|
||||||
return output_notes
|
return output_notes
|
||||||
|
|
||||||
|
|
||||||
|
class PhotoDB(
|
||||||
|
PDBAlbumMixin,
|
||||||
|
PDBBookmarkMixin,
|
||||||
|
PDBPhotoMixin,
|
||||||
|
PDBSQLMixin,
|
||||||
|
PDBTagMixin,
|
||||||
|
PDBUserMixin,
|
||||||
|
PDBUtilMixin,
|
||||||
|
):
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
data_directory=None,
|
||||||
|
*,
|
||||||
|
create=True,
|
||||||
|
ephemeral=False,
|
||||||
|
skip_version_check=False,
|
||||||
|
):
|
||||||
|
super().__init__()
|
||||||
|
|
||||||
|
self.ephemeral = ephemeral
|
||||||
|
|
||||||
|
# DATA DIR PREP
|
||||||
|
if data_directory is None:
|
||||||
|
if self.ephemeral:
|
||||||
|
# In addition to the data_dir as a pathclass object, keep the
|
||||||
|
# TempDir object so we can use the cleanup method later.
|
||||||
|
self.ephemeral_directory = tempfile.TemporaryDirectory(prefix='etiquette_ephem_')
|
||||||
|
data_directory = self.ephemeral_directory.name
|
||||||
|
else:
|
||||||
|
data_directory = constants.DEFAULT_DATADIR
|
||||||
|
elif self.ephemeral:
|
||||||
|
raise exceptions.NotExclusive(['data_directory', 'ephemeral'])
|
||||||
|
|
||||||
|
data_directory = helpers.remove_path_badchars(data_directory, allowed=':/\\')
|
||||||
|
self.data_directory = pathclass.Path(data_directory)
|
||||||
|
|
||||||
|
if self.data_directory.exists and not self.data_directory.is_dir:
|
||||||
|
raise exceptions.BadDataDirectory(self.data_directory.absolute_path)
|
||||||
|
|
||||||
|
self.log = logging.getLogger('etiquette:%s' % self.data_directory.absolute_path)
|
||||||
|
self.log.setLevel(logging.DEBUG)
|
||||||
|
|
||||||
|
# DATABASE
|
||||||
|
if self.ephemeral:
|
||||||
|
self.sql = sqlite3.connect(':memory:')
|
||||||
|
existing_database = False
|
||||||
|
else:
|
||||||
|
self.database_filepath = self.data_directory.with_child(constants.DEFAULT_DBNAME)
|
||||||
|
existing_database = self.database_filepath.exists
|
||||||
|
|
||||||
|
if not create and not self.ephemeral and not existing_database:
|
||||||
|
raise FileNotFoundError('"%s" does not exist and create is off.' % self.data_directory)
|
||||||
|
|
||||||
|
if not self.ephemeral:
|
||||||
|
os.makedirs(self.data_directory.absolute_path, exist_ok=True)
|
||||||
|
self.sql = sqlite3.connect(self.database_filepath.absolute_path)
|
||||||
|
|
||||||
|
if existing_database:
|
||||||
|
if not skip_version_check:
|
||||||
|
self._check_version()
|
||||||
|
else:
|
||||||
|
self._first_time_setup()
|
||||||
|
|
||||||
|
# THUMBNAIL DIRECTORY
|
||||||
|
self.thumbnail_directory = self.data_directory.with_child(constants.DEFAULT_THUMBDIR)
|
||||||
|
os.makedirs(self.thumbnail_directory.absolute_path, exist_ok=True)
|
||||||
|
|
||||||
|
# CONFIG
|
||||||
|
self.config_filepath = self.data_directory.with_child(constants.DEFAULT_CONFIGNAME)
|
||||||
|
self.config = self.load_config()
|
||||||
|
self.log.setLevel(self.config['log_level'])
|
||||||
|
|
||||||
|
# OTHER
|
||||||
|
|
||||||
|
self._cached_frozen_children = None
|
||||||
|
|
||||||
|
self._album_cache.maxlen = self.config['cache_size']['album']
|
||||||
|
self._bookmark_cache.maxlen = self.config['cache_size']['bookmark']
|
||||||
|
self._photo_cache.maxlen = self.config['cache_size']['photo']
|
||||||
|
self._tag_cache.maxlen = self.config['cache_size']['tag']
|
||||||
|
self._user_cache.maxlen = self.config['cache_size']['user']
|
||||||
|
self.caches = {
|
||||||
|
'album': self._album_cache,
|
||||||
|
'bookmark': self._bookmark_cache,
|
||||||
|
'photo': self._photo_cache,
|
||||||
|
'tag': self._tag_cache,
|
||||||
|
'user': self._user_cache,
|
||||||
|
}
|
||||||
|
|
||||||
|
def _check_version(self):
|
||||||
|
cur = self.sql.cursor()
|
||||||
|
|
||||||
|
cur.execute('PRAGMA user_version')
|
||||||
|
existing_version = cur.fetchone()[0]
|
||||||
|
if existing_version != constants.DATABASE_VERSION:
|
||||||
|
exc = exceptions.DatabaseOutOfDate(
|
||||||
|
current=existing_version,
|
||||||
|
new=constants.DATABASE_VERSION,
|
||||||
|
)
|
||||||
|
raise exc
|
||||||
|
|
||||||
|
def _first_time_setup(self):
|
||||||
|
self.log.debug('Running first-time setup.')
|
||||||
|
cur = self.sql.cursor()
|
||||||
|
|
||||||
|
statements = constants.DB_INIT.split(';')
|
||||||
|
for statement in statements:
|
||||||
|
cur.execute(statement)
|
||||||
|
self.sql.commit()
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
self.close()
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
if self.ephemeral:
|
||||||
|
return 'PhotoDB(ephemeral=True)'
|
||||||
|
else:
|
||||||
|
return 'PhotoDB(data_directory={datadir})'.format(datadir=repr(self.data_directory))
|
||||||
|
|
||||||
|
def _uncache(self):
|
||||||
|
self._cached_frozen_children = None
|
||||||
|
|
||||||
def generate_id(self, table):
|
def generate_id(self, table):
|
||||||
'''
|
'''
|
||||||
Create a new ID number that is unique to the given table.
|
Create a new ID number that is unique to the given table.
|
||||||
|
|
Loading…
Reference in a new issue