From b38754b50227f119a47e902e888edd4d9cf2155a Mon Sep 17 00:00:00 2001
From: Eva Bardou <ebardou@teklia.com>
Date: Wed, 17 Mar 2021 13:00:19 +0100
Subject: [PATCH] Store created elements in a local SQLite database

---
 arkindex_worker/cache.py  | 31 +++++++++++++++++++++++++++++++
 arkindex_worker/worker.py | 17 +++++++++++++++++
 2 files changed, 48 insertions(+)
 create mode 100644 arkindex_worker/cache.py

diff --git a/arkindex_worker/cache.py b/arkindex_worker/cache.py
new file mode 100644
index 00000000..d6c18c9d
--- /dev/null
+++ b/arkindex_worker/cache.py
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+import os
+import sqlite3
+
+
+class LocalDB(object):
+    def __init__(self, path):
+        if not os.path.exists(path):
+            open(path, "x").close()
+
+        self.db = sqlite3.connect(path)
+        self.cursor = self.db.cursor()
+
+    def create_elements_table(self):
+        try:
+            self.cursor.execute(
+                """CREATE TABLE elements (
+                id TEXT PRIMARY KEY,
+                parent_id TEXT,
+                name TEXT NOT NULL,
+                type TEXT NOT NULL,
+                polygon TEXT,
+                worker_version_id TEXT
+            )"""
+            )
+        except sqlite3.OperationalError:
+            print("Table 'elements' already exists")
+
+    def insert(self, table, lines):
+        self.cursor.executemany(f"INSERT INTO {table} VALUES (?,?,?,?,?,?)", lines)
+        self.db.commit()
diff --git a/arkindex_worker/worker.py b/arkindex_worker/worker.py
index 3bfc1be0..830f7b51 100644
--- a/arkindex_worker/worker.py
+++ b/arkindex_worker/worker.py
@@ -16,6 +16,7 @@ from apistar.exceptions import ErrorResponse
 
 from arkindex import ArkindexClient, options_from_env
 from arkindex_worker import logger
+from arkindex_worker.cache import LocalDB
 from arkindex_worker.models import Element
 from arkindex_worker.reporting import Reporter
 
@@ -451,6 +452,22 @@ class ElementsWorker(BaseWorker):
         for element in elements:
             self.report.add_element(parent.id, element["type"])
 
+        # Store elements in local cache
+        cache = LocalDB(f"/data/{os.environ.get('TASK_ID')}/db.sqlite")
+        cache.create_elements_table()
+        to_insert = [
+            (
+                created_ids[idx],
+                parent.id,
+                element["name"],
+                element["type"],
+                json.dumps(element["polygon"]),
+                self.worker_version_id,
+            )
+            for idx, element in enumerate(elements)
+        ]
+        cache.insert("elements", to_insert)
+
         return created_ids
 
     def create_transcription(self, element, text, type=None, score=None):
-- 
GitLab