|
@@ -18,7 +18,7 @@ class Database:
|
|
|
opens an sqlite database and allows to access several objects
|
|
|
"""
|
|
|
|
|
|
- def __init__(self, path: str = ':memory:', discovery=True):
|
|
|
+ def __init__(self, path: str = ':memory:', initialization=True, discovery=True):
|
|
|
"""
|
|
|
opens or creates a given sqlite database and creates all required tables
|
|
|
|
|
@@ -31,111 +31,110 @@ class Database:
|
|
|
self.con = sqlite3.connect(path)
|
|
|
self.con.execute("PRAGMA foreign_keys = ON")
|
|
|
|
|
|
- # create tables
|
|
|
- with closing(self.con.cursor()) as cursor:
|
|
|
- cursor.execute('''
|
|
|
- CREATE TABLE IF NOT EXISTS models (
|
|
|
- id INTEGER PRIMARY KEY,
|
|
|
- name TEXT NOT NULL,
|
|
|
- description TEXT,
|
|
|
- root_folder TEXT NOT NULL UNIQUE,
|
|
|
- supports TEXT NOT NULL
|
|
|
- )
|
|
|
- ''')
|
|
|
- cursor.execute('''
|
|
|
- CREATE TABLE IF NOT EXISTS label_providers (
|
|
|
- id INTEGER PRIMARY KEY,
|
|
|
- name TEXT NOT NULL,
|
|
|
- description TEXT,
|
|
|
- root_folder TEXT NOT NULL UNIQUE
|
|
|
- )
|
|
|
- ''')
|
|
|
-
|
|
|
- cursor.execute('''
|
|
|
- CREATE TABLE IF NOT EXISTS projects (
|
|
|
- id INTEGER PRIMARY KEY,
|
|
|
- name TEXT NOT NULL,
|
|
|
- description TEXT,
|
|
|
- created INTEGER NOT NULL,
|
|
|
- model INTEGER,
|
|
|
- label_provider INTEGER,
|
|
|
- root_folder TEXT NOT NULL UNIQUE,
|
|
|
- external_data BOOL NOT NULL,
|
|
|
- data_folder TEXT NOT NULL,
|
|
|
- FOREIGN KEY (model) REFERENCES models(id)
|
|
|
- ON UPDATE CASCADE ON DELETE SET NULL,
|
|
|
- FOREIGN KEY (label_provider) REFERENCES label_providers(id)
|
|
|
- ON UPDATE CASCADE ON DELETE SET NULL
|
|
|
- )
|
|
|
- ''')
|
|
|
- cursor.execute('''
|
|
|
- CREATE TABLE IF NOT EXISTS labels (
|
|
|
- id INTEGER PRIMARY KEY,
|
|
|
- project INTEGER NOT NULL,
|
|
|
- parent INTEGER,
|
|
|
- created INTEGER NOT NULL,
|
|
|
- reference TEXT,
|
|
|
- name TEXT NOT NULL,
|
|
|
- FOREIGN KEY (project) REFERENCES projects(id)
|
|
|
- ON UPDATE CASCADE ON DELETE CASCADE,
|
|
|
- FOREIGN KEY (parent) REFERENCES labels(id)
|
|
|
- ON UPDATE CASCADE ON DELETE SET NULL,
|
|
|
- UNIQUE(project, reference)
|
|
|
- )
|
|
|
- ''')
|
|
|
- cursor.execute('''
|
|
|
- CREATE TABLE IF NOT EXISTS collections (
|
|
|
- id INTEGER PRIMARY KEY,
|
|
|
- project INTEGER NOT NULL,
|
|
|
- reference TEXT NOT NULL,
|
|
|
- name TEXT NOT NULL,
|
|
|
- description TEXT,
|
|
|
- position INTEGER NOT NULL,
|
|
|
- autoselect INTEGER NOT NULL,
|
|
|
- FOREIGN KEY (project) REFERENCES projects(id)
|
|
|
- ON UPDATE CASCADE ON DELETE CASCADE,
|
|
|
- UNIQUE(project, reference)
|
|
|
- )
|
|
|
- ''')
|
|
|
- cursor.execute('''
|
|
|
- CREATE TABLE IF NOT EXISTS files (
|
|
|
- id INTEGER PRIMARY KEY,
|
|
|
- uuid TEXT NOT NULL,
|
|
|
- project INTEGER NOT NULL,
|
|
|
- collection INTEGER,
|
|
|
- type TEXT NOT NULL,
|
|
|
- name TEXT NOT NULL,
|
|
|
- extension TEXT NOT NULL,
|
|
|
- size INTEGER NOT NULL,
|
|
|
- created INTEGER NOT NULL,
|
|
|
- path TEXT NOT NULL,
|
|
|
- frames INTEGER,
|
|
|
- fps FLOAT,
|
|
|
- FOREIGN KEY (project) REFERENCES projects(id)
|
|
|
- ON UPDATE CASCADE ON DELETE CASCADE,
|
|
|
- FOREIGN KEY (collection) REFERENCES collections(id)
|
|
|
- ON UPDATE CASCADE ON DELETE SET NULL,
|
|
|
- UNIQUE(project, path)
|
|
|
- )
|
|
|
- ''')
|
|
|
- cursor.execute('''
|
|
|
- CREATE TABLE IF NOT EXISTS results (
|
|
|
- id INTEGER PRIMARY KEY,
|
|
|
- file INTEGER NOT NULL,
|
|
|
- origin TEXT NOT NULL,
|
|
|
- type TEXT NOT NULL,
|
|
|
- label INTEGER,
|
|
|
- data TEXT NOT NULL,
|
|
|
- FOREIGN KEY (file) REFERENCES files(id)
|
|
|
- ON UPDATE CASCADE ON DELETE CASCADE
|
|
|
- )
|
|
|
- ''')
|
|
|
- # cursor.execute('''
|
|
|
- # CREATE INDEX IF NOT EXISTS idx_results_label ON results(label)
|
|
|
- # ''')
|
|
|
+ if initialization:
|
|
|
+ # create tables
|
|
|
+ with self:
|
|
|
+ with closing(self.con.cursor()) as cursor:
|
|
|
+ cursor.execute('''
|
|
|
+ CREATE TABLE IF NOT EXISTS models (
|
|
|
+ id INTEGER PRIMARY KEY,
|
|
|
+ name TEXT NOT NULL,
|
|
|
+ description TEXT,
|
|
|
+ root_folder TEXT NOT NULL UNIQUE,
|
|
|
+ supports TEXT NOT NULL
|
|
|
+ )
|
|
|
+ ''')
|
|
|
+ cursor.execute('''
|
|
|
+ CREATE TABLE IF NOT EXISTS label_providers (
|
|
|
+ id INTEGER PRIMARY KEY,
|
|
|
+ name TEXT NOT NULL,
|
|
|
+ description TEXT,
|
|
|
+ root_folder TEXT NOT NULL UNIQUE
|
|
|
+ )
|
|
|
+ ''')
|
|
|
+
|
|
|
+ cursor.execute('''
|
|
|
+ CREATE TABLE IF NOT EXISTS projects (
|
|
|
+ id INTEGER PRIMARY KEY,
|
|
|
+ name TEXT NOT NULL,
|
|
|
+ description TEXT,
|
|
|
+ created INTEGER NOT NULL,
|
|
|
+ model INTEGER,
|
|
|
+ label_provider INTEGER,
|
|
|
+ root_folder TEXT NOT NULL UNIQUE,
|
|
|
+ external_data BOOL NOT NULL,
|
|
|
+ data_folder TEXT NOT NULL,
|
|
|
+ FOREIGN KEY (model) REFERENCES models(id)
|
|
|
+ ON UPDATE CASCADE ON DELETE SET NULL,
|
|
|
+ FOREIGN KEY (label_provider) REFERENCES label_providers(id)
|
|
|
+ ON UPDATE CASCADE ON DELETE SET NULL
|
|
|
+ )
|
|
|
+ ''')
|
|
|
+ cursor.execute('''
|
|
|
+ CREATE TABLE IF NOT EXISTS labels (
|
|
|
+ id INTEGER PRIMARY KEY,
|
|
|
+ project INTEGER NOT NULL,
|
|
|
+ parent INTEGER,
|
|
|
+ created INTEGER NOT NULL,
|
|
|
+ reference TEXT,
|
|
|
+ name TEXT NOT NULL,
|
|
|
+ FOREIGN KEY (project) REFERENCES projects(id)
|
|
|
+ ON UPDATE CASCADE ON DELETE CASCADE,
|
|
|
+ FOREIGN KEY (parent) REFERENCES labels(id)
|
|
|
+ ON UPDATE CASCADE ON DELETE SET NULL,
|
|
|
+ UNIQUE(project, reference)
|
|
|
+ )
|
|
|
+ ''')
|
|
|
+ cursor.execute('''
|
|
|
+ CREATE TABLE IF NOT EXISTS collections (
|
|
|
+ id INTEGER PRIMARY KEY,
|
|
|
+ project INTEGER NOT NULL,
|
|
|
+ reference TEXT NOT NULL,
|
|
|
+ name TEXT NOT NULL,
|
|
|
+ description TEXT,
|
|
|
+ position INTEGER NOT NULL,
|
|
|
+ autoselect INTEGER NOT NULL,
|
|
|
+ FOREIGN KEY (project) REFERENCES projects(id)
|
|
|
+ ON UPDATE CASCADE ON DELETE CASCADE,
|
|
|
+ UNIQUE(project, reference)
|
|
|
+ )
|
|
|
+ ''')
|
|
|
+ cursor.execute('''
|
|
|
+ CREATE TABLE IF NOT EXISTS files (
|
|
|
+ id INTEGER PRIMARY KEY,
|
|
|
+ uuid TEXT NOT NULL,
|
|
|
+ project INTEGER NOT NULL,
|
|
|
+ collection INTEGER,
|
|
|
+ type TEXT NOT NULL,
|
|
|
+ name TEXT NOT NULL,
|
|
|
+ extension TEXT NOT NULL,
|
|
|
+ size INTEGER NOT NULL,
|
|
|
+ created INTEGER NOT NULL,
|
|
|
+ path TEXT NOT NULL,
|
|
|
+ frames INTEGER,
|
|
|
+ fps FLOAT,
|
|
|
+ FOREIGN KEY (project) REFERENCES projects(id)
|
|
|
+ ON UPDATE CASCADE ON DELETE CASCADE,
|
|
|
+ FOREIGN KEY (collection) REFERENCES collections(id)
|
|
|
+ ON UPDATE CASCADE ON DELETE SET NULL,
|
|
|
+ UNIQUE(project, path)
|
|
|
+ )
|
|
|
+ ''')
|
|
|
+ cursor.execute('''
|
|
|
+ CREATE TABLE IF NOT EXISTS results (
|
|
|
+ id INTEGER PRIMARY KEY,
|
|
|
+ file INTEGER NOT NULL,
|
|
|
+ origin TEXT NOT NULL,
|
|
|
+ type TEXT NOT NULL,
|
|
|
+ label INTEGER,
|
|
|
+ data TEXT,
|
|
|
+ FOREIGN KEY (file) REFERENCES files(id)
|
|
|
+ ON UPDATE CASCADE ON DELETE CASCADE
|
|
|
+ )
|
|
|
+ ''')
|
|
|
|
|
|
- # run discovery modules
|
|
|
if discovery:
|
|
|
+ # run discovery modules
|
|
|
with self:
|
|
|
discover_models(self.con)
|
|
|
discover_label_providers(self.con)
|
|
@@ -143,8 +142,15 @@ class Database:
|
|
|
def close(self):
|
|
|
self.con.close()
|
|
|
|
|
|
+ def copy(self):
|
|
|
+ return Database(self.path, initialization=False, discovery=False)
|
|
|
+
|
|
|
+ def commit(self):
|
|
|
+ self.con.commit()
|
|
|
+
|
|
|
def __enter__(self):
|
|
|
self.con.__enter__()
|
|
|
+ return self
|
|
|
|
|
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
|
self.con.__exit__(exc_type, exc_val, exc_tb)
|