Database.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. import sqlite3
  2. from contextlib import closing
  3. from time import time
  4. from typing import Optional, Iterator
  5. from pycs import app
  6. from pycs import db
  7. from pycs.database.Collection import Collection
  8. from pycs.database.File import File
  9. from pycs.database.LabelProvider import LabelProvider
  10. from pycs.database.Model import Model
  11. from pycs.database.Project import Project
  12. from pycs.database.Result import Result
  13. class Database:
  14. """
  15. opens an sqlite database and allows to access several objects
  16. """
  17. def __init__(self, initialization=True, discovery=True):
  18. """
  19. opens or creates a given sqlite database and creates all required tables
  20. :param path: path to sqlite database
  21. """
  22. if discovery:
  23. # run discovery modules
  24. Model.discover("models/")
  25. LabelProvider.discover("labels/")
  26. def __enter__(self):
  27. # app.logger.warning("Database.__enter__(): REMOVE ME!")
  28. return db
  29. def __exit__(self, exc_type, exc_val, exc_tb):
  30. # app.logger.warning("Database.__exit__(): REMOVE ME!")
  31. if exc_type is None:
  32. db.session.commit()
  33. else:
  34. app.logger.error("Rolling back a transaction!")
  35. db.session.rollback()
  36. def close(self):
  37. app.logger.warning("Database.close(): REMOVE ME!")
  38. def commit(self):
  39. """
  40. commit changes
  41. """
  42. db.session.commit()
  43. def copy(self):
  44. return Database(initialization=False, discovery=False)
  45. def models(self) -> Iterator[Model]:
  46. """
  47. get a list of all available models
  48. :return: iterator of models
  49. """
  50. return Model.query.all()
  51. def model(self, identifier: int) -> Optional[Model]:
  52. """
  53. get a model using its unique identifier
  54. :param identifier: unique identifier
  55. :return: model
  56. """
  57. return Model.query.get(identifier)
  58. def label_providers(self) -> Iterator[LabelProvider]:
  59. """
  60. get a list of all available label providers
  61. :return: iterator over label providers
  62. """
  63. return LabelProvider.query.all()
  64. def label_provider(self, identifier: int) -> Optional[LabelProvider]:
  65. """
  66. get a label provider using its unique identifier
  67. :param identifier: unique identifier
  68. :return: label provider
  69. """
  70. return LabelProvider.query.get(identifier)
  71. def projects(self) -> Iterator[Project]:
  72. """
  73. get a list of all available projects
  74. :return: iterator over projects
  75. """
  76. return Project.query.all()
  77. def project(self, identifier: int) -> Optional[Project]:
  78. """
  79. get a project using its unique identifier
  80. :param identifier: unique identifier
  81. :return: project
  82. """
  83. return Project.query.get(identifier)
  84. def collection(self, identifier: int) -> Optional[Collection]:
  85. """
  86. get a collection using its unique identifier
  87. :param identifier: unique identifier
  88. :return: collection
  89. """
  90. return Collection.query.get(identifier)
  91. def file(self, identifier) -> Optional[File]:
  92. """
  93. get a file using its unique identifier
  94. :param identifier: unique identifier
  95. :return: file
  96. """
  97. return File.query.get(identifier)
  98. def result(self, identifier) -> Optional[Result]:
  99. """
  100. get a result using its unique identifier
  101. :param identifier: unique identifier
  102. :return: result
  103. """
  104. return Result.query.get(identifier)
  105. def create_project(self,
  106. name: str,
  107. description: str,
  108. model: Model,
  109. label_provider: Optional[LabelProvider],
  110. root_folder: str,
  111. external_data: bool,
  112. data_folder: str,
  113. commit: bool = True):
  114. """
  115. insert a project into the database
  116. :param name: project name
  117. :param description: project description
  118. :param model: used model
  119. :param label_provider: used label provider (optional)
  120. :param root_folder: path to project folder
  121. :param external_data: whether an external data directory is used
  122. :param data_folder: path to data folder
  123. :return: created project
  124. """
  125. # prepare some values
  126. return Project.new(
  127. commit=commit,
  128. name=name,
  129. description=description,
  130. model=model,
  131. label_provider=label_provider,
  132. root_folder=root_folder,
  133. external_data=external_data,
  134. data_folder=data_folder
  135. )