123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- import sqlite3
- from contextlib import closing
- from time import time
- from typing import Optional, Iterator
- from pycs import app
- from pycs import db
- from pycs.database.Collection import Collection
- from pycs.database.File import File
- from pycs.database.LabelProvider import LabelProvider
- from pycs.database.Model import Model
- from pycs.database.Project import Project
- from pycs.database.Result import Result
- class Database:
- """
- opens an sqlite database and allows to access several objects
- """
- def __init__(self, initialization=True, discovery=True):
- """
- opens or creates a given sqlite database and creates all required tables
- :param path: path to sqlite database
- """
- if discovery:
- # run discovery modules
- Model.discover("models/")
- LabelProvider.discover("labels/")
- def __enter__(self):
- # app.logger.warning("Database.__enter__(): REMOVE ME!")
- return db
- def __exit__(self, exc_type, exc_val, exc_tb):
- # app.logger.warning("Database.__exit__(): REMOVE ME!")
- if exc_type is None:
- db.session.commit()
- else:
- app.logger.info("Rolling back a transaction!")
- db.session.rollback()
- def close(self):
- app.logger.warning("Database.close(): REMOVE ME!")
- def commit(self):
- db.session.commit()
- def copy(self):
- return Database(self.path, initialization=False, discovery=False)
- def models(self) -> Iterator[Model]:
- """
- get a list of all available models
- :return: iterator of models
- """
- return Model.query.all()
- def model(self, identifier: int) -> Optional[Model]:
- """
- get a model using its unique identifier
- :param identifier: unique identifier
- :return: model
- """
- return Model.query.get(identifier)
- def label_providers(self) -> Iterator[LabelProvider]:
- """
- get a list of all available label providers
- :return: iterator over label providers
- """
- return LabelProvider.query.all()
- def label_provider(self, identifier: int) -> Optional[LabelProvider]:
- """
- get a label provider using its unique identifier
- :param identifier: unique identifier
- :return: label provider
- """
- return LabelProvider.query.get(identifier)
- def projects(self) -> Iterator[Project]:
- """
- get a list of all available projects
- :return: iterator over projects
- """
- return Project.query.all()
- def project(self, identifier: int) -> Optional[Project]:
- """
- get a project using its unique identifier
- :param identifier: unique identifier
- :return: project
- """
- return Project.query.get(identifier)
- def collection(self, identifier: int) -> Optional[Collection]:
- """
- get a collection using its unique identifier
- :param identifier: unique identifier
- :return: collection
- """
- return Collection.query.get(identifier)
- def file(self, identifier) -> Optional[File]:
- """
- get a file using its unique identifier
- :param identifier: unique identifier
- :return: file
- """
- return File.query.get(identifier)
- def result(self, identifier) -> Optional[Result]:
- """
- get a result using its unique identifier
- :param identifier: unique identifier
- :return: result
- """
- return Result.query.get(identifier)
- def create_project(self,
- name: str,
- description: str,
- model: Model,
- label_provider: Optional[LabelProvider],
- root_folder: str,
- external_data: bool,
- data_folder: str,
- commit: bool = True):
- """
- insert a project into the database
- :param name: project name
- :param description: project description
- :param model: used model
- :param label_provider: used label provider (optional)
- :param root_folder: path to project folder
- :param external_data: whether an external data directory is used
- :param data_folder: path to data folder
- :return: created project
- """
- # prepare some values
- return Project.new(commit=commit,
- name=name,
- description=description,
- model=model,
- label_provider=label_provider,
- root_folder=root_folder,
- external_data=external_data,
- data_folder=data_folder
- )
|