diff --git a/Mergin/diff.py b/Mergin/diff.py index 82f6d538..1c64de98 100644 --- a/Mergin/diff.py +++ b/Mergin/diff.py @@ -75,22 +75,19 @@ def get_row_from_db(db_conn, schema_table, entry_changes): Fetches a single row from DB's table based on the values of pkeys in changeset entry """ - with db_conn.cursor() as c: - where_clauses = [] - query_params = [] + where_clauses = [] + query_params = [] - for i, col in enumerate(schema_table.columns): - if col.pkey: - where_clauses.append('"{}" = %s'.format(col.name)) - val = old_value_for_column_by_index(entry_changes, i) - query_params.append(val) + for i, col in enumerate(schema_table.columns): + if col.pkey: + where_clauses.append('"{}" = ?'.format(col.name)) + val = old_value_for_column_by_index(entry_changes, i) + query_params.append(val) - # We parameterize values securely; table/column names are trusted internal schema objects. - query = 'SELECT * FROM "{}" WHERE {}'.format(schema_table.name, " AND ".join(where_clauses)) # nosec B608 + # We parameterize values securely; table/column names are trusted internal schema objects. + query = 'SELECT * FROM "{}" WHERE {}'.format(schema_table.name, " AND ".join(where_clauses)) # nosec B608 - c.execute(query, tuple(query_params)) - - return c.fetchone() + return db_conn.execute(query, tuple(query_params)).fetchone() def parse_gpkg_geom_encoding(wkb_with_gpkg_hdr): @@ -348,10 +345,11 @@ def make_local_changes_layer(mp, layer): fields, cols_to_fields = create_field_list(db_schema[table_name]) - db_conn = None # no ref. db db_conn = sqlite3.connect(base_file) - - features = diff_table_to_features(diff[table_name], db_schema[table_name], fields, cols_to_fields, db_conn) + try: + features = diff_table_to_features(diff[table_name], db_schema[table_name], fields, cols_to_fields, db_conn) + finally: + db_conn.close() # create diff layer vl = QgsVectorLayer( @@ -400,10 +398,13 @@ def make_version_changes_layers(project_path, version): fields, cols_to_fields = create_field_list(db_schema[table_name]) geom_type, geom_crs = get_layer_geometry_info(schema_json, table_name) - db_conn = None # no ref. db db_conn = sqlite3.connect(gpkg_file) - - features = diff_table_to_features(diff[table_name], db_schema[table_name], fields, cols_to_fields, db_conn) + try: + features = diff_table_to_features( + diff[table_name], db_schema[table_name], fields, cols_to_fields, db_conn + ) + finally: + db_conn.close() # create diff layer if geom_type is None: diff --git a/Mergin/processing/algs/create_diff.py b/Mergin/processing/algs/create_diff.py index 9fca41d7..aa275900 100644 --- a/Mergin/processing/algs/create_diff.py +++ b/Mergin/processing/algs/create_diff.py @@ -180,9 +180,13 @@ def processAlgorithm(self, parameters, context, feedback): feedback.setProgress(30) if diff and table_name in diff.keys(): - db_conn = None # no ref. db db_conn = sqlite3.connect(layer_path) - features = diff_table_to_features(diff[table_name], db_schema[table_name], fields, fields_mapping, db_conn) + try: + features = diff_table_to_features( + diff[table_name], db_schema[table_name], fields, fields_mapping, db_conn + ) + finally: + db_conn.close() feedback.setProgress(40) step = 60.0 / len(features) if features else 0 diff --git a/Mergin/processing/algs/download_vector_tiles.py b/Mergin/processing/algs/download_vector_tiles.py index 42be8ab7..4582e3c2 100644 --- a/Mergin/processing/algs/download_vector_tiles.py +++ b/Mergin/processing/algs/download_vector_tiles.py @@ -56,8 +56,7 @@ def create(self): "CREATE UNIQUE INDEX tile_index on tiles (zoom_level, tile_column, tile_row);" "COMMIT;" ) - cur = self.conn.cursor() - cur.executescript(sql) + self.conn.executescript(sql) return True def set_metadata_value(self, key, value): @@ -65,8 +64,7 @@ def set_metadata_value(self, key, value): return params = (key, value) - cur = self.conn.cursor() - cur.execute("insert into metadata values (?, ?)", params) + self.conn.execute("insert into metadata values (?, ?)", params) self.conn.commit() def set_tile_data(self, z, x, y, data): @@ -74,8 +72,7 @@ def set_tile_data(self, z, x, y, data): return params = (z, x, y, data) - cur = self.conn.cursor() - cur.execute("insert into tiles values (?, ?, ?, ?)", params) + self.conn.execute("insert into tiles values (?, ?, ?, ?)", params) self.conn.commit() def close(self): diff --git a/Mergin/processing/algs/extract_local_changes.py b/Mergin/processing/algs/extract_local_changes.py index e4d07823..135c94c9 100644 --- a/Mergin/processing/algs/extract_local_changes.py +++ b/Mergin/processing/algs/extract_local_changes.py @@ -115,9 +115,13 @@ def processAlgorithm(self, parameters, context, feedback): feedback.setProgress(15) if diff and table_name in diff.keys(): - db_conn = None # no ref. db db_conn = sqlite3.connect(layer_path) - features = diff_table_to_features(diff[table_name], db_schema[table_name], fields, fields_mapping, db_conn) + try: + features = diff_table_to_features( + diff[table_name], db_schema[table_name], fields, fields_mapping, db_conn + ) + finally: + db_conn.close() feedback.setProgress(20) step = 80.0 / len(features) if features else 0