You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by tr...@apache.org on 2013/07/04 17:28:37 UTC

svn commit: r1499787 - in /qpid/trunk/qpid/extras/dispatch: include/qpid/dispatch/iterator.h src/iterator.c src/parse.c src/python_embedded.c src/python_embedded.h

Author: tross
Date: Thu Jul  4 15:28:37 2013
New Revision: 1499787

URL: http://svn.apache.org/r1499787
Log:
QPID-4968 - Added Python/Dispatch data conversion utilities.

Modified:
    qpid/trunk/qpid/extras/dispatch/include/qpid/dispatch/iterator.h
    qpid/trunk/qpid/extras/dispatch/src/iterator.c
    qpid/trunk/qpid/extras/dispatch/src/parse.c
    qpid/trunk/qpid/extras/dispatch/src/python_embedded.c
    qpid/trunk/qpid/extras/dispatch/src/python_embedded.h

Modified: qpid/trunk/qpid/extras/dispatch/include/qpid/dispatch/iterator.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/extras/dispatch/include/qpid/dispatch/iterator.h?rev=1499787&r1=1499786&r2=1499787&view=diff
==============================================================================
--- qpid/trunk/qpid/extras/dispatch/include/qpid/dispatch/iterator.h (original)
+++ qpid/trunk/qpid/extras/dispatch/include/qpid/dispatch/iterator.h Thu Jul  4 15:28:37 2013
@@ -146,6 +146,18 @@ dx_field_iterator_t *dx_field_iterator_s
 void dx_field_iterator_advance(dx_field_iterator_t *iter, uint32_t length);
 
 /**
+ * Return the remaining length (in octets) for the iterator.
+ *
+ * IMPORTANT:  This function returns the limit of the remaining length.
+ *             The actual length *may* be less than indicated, but will
+ *             never be more.  This function is safe for allocating memory.
+ *
+ * @param iter A field iterator
+ * @return The number of octets remaining in the view (or more)
+ */
+uint32_t dx_field_iterator_remaining(dx_field_iterator_t *iter);
+
+/**
  * Compare an input string to the iterator's view.  Return true iff they are equal.
  */
 int dx_field_iterator_equal(dx_field_iterator_t *iter, const unsigned char *string);

Modified: qpid/trunk/qpid/extras/dispatch/src/iterator.c
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/extras/dispatch/src/iterator.c?rev=1499787&r1=1499786&r2=1499787&view=diff
==============================================================================
--- qpid/trunk/qpid/extras/dispatch/src/iterator.c (original)
+++ qpid/trunk/qpid/extras/dispatch/src/iterator.c Thu Jul  4 15:28:37 2013
@@ -372,6 +372,12 @@ void dx_field_iterator_advance(dx_field_
 }
 
 
+uint32_t dx_field_iterator_remaining(dx_field_iterator_t *iter)
+{
+    return iter->pointer.length;
+}
+
+
 int dx_field_iterator_equal(dx_field_iterator_t *iter, const unsigned char *string)
 {
     dx_field_iterator_reset(iter);

Modified: qpid/trunk/qpid/extras/dispatch/src/parse.c
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/extras/dispatch/src/parse.c?rev=1499787&r1=1499786&r2=1499787&view=diff
==============================================================================
--- qpid/trunk/qpid/extras/dispatch/src/parse.c (original)
+++ qpid/trunk/qpid/extras/dispatch/src/parse.c Thu Jul  4 15:28:37 2013
@@ -219,6 +219,7 @@ uint64_t dx_parse_as_ulong(dx_parsed_fie
 
     switch (field->tag) {
     case DX_AMQP_ULONG:
+    case DX_AMQP_TIMESTAMP:
         result |= ((uint64_t) dx_field_iterator_octet(field->raw_iter)) << 56;
         result |= ((uint64_t) dx_field_iterator_octet(field->raw_iter)) << 48;
         result |= ((uint64_t) dx_field_iterator_octet(field->raw_iter)) << 40;

Modified: qpid/trunk/qpid/extras/dispatch/src/python_embedded.c
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/extras/dispatch/src/python_embedded.c?rev=1499787&r1=1499786&r2=1499787&view=diff
==============================================================================
--- qpid/trunk/qpid/extras/dispatch/src/python_embedded.c (original)
+++ qpid/trunk/qpid/extras/dispatch/src/python_embedded.c Thu Jul  4 15:28:37 2013
@@ -20,11 +20,53 @@
 #include "python_embedded.h"
 #include <qpid/dispatch/threading.h>
 #include <qpid/dispatch/log.h>
+#include <qpid/dispatch/amqp.h>
 
 static uint32_t     ref_count  = 0;
 static sys_mutex_t *lock       = 0;
 static char        *log_module = "PYTHON";
 
+
+static PyObject *parsed_to_py_string(dx_parsed_field_t *field)
+{
+    switch (dx_parse_tag(field)) {
+    case DX_AMQP_VBIN8:
+    case DX_AMQP_VBIN32:
+    case DX_AMQP_STR8_UTF8:
+    case DX_AMQP_STR32_UTF8:
+    case DX_AMQP_SYM8:
+    case DX_AMQP_SYM32:
+        break;
+    default:
+        return Py_None;
+    }
+
+#define SHORT_BUF 1024
+    uint8_t short_buf[SHORT_BUF];
+    PyObject *result;
+    dx_field_iterator_t *raw = dx_parse_raw(field);
+    dx_field_iterator_reset(raw);
+    uint32_t length = dx_field_iterator_remaining(raw);
+    uint8_t *buffer = short_buf;
+    uint8_t *ptr;
+    int alloc = 0;
+
+    if (length > SHORT_BUF) {
+        alloc = 1;
+        buffer = (uint8_t*) malloc(length);
+    }
+
+    ptr = buffer;
+    while (!dx_field_iterator_end(raw))
+        *(ptr++) = dx_field_iterator_octet(raw);
+    result = PyString_FromStringAndSize((char*) buffer, ptr - buffer);
+    if (alloc)
+        free(buffer);
+
+    return result;
+}
+
+
 void dx_python_initialize()
 {
     lock = sys_mutex();
@@ -62,3 +104,154 @@ void dx_python_stop()
 }
 
 
+void dx_py_to_composed(PyObject *value, dx_composed_field_t *field)
+{
+    if      (PyBool_Check(value))
+        dx_compose_insert_bool(field, PyInt_AS_LONG(value) ? 1 : 0);
+
+    //else if (PyFloat_Check(value))
+    //    dx_compose_insert_double(field, PyFloat_AS_DOUBLE(value));
+
+    else if (PyInt_Check(value))
+        dx_compose_insert_long(field, (int64_t) PyInt_AS_LONG(value));
+
+    else if (PyLong_Check(value))
+        dx_compose_insert_long(field, (int64_t) PyLong_AsLongLong(value));
+
+    else if (PyString_Check(value))
+        dx_compose_insert_string(field, PyString_AS_STRING(value));
+
+    else if (PyDict_Check(value)) {
+        Py_ssize_t  iter = 0;
+        PyObject   *key;
+        PyObject   *val;
+        dx_compose_start_map(field);
+        while (PyDict_Next(value, &iter, &key, &val)) {
+            dx_py_to_composed(key, field);
+            dx_py_to_composed(val, field);
+        }
+        dx_compose_end_map(field);
+    }
+
+    else if (PyList_Check(value)) {
+        Py_ssize_t count = PyList_Size(value);
+        dx_compose_start_list(field);
+        for (Py_ssize_t idx = 0; idx < count; idx++) {
+            PyObject *item = PyList_GetItem(value, idx);
+            dx_py_to_composed(item, field);
+        }
+        dx_compose_end_list(field);
+    }
+
+    else if (PyTuple_Check(value)) {
+        Py_ssize_t count = PyTuple_Size(value);
+        dx_compose_start_list(field);
+        for (Py_ssize_t idx = 0; idx < count; idx++) {
+            PyObject *item = PyTuple_GetItem(value, idx);
+            dx_py_to_composed(item, field);
+        }
+        dx_compose_end_list(field);
+    }
+}
+
+
+PyObject *dx_field_to_py(dx_parsed_field_t *field)
+{
+    PyObject *result = Py_None;
+    uint8_t   tag    = dx_parse_tag(field);
+
+    switch (tag) {
+    case DX_AMQP_NULL:
+        result = Py_None;
+        break;
+
+    case DX_AMQP_BOOLEAN:
+    case DX_AMQP_TRUE:
+    case DX_AMQP_FALSE:
+        result = dx_parse_as_uint(field) ? Py_True : Py_False;
+        break;
+
+    case DX_AMQP_UBYTE:
+    case DX_AMQP_USHORT:
+    case DX_AMQP_UINT:
+    case DX_AMQP_SMALLUINT:
+    case DX_AMQP_UINT0:
+        result = PyInt_FromLong((long) dx_parse_as_uint(field));
+        break;
+
+    case DX_AMQP_ULONG:
+    case DX_AMQP_SMALLULONG:
+    case DX_AMQP_ULONG0:
+    case DX_AMQP_TIMESTAMP:
+        result = PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) dx_parse_as_ulong(field));
+        break;
+
+    case DX_AMQP_BYTE:
+    case DX_AMQP_SHORT:
+    case DX_AMQP_INT:
+    case DX_AMQP_SMALLINT:
+        result = PyInt_FromLong((long) dx_parse_as_int(field));
+        break;
+
+    case DX_AMQP_LONG:
+    case DX_AMQP_SMALLLONG:
+        result = PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) dx_parse_as_long(field));
+        break;
+
+    case DX_AMQP_FLOAT:
+    case DX_AMQP_DOUBLE:
+    case DX_AMQP_DECIMAL32:
+    case DX_AMQP_DECIMAL64:
+    case DX_AMQP_DECIMAL128:
+    case DX_AMQP_UTF32:
+    case DX_AMQP_UUID:
+        break;
+
+    case DX_AMQP_VBIN8:
+    case DX_AMQP_VBIN32:
+    case DX_AMQP_STR8_UTF8:
+    case DX_AMQP_STR32_UTF8:
+    case DX_AMQP_SYM8:
+    case DX_AMQP_SYM32:
+        result = parsed_to_py_string(field);
+        break;
+
+    case DX_AMQP_LIST0:
+    case DX_AMQP_LIST8:
+    case DX_AMQP_LIST32: {
+        uint32_t count = dx_parse_sub_count(field);
+        result = PyList_New(count);
+        for (uint32_t idx = 0; idx < count; idx++) {
+            dx_parsed_field_t *sub = dx_parse_sub_value(field, idx);
+            PyObject *pysub = dx_field_to_py(sub);
+            if (pysub == 0)
+                return 0;
+            PyList_SetItem(result, idx, pysub);
+        }
+        break;
+    }
+    case DX_AMQP_MAP8:
+    case DX_AMQP_MAP32: {
+        uint32_t count = dx_parse_sub_count(field);
+        result = PyDict_New();
+        for (uint32_t idx = 0; idx < count; idx++) {
+            dx_parsed_field_t *key = dx_parse_sub_key(field, idx);
+            dx_parsed_field_t *val = dx_parse_sub_value(field, idx);
+            PyObject *pykey = parsed_to_py_string(key);
+            PyObject *pyval = dx_field_to_py(val);
+            if (pyval == 0)
+                return 0;
+            PyDict_SetItem(result, pykey, pyval);
+            Py_DECREF(pykey);
+            Py_DECREF(pyval);
+        }
+        break;
+    }
+    case DX_AMQP_ARRAY8:
+    case DX_AMQP_ARRAY32:
+        break;
+    }
+
+    return result;
+}
+

Modified: qpid/trunk/qpid/extras/dispatch/src/python_embedded.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/extras/dispatch/src/python_embedded.h?rev=1499787&r1=1499786&r2=1499787&view=diff
==============================================================================
--- qpid/trunk/qpid/extras/dispatch/src/python_embedded.h (original)
+++ qpid/trunk/qpid/extras/dispatch/src/python_embedded.h Thu Jul  4 15:28:37 2013
@@ -20,10 +20,16 @@
  */
 
 #include <Python.h>
+#include <qpid/dispatch/compose.h>
+#include <qpid/dispatch/parse.h>
+#include <qpid/dispatch/iterator.h>
 
 void dx_python_initialize();
 void dx_python_finalize();
 void dx_python_start();
 void dx_python_stop();
 
+void dx_py_to_composed(PyObject *value, dx_composed_field_t *field);
+PyObject *dx_field_to_py(dx_parsed_field_t *field);
+
 #endif



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org