Skip to content

Commit 2223ded

Browse files
committed
Merge branch 'develop' into project_detail_v2
2 parents 5c9b768 + 417fbcd commit 2223ded

File tree

5 files changed

+95
-89
lines changed

5 files changed

+95
-89
lines changed

server/Pipfile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ flask-migrate = "==2.6.0" # 3.1.0
2626
wtforms-json = "==0.3.5"
2727
pytz = "==2022.2.1"
2828
scikit-build = "==0.18.1"
29-
pygeodiff = "==1.0.6"
29+
pygeodiff = "==2.0.4"
3030
pathvalidate = "==3.2.0"
3131
celery= "==5.4.0"
3232
redis= "==5.0.1"
@@ -40,6 +40,7 @@ psycogreen = "==1.0.2"
4040
importlib-metadata = "==8.4.0" # https://github.com/pallets/flask/issues/4502
4141
typing_extensions = "==4.12.2"
4242
python-magic = "==0.4.27"
43+
click = "==8.2.0"
4344
# requirements for development on windows
4445
colorama = "==0.4.5"
4546

server/Pipfile.lock

Lines changed: 77 additions & 43 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/mergin/sync/public_api_controller.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,14 @@
8383
get_user_agent,
8484
generate_location,
8585
is_valid_uuid,
86-
gpkg_wkb_to_wkt,
8786
is_versioned_file,
8887
get_project_path,
8988
get_device_id,
9089
is_valid_path,
9190
is_supported_type,
9291
is_supported_extension,
9392
get_mimetype,
93+
wkb2wkt,
9494
)
9595
from .errors import StorageLimitHit, ProjectLocked
9696
from ..utils import format_time_delta
@@ -1410,7 +1410,10 @@ def get_resource_changeset(project_name, namespace, version_id, path): # noqa:
14101410
if key not in geom_change:
14111411
continue
14121412
gpkg_wkb = base64.b64decode(geom_change[key], validate=True)
1413-
wkt = gpkg_wkb_to_wkt(gpkg_wkb)
1413+
wkb = version.project.storage.geodiff.create_wkb_from_gpkg_header(
1414+
gpkg_wkb
1415+
)
1416+
wkt = wkb2wkt(wkb)
14141417
if wkt:
14151418
geom_change[key] = wkt
14161419
except (binascii.Error, TypeError, ValueError):

server/mergin/sync/utils.py

Lines changed: 2 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -184,38 +184,8 @@ def is_valid_uuid(uuid):
184184
return False
185185

186186

187-
# inspired by C++ implementation https://github.com/lutraconsulting/geodiff/blob/master/geodiff/src/drivers/sqliteutils.cpp
188-
# in geodiff lib (MIT licence)
189-
def parse_gpkgb_header_size(gpkg_wkb):
190-
"""Parse header of geopackage wkb and return its size"""
191-
# some constants
192-
no_envelope_header_size = 8
193-
flag_byte_pos = 3
194-
envelope_size_mask = 14
195-
196-
try:
197-
flag_byte = gpkg_wkb[flag_byte_pos]
198-
except IndexError:
199-
return -1 # probably some invalid input
200-
envelope_byte = (flag_byte & envelope_size_mask) >> 1
201-
envelope_size = 0
202-
203-
if envelope_byte == 1:
204-
envelope_size = 32
205-
elif envelope_byte == 2:
206-
envelope_size = 48
207-
elif envelope_byte == 3:
208-
envelope_size = 48
209-
elif envelope_byte == 4:
210-
envelope_size = 64
211-
212-
return no_envelope_header_size + envelope_size
213-
214-
215-
def gpkg_wkb_to_wkt(gpkg_wkb):
216-
"""Convert WKB (with gpkg header) to WKT"""
217-
wkb_header_length = parse_gpkgb_header_size(gpkg_wkb)
218-
wkb_geom = gpkg_wkb[wkb_header_length:]
187+
def wkb2wkt(wkb_geom: bytes) -> str | None:
188+
"""Convert WKB to WKT"""
219189
try:
220190
wkt = wkb.loads(wkb_geom).wkt
221191
except ShapelyError:

server/mergin/tests/test_utils.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,18 @@
1212
import os
1313
from unittest.mock import patch
1414
from pathvalidate import sanitize_filename
15+
from pygeodiff import GeoDiff
1516

1617
from ..utils import save_diagnostic_log_file
1718

1819
from ..sync.utils import (
19-
parse_gpkgb_header_size,
20-
gpkg_wkb_to_wkt,
2120
is_reserved_word,
2221
has_valid_characters,
2322
has_valid_first_character,
2423
check_filename,
2524
is_valid_path,
2625
get_x_accel_uri,
26+
wkb2wkt,
2727
)
2828
from ..auth.models import LoginHistory, User
2929
from . import json_headers
@@ -86,30 +86,28 @@ def test_maintenance_mode(client):
8686

8787

8888
def test_parse_gpkg():
89+
geodiff = GeoDiff()
8990
# Point
9091
gpkg_wkb = base64.b64decode(
9192
"R1AAAeYQAAABAQAAAID8bic0LLE/RlTr7Iuo1j8=", validate=True
9293
)
93-
header_len = parse_gpkgb_header_size(gpkg_wkb)
94-
assert header_len == 8
95-
wkt = gpkg_wkb_to_wkt(gpkg_wkb)
94+
wkb = geodiff.create_wkb_from_gpkg_header(gpkg_wkb)
95+
wkt = wkb2wkt(wkb)
9696
assert "POINT" in wkt
9797

9898
# Linestring
9999
gpkg_wkb = base64.b64decode(
100100
"R1AAA+YQAABA0VaD5wjkv+R3O6FhidC/hn8DkdjL0z8Iwc3FqhvlPwECAAAABAAAAGhDvPBvINK/CMHNxaob5T9I139WMEjZv+DthIYlQuA/5Hc7oWGJ0L+GfwOR2MvTP0DRVoPnCOS/zB9sPJo/2D8=",
101101
validate=True,
102102
)
103-
header_len = parse_gpkgb_header_size(gpkg_wkb)
104-
assert header_len == 40
105-
wkt = gpkg_wkb_to_wkt(gpkg_wkb)
103+
104+
wkb = geodiff.create_wkb_from_gpkg_header(gpkg_wkb)
105+
wkt = wkb2wkt(wkb)
106106
assert "LINESTRING" in wkt
107107

108108
# Invalid
109109
gpkg_wkb = base64.b64decode("aaaa", validate=True)
110-
header_len = parse_gpkgb_header_size(gpkg_wkb)
111-
assert header_len == -1
112-
wkt = gpkg_wkb_to_wkt(gpkg_wkb)
110+
wkt = wkb2wkt(gpkg_wkb)
113111
assert not wkt
114112

115113

0 commit comments

Comments
 (0)