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