Add PhotoDB init arg ephemeral
. Uses :memory: sql and tempdir.
Primarily necessitated by unit testing. Running through the DB_INIT is quite slow on disk, so this argument causes the sql to be done on an in-memory database and all the other files are put into a TemporaryDirectory. Eventually I would like to have the other files be in-memory too but that may be overcomplicated and underuseful.
This commit is contained in:
parent
74f4e74bdf
commit
259c9ee1ab
1 changed files with 33 additions and 5 deletions
|
@ -6,6 +6,7 @@ import os
|
|||
import random
|
||||
import sqlite3
|
||||
import string
|
||||
import tempfile
|
||||
import time
|
||||
|
||||
from . import constants
|
||||
|
@ -1092,11 +1093,22 @@ class PhotoDB(PDBAlbumMixin, PDBBookmarkMixin, PDBPhotoMixin, PDBTagMixin, PDBUs
|
|||
def __init__(
|
||||
self,
|
||||
data_directory=None,
|
||||
ephemeral=False,
|
||||
):
|
||||
super().__init__()
|
||||
|
||||
self.ephemeral = ephemeral
|
||||
|
||||
if data_directory is None:
|
||||
data_directory = constants.DEFAULT_DATADIR
|
||||
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 DIR PREP
|
||||
data_directory = helpers.normalize_filepath(data_directory, allowed=':/\\')
|
||||
|
@ -1104,9 +1116,14 @@ class PhotoDB(PDBAlbumMixin, PDBBookmarkMixin, PDBPhotoMixin, PDBTagMixin, PDBUs
|
|||
os.makedirs(self.data_directory.absolute_path, exist_ok=True)
|
||||
|
||||
# DATABASE
|
||||
self.database_file = self.data_directory.with_child(constants.DEFAULT_DBNAME)
|
||||
existing_database = self.database_file.exists
|
||||
self.sql = sqlite3.connect(self.database_file.absolute_path)
|
||||
if self.ephemeral:
|
||||
self.sql = sqlite3.connect(':memory:')
|
||||
existing_database = False
|
||||
else:
|
||||
self.database_file = self.data_directory.with_child(constants.DEFAULT_DBNAME)
|
||||
existing_database = self.database_file.exists
|
||||
self.sql = sqlite3.connect(self.database_file.absolute_path)
|
||||
|
||||
self.cur = self.sql.cursor()
|
||||
|
||||
if existing_database:
|
||||
|
@ -1159,12 +1176,23 @@ class PhotoDB(PDBAlbumMixin, PDBBookmarkMixin, PDBPhotoMixin, PDBTagMixin, PDBUs
|
|||
'user': self._user_cache,
|
||||
}
|
||||
|
||||
def __del__(self):
|
||||
self.close()
|
||||
|
||||
def __repr__(self):
|
||||
return 'PhotoDB(data_directory={datadir})'.format(datadir=repr(self.data_directory))
|
||||
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 close(self):
|
||||
self.sql.close()
|
||||
if self.ephemeral:
|
||||
self.ephemeral_directory.cleanup()
|
||||
|
||||
def commit(self):
|
||||
while self.on_commit_queue:
|
||||
task = self.on_commit_queue.pop()
|
||||
|
|
Loading…
Reference in a new issue