diff --git a/arkindex_worker/cache.py b/arkindex_worker/cache.py index 78b2131d533ece8ed8b8be3b3525c7b492923638..ed56e86c5974fc7b1d4bd79522a794c6cc6f0d7b 100644 --- a/arkindex_worker/cache.py +++ b/arkindex_worker/cache.py @@ -42,6 +42,12 @@ class LocalDB(object): ) self.db.commit() - def fetch(self, table, where_clause=""): - self.cursor.execute(f"SELECT * FROM {table} {where_clause}") + def fetch(self, table, where=[]): + sql = f"SELECT * FROM {table}" + if where: + sql += " WHERE " + sql += " AND ".join( + [f"{field} {operator} (?)" for field, operator, _ in where] + ) + self.cursor.execute(sql, [value for _, _, value in where]) return self.cursor.fetchall() diff --git a/arkindex_worker/worker.py b/arkindex_worker/worker.py index 1068e684d5c5b46a34fc0266efac108cb95b5437..776b49397f33599f814e67cfde4ce976ebe0f60b 100644 --- a/arkindex_worker/worker.py +++ b/arkindex_worker/worker.py @@ -896,17 +896,19 @@ class ElementsWorker(BaseWorker): "type", "worker_version", }, "When using the local cache, you can only filter by 'name', 'type' and/or 'worker_version'" - parent_id_hex = convert_str_uuid_to_hex(element.id) - name_condition = f" AND name LIKE '%{name}%'" if name else "" - type_condition = f" AND type='{type}'" if type else "" - worker_version_condition = ( - f" AND worker_version_id='{convert_str_uuid_to_hex(worker_version)}'" + + conditions = [("parent_id", "=", convert_str_uuid_to_hex(element.id))] + conditions += [("name", "LIKE", f"%{name}%")] if name else [] + conditions += [("type", "=", type)] if type else [] + conditions += ( + [("worker_version_id", "=", convert_str_uuid_to_hex(worker_version))] if worker_version - else "" + else [] ) + children = self.cache.fetch( "elements", - where_clause=f"WHERE parent_id='{parent_id_hex}'{name_condition}{type_condition}{worker_version_condition}", + where=conditions, ) children = [CachedElement(**dict(child)) for child in children] else: diff --git a/tests/test_cache.py b/tests/test_cache.py index 763046535b78b2cece1903827822c68bae63933b..685cc1b3231b984f20985c360a7fbf6a4169dafc 100644 --- a/tests/test_cache.py +++ b/tests/test_cache.py @@ -144,6 +144,13 @@ def test_fetch_with_where(): cache.create_tables() rows = cache.fetch( "elements", - where_clause=f"WHERE parent_id='{convert_str_uuid_to_hex('12341234-1234-1234-1234-123412341234')}' AND name LIKE '%0%'", + where=[ + ( + "parent_id", + "=", + convert_str_uuid_to_hex("12341234-1234-1234-1234-123412341234"), + ), + ("name", "LIKE", "%0%"), + ], ) assert [CachedElement(**dict(row)) for row in rows] == [ELEMENTS_TO_INSERT[0]]