1
0
mirror of https://github.com/enpaul/kodak.git synced 2024-11-10 16:46:53 +00:00

Add initial database schema and infrastructure components

This commit is contained in:
Ethan Paul 2020-09-21 23:10:18 -04:00
parent 474d846f47
commit e265dda12d
No known key found for this signature in database
GPG Key ID: C5F5542B54A4D9C6
4 changed files with 114 additions and 0 deletions

View File

@ -0,0 +1,58 @@
import logging
from typing import Tuple
import peewee
from imagemonk import constants
from imagemonk.configuration import ImageMonkConfig
from imagemonk.database._shared import ImageMonkModel
from imagemonk.database._shared import INTERFACE as interface
from imagemonk.database.image import ImageRecord
from imagemonk.database.thumbnail import ThumbnailRecord
MODELS: Tuple[ImageMonkModel, ...] = (ImageRecord, ThumbnailRecord)
def initialize(config: ImageMonkConfig):
"""Initialize the database interface
Defining the database as an
`unconfigured proxy object <http://docs.peewee-orm.com/en/latest/peewee/database.html#setting-the-database-at-run-time>`_
allows it to be configured at runtime based on the config values.
:param config: Populated configuration container object
"""
logger = logging.getLogger(__name__)
if config.database.backend == constants.SupportedDatabaseBackend.SQLITE:
logger.debug("Using SQLite database backend")
logger.debug(f"Applying SQLite pragmas: {config.database.sqlite.pragmas}")
database = peewee.SqliteDatabase(
config.database.sqlite.path, pragmas=config.database.sqlite.pragmas
)
elif config.database.backend == constants.SupportedDatabaseBackend.MARIADB:
logger.debug("Using MariaDB database backend")
logger.debug(
"Configuring MariaDB:"
f" {config.database.mariadb.username}@{config.database.mariadb.hostname}:{config.database.mariadb.port},"
f" with database '{config.database.mariadb.schema}'"
)
database = peewee.MySQLDatabase(
config.database.mariadb.schema,
host=config.database.mariadb.hostname,
port=config.database.mariadb.port,
user=config.database.mariadb.username,
password=config.database.mariadb.password,
charset="utf8mb4",
)
else:
raise ValueError(
f"Invalid storage backend in configuration: {config.database.backend}"
)
interface.initialize(database)
with interface.atomic():
interface.create_tables(MODELS)

View File

@ -0,0 +1,15 @@
import datetime
import uuid
import peewee
INTERFACE = peewee.DatabaseProxy()
class ImageMonkModel(peewee.Model):
class Meta: # pylint: disable=too-few-public-methods,missing-class-docstring
database = INTERFACE
uuid = peewee.UUIDField(null=False, unique=True, default=uuid.uuid4)
created = peewee.DateTimeField(null=False, default=datetime.datetime.utcnow)

View File

@ -0,0 +1,30 @@
import json
import uuid
from typing import List
import peewee
from imagemonk.database._shared import ImageMonkModel
class ImageRecord(ImageMonkModel):
"""Database record for"""
width = peewee.IntegerField(null=False)
height = peewee.IntegerField(null=False)
format = peewee.CharField(null=False)
deleted = peewee.BooleanField(null=False, default=False)
public = peewee.BooleanField(null=False, default=False)
owner = peewee.UUIDField(null=False)
sha256 = peewee.CharField(null=False)
_readable = peewee.CharField(null=False, default="[]")
@property
def readable(self) -> List[uuid.UUID]:
"""List of UUIDs corresponding to accounts that can read the file"""
return [uuid.UUID(item) for item in json.loads(self._readable)]
@readable.setter
def readable(self, value: List[uuid.UUID]):
"""Update the list of UUIDs for accounts that can read the file"""
self._readable = json.dumps([str(item) for item in value])

View File

@ -0,0 +1,11 @@
import peewee
from imagemonk.database._shared import ImageMonkModel
from imagemonk.database.image import ImageRecord
class ThumbnailRecord(ImageMonkModel):
parent = peewee.ForeignKeyField(ImageRecord)
width = peewee.IntegerField(null=False)
height = peewee.IntegerField(null=False)