You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by is...@apache.org on 2019/03/22 10:35:36 UTC
[ignite] branch master updated: IGNITE-10691: Python thin client:
UUID marshalling fix
This is an automated email from the ASF dual-hosted git repository.
isapego pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push:
new e7e1e77 IGNITE-10691: Python thin client: UUID marshalling fix
e7e1e77 is described below
commit e7e1e776cf3f61d5f1b1c6fea3cddb571a27bca3
Author: Dmitry Melnichuk <dm...@nobitlost.com>
AuthorDate: Fri Mar 22 13:33:49 2019 +0300
IGNITE-10691: Python thin client: UUID marshalling fix
This closes #6296
---
.../python/pyignite/datatypes/standard.py | 13 +++++--
modules/platforms/python/tests/test_datatypes.py | 42 ++++++++++++++++++++++
2 files changed, 53 insertions(+), 2 deletions(-)
diff --git a/modules/platforms/python/pyignite/datatypes/standard.py b/modules/platforms/python/pyignite/datatypes/standard.py
index cc5b955..8808da2 100644
--- a/modules/platforms/python/pyignite/datatypes/standard.py
+++ b/modules/platforms/python/pyignite/datatypes/standard.py
@@ -246,10 +246,16 @@ class UUIDObject(StandardObject):
"""
Universally unique identifier (UUID), aka Globally unique identifier
(GUID). Payload takes up 16 bytes.
+
+ Byte order in :py:meth:`~pyignite.datatypes.standard.UUIDObject.to_python`
+ and :py:meth:`~pyignite.datatypes.standard.UUIDObject.from_python` methods
+ is changed for compatibility with `java.util.UUID`.
"""
type_code = TC_UUID
_object_c_type = None
+ UUID_BYTE_ORDER = (7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8)
+
@classmethod
def build_c_type(cls):
if cls._object_c_type is None:
@@ -274,7 +280,7 @@ class UUIDObject(StandardObject):
cls.type_code,
byteorder=PROTOCOL_BYTE_ORDER
)
- for i, byte in enumerate(bytearray(value.bytes)):
+ for i, byte in zip(cls.UUID_BYTE_ORDER, bytearray(value.bytes)):
data_object.value[i] = byte
return bytes(data_object)
@@ -285,7 +291,10 @@ class UUIDObject(StandardObject):
byteorder=PROTOCOL_BYTE_ORDER
):
return None
- return uuid.UUID(bytes=bytes(ctypes_object.value))
+ uuid_array = bytearray(ctypes_object.value)
+ return uuid.UUID(
+ bytes=bytes([uuid_array[i] for i in cls.UUID_BYTE_ORDER])
+ )
class TimestampObject(StandardObject):
diff --git a/modules/platforms/python/tests/test_datatypes.py b/modules/platforms/python/tests/test_datatypes.py
index d7c7977..b68ba8c 100644
--- a/modules/platforms/python/tests/test_datatypes.py
+++ b/modules/platforms/python/tests/test_datatypes.py
@@ -132,3 +132,45 @@ def test_put_get_data(client, cache, value, value_hint):
result = cache_get(client, cache, 'my_key')
assert result.status == 0
assert result.value == value
+
+
+@pytest.mark.parametrize(
+ 'uuid_string',
+ [
+ 'd57babad-7bc1-4c82-9f9c-e72841b92a85',
+ '5946c0c0-2b76-479d-8694-a2e64a3968da',
+ 'a521723d-ad5d-46a6-94ad-300f850ef704',
+ ]
+)
+def test_uuid_representation(client, uuid_string):
+ """ Test if textual UUID representation is correct. """
+ uuid_value = uuid.UUID(uuid_string)
+
+ # initial cleanup
+ client.sql("DROP TABLE test_uuid_repr IF EXISTS")
+ # create table with UUID field
+ client.sql(
+ "CREATE TABLE test_uuid_repr (id INTEGER PRIMARY KEY, uuid_field UUID)"
+ )
+ # use uuid.UUID class to insert data
+ client.sql(
+ "INSERT INTO test_uuid_repr(id, uuid_field) VALUES (?, ?)",
+ query_args=[1, uuid_value]
+ )
+ # use hex string to retrieve data
+ result = client.sql(
+ "SELECT * FROM test_uuid_repr WHERE uuid_field='{}'".format(
+ uuid_string
+ )
+ )
+
+ # finalize query
+ result = list(result)
+
+ # final cleanup
+ client.sql("DROP TABLE test_uuid_repr IF EXISTS")
+
+ # if a line was retrieved, our test was successful
+ assert len(result) == 1
+ # doublecheck
+ assert result[0][1] == uuid_value