You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Lark/metadatadb.py

83 lines
2.3 KiB
Python

'''
metadatadb.py
'''
import contextlib
import collections
import hashlib
import uuid
import sqlalchemy
import sqlalchemy.ext.declarative
import sqlalchemy.orm
# TODO: l o g g i n g
HASH_CHUNK_SIZE = 10485760 # 10mb
_db_session_maker = sqlalchemy.orm.sessionmaker()
_engine = None
ImageData = collections.namedtuple('ImageData', 'UUID, sha1sum, filename, release_group')
ReleaseGroupData = collections.namedtuple('ReleaseGroupData', 'UUID, name, platform')
DatData = collections.namedtuple('DatData', 'UUID, name, website, version, image_list')
def _uuidgen():
return str(uuid.uuid4())
_SQLBase = sqlalchemy.ext.declarative.declarative_base()
class Platform(_SQLBase):
__tablename__ = 'platforms'
id = sqlalchemy.Column(sqlalchemy.Integer, sqlalchemy.Sequence('platform_id_sequence'),
primary_key=True)
uuid = sqlalchemy.Column(sqlalchemy.String, nullable=False, default=_uuidgen)
fullname = sqlalchemy.Column(sqlalchemy.String, nullable=False)
shortcode = sqlalchemy.Column(sqlalchemy.String, unique=True, nullable=False)
def __repr__(self):
return 'Platform: id: %s, uuid: %s, fullname: %s, shortcode: %s' % (self.id, self.uuid,
self.fullname, self.shortcode)
# TODO: This should go in the eventual romdb class.
def get_file_sha1sum(filename):
sha1sum = hashlib.sha1()
with open(filename, 'rb') as file_contents:
while True:
chunk = file_contents.read(HASH_CHUNK_SIZE)
if not chunk:
break
sha1sum.update(chunk)
return sha1sum.hexdigest()
def configure(db_path):
_engine = sqlalchemy.create_engine('sqlite:///%s' % db_path)
_SQLBase.metadata.create_all(_engine)
_db_session_maker.configure(bind=_engine)
def search(session, table_object, inclusive=True, **constraints):
query = session.query(table_object)
for key, value in constraints.items():
query = query.filter(getattr(table_object, key).ilike('%%%s%%' % value))
item_list = []
for item in query:
item_list.append(item)
return item_list
@contextlib.contextmanager
def get_db_session():
session = _db_session_maker()
try:
yield session
except:
session.rollback()
raise
else:
session.commit()
finally:
session.close()