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