Implemented metadatadb as a context object instead of a class.

dev
Emily Frost 6 years ago
parent 14f9966771
commit 7b59f60290
No known key found for this signature in database
GPG Key ID: FD1FA524668FB1FA

20
lark

@ -91,7 +91,7 @@ def _kwargs_parse(kwargs_list):
action_object = sys.argv[1] action_object = sys.argv[1]
action = sys.argv[2] action = sys.argv[2]
db = metadatadb.MetadataDB(os.path.join(data_path, SQLITE_FILENAME)) metadatadb.configure(os.path.join(data_path, SQLITE_FILENAME))
# TODO: Use a real UI library. This mess is just intended for development. # TODO: Use a real UI library. This mess is just intended for development.
if action_object == 'platform': if action_object == 'platform':
@ -102,21 +102,25 @@ if action_object == 'platform':
platform_data = metadatadb.Platform(shortcode=platform_shortcode, platform_data = metadatadb.Platform(shortcode=platform_shortcode,
fullname=platform_name) fullname=platform_name)
db.add_platform(platform_data) with metadatadb.get_db_session() as session:
session.add(platform_data)
elif action == 'list': elif action == 'list':
# TODO: Filter support is exclusively limited to SQLAlchemy's filter.ilike function. Figure # TODO: Filter support is exclusively limited to SQLAlchemy's filter.ilike function. Figure
# out a good way to include other filters. # out a good way to include other filters.
filters = _kwargs_parse(sys.argv[3:]) filters = _kwargs_parse(sys.argv[3:])
platform_results = db.search_platforms(**filters) with metadatadb.get_db_session() as session:
print(platform_results) print(metadatadb.search(session, metadatadb.Platform, **filters))
elif action == 'remove': elif action == 'remove':
constraints = sys.argv[3:] constraints = sys.argv[3:]
platforms = db.search_platforms(constraints) filters = _kwargs_parse(sys.argv[3:])
with metadatadb.get_db_session() as session:
platforms = metadatadb.search(session, metadatadb.Platform, **filters)
for platform in platforms: for platform in platforms:
print('Removing %s.' % platform.fullname) print('Removing %s.' % platform.fullname)
db.remove_platform(platform) session.delete(platform)
elif action == 'test': elif action == 'test':
# TODO: Delete this action before merging into dev. It's just for ugly testing. # TODO: Delete this action before merging into dev. It's just for ugly testing.
@ -126,7 +130,7 @@ if action_object == 'platform':
platform_data = metadatadb.Platform(shortcode=platform_shortcode, platform_data = metadatadb.Platform(shortcode=platform_shortcode,
fullname=platform_name) fullname=platform_name)
#db.add_platform(platform_data) with metadatadb.get_db_session() as session:
print(db.search_platforms()) print(metadatadb.search(session, metadatadb.Platform))
else: else:
print('Unknown object.') print('Unknown object.')

@ -1,10 +1,9 @@
''' '''
metadatadb.py metadatadb.py
''' '''
import contextlib
import collections import collections
import dataclasses
import hashlib import hashlib
import sqlite3
import uuid import uuid
import sqlalchemy import sqlalchemy
@ -14,6 +13,7 @@ import sqlalchemy.orm
# TODO: l o g g i n g # TODO: l o g g i n g
HASH_CHUNK_SIZE = 10485760 # 10mb HASH_CHUNK_SIZE = 10485760 # 10mb
_db_session_maker = sqlalchemy.orm.sessionmaker() _db_session_maker = sqlalchemy.orm.sessionmaker()
_engine = None
ImageData = collections.namedtuple('ImageData', 'UUID, sha1sum, filename, release_group') ImageData = collections.namedtuple('ImageData', 'UUID, sha1sum, filename, release_group')
ReleaseGroupData = collections.namedtuple('ReleaseGroupData', 'UUID, name, platform') ReleaseGroupData = collections.namedtuple('ReleaseGroupData', 'UUID, name, platform')
@ -49,72 +49,34 @@ def get_file_sha1sum(filename):
return sha1sum.hexdigest() return sha1sum.hexdigest()
class MetadataDB: def configure(db_path):
def __init__(self, db_path): _engine = sqlalchemy.create_engine('sqlite:///%s' % db_path)
'''
If db file does not exist, create it and create necessary tables.
Either way, create a connection object.
'''
# TODO: This process needs real error handling.
# TODO: Add DAT import/credit support.
self._engine = sqlalchemy.create_engine('sqlite:///%s' % db_path)
_SQLBase.metadata.create_all(self._engine) _SQLBase.metadata.create_all(_engine)
_db_session_maker.configure(bind=self._engine) _db_session_maker.configure(bind=_engine)
# TODO: Using One Big Session may have unintended consequences in other, less linear
# applications. For now, it works.
self._session = _db_session_maker()
def add_image(self, image_data): def search(session, table_object, inclusive=True, **constraints):
pass query = session.query(table_object)
def update_image(self, image_data):
pass
def remove_image(self, image_data):
pass
def add_release_group(self, release_group_data):
pass
def update_release_group(self, release_group_data):
pass
def remove_release_group(self, release_group_data):
pass
def add_platform(self, platform):
''' Add a platform shortcode to the database. '''
self._session.add(platform)
self._session.commit()
def update_platform(self, platform):
pass
def remove_platform(self, platform):
'''Remove a specific platform from the database. '''
self._session.delete(platform)
self._session.commit()
def search_platforms(self, inclusive=True, **constraints):
'''Search for platforms, given the parameters. '''
query = self._session.query(Platform)
for key, value in constraints.items(): for key, value in constraints.items():
query = query.filter(getattr(Platform, key).ilike('%%%s%%' % value)) query = query.filter(getattr(table_object, key).ilike('%%%s%%' % value))
platform_list = [] item_list = []
for platform in query: for item in query:
platform_list.append(platform) item_list.append(item)
return platform_list return item_list
def add_dat(self, dat_data): @contextlib.contextmanager
pass def get_db_session():
session = _db_session_maker()
def update_dat(self, dat_data): try:
pass yield session
def remove_dat(self, dat_data): except:
pass session.rollback()
raise
else:
session.commit()
finally:
session.close()

Loading…
Cancel
Save