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 random
|
||||||
import sqlite3
|
import sqlite3
|
||||||
import string
|
import string
|
||||||
|
import tempfile
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from . import constants
|
from . import constants
|
||||||
|
@ -1092,11 +1093,22 @@ class PhotoDB(PDBAlbumMixin, PDBBookmarkMixin, PDBPhotoMixin, PDBTagMixin, PDBUs
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
data_directory=None,
|
data_directory=None,
|
||||||
|
ephemeral=False,
|
||||||
):
|
):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
|
self.ephemeral = ephemeral
|
||||||
|
|
||||||
if data_directory is None:
|
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
|
data_directory = constants.DEFAULT_DATADIR
|
||||||
|
elif self.ephemeral:
|
||||||
|
raise exceptions.NotExclusive(['data_directory', 'ephemeral'])
|
||||||
|
|
||||||
# DATA DIR PREP
|
# DATA DIR PREP
|
||||||
data_directory = helpers.normalize_filepath(data_directory, allowed=':/\\')
|
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)
|
os.makedirs(self.data_directory.absolute_path, exist_ok=True)
|
||||||
|
|
||||||
# DATABASE
|
# DATABASE
|
||||||
|
if self.ephemeral:
|
||||||
|
self.sql = sqlite3.connect(':memory:')
|
||||||
|
existing_database = False
|
||||||
|
else:
|
||||||
self.database_file = self.data_directory.with_child(constants.DEFAULT_DBNAME)
|
self.database_file = self.data_directory.with_child(constants.DEFAULT_DBNAME)
|
||||||
existing_database = self.database_file.exists
|
existing_database = self.database_file.exists
|
||||||
self.sql = sqlite3.connect(self.database_file.absolute_path)
|
self.sql = sqlite3.connect(self.database_file.absolute_path)
|
||||||
|
|
||||||
self.cur = self.sql.cursor()
|
self.cur = self.sql.cursor()
|
||||||
|
|
||||||
if existing_database:
|
if existing_database:
|
||||||
|
@ -1159,12 +1176,23 @@ class PhotoDB(PDBAlbumMixin, PDBBookmarkMixin, PDBPhotoMixin, PDBTagMixin, PDBUs
|
||||||
'user': self._user_cache,
|
'user': self._user_cache,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
self.close()
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
|
if self.ephemeral:
|
||||||
|
return 'PhotoDB(ephemeral=True)'
|
||||||
|
else:
|
||||||
return 'PhotoDB(data_directory={datadir})'.format(datadir=repr(self.data_directory))
|
return 'PhotoDB(data_directory={datadir})'.format(datadir=repr(self.data_directory))
|
||||||
|
|
||||||
def _uncache(self):
|
def _uncache(self):
|
||||||
self._cached_frozen_children = None
|
self._cached_frozen_children = None
|
||||||
|
|
||||||
|
def close(self):
|
||||||
|
self.sql.close()
|
||||||
|
if self.ephemeral:
|
||||||
|
self.ephemeral_directory.cleanup()
|
||||||
|
|
||||||
def commit(self):
|
def commit(self):
|
||||||
while self.on_commit_queue:
|
while self.on_commit_queue:
|
||||||
task = self.on_commit_queue.pop()
|
task = self.on_commit_queue.pop()
|
||||||
|
|
Loading…
Reference in a new issue