diff --git a/pymongo/_cmessagemodule.c b/pymongo/_cmessagemodule.c index 68dd3f340..47d59beb4 100644 --- a/pymongo/_cmessagemodule.c +++ b/pymongo/_cmessagemodule.c @@ -181,16 +181,29 @@ static PyObject* _cbson_insert_message(PyObject* self, PyObject* args) { buffer_t buffer; int length_location, message_length; PyObject* result; + PyObject* codec_options = Py_None; + PyObject* as_class; + unsigned char tz_aware; - if (!PyArg_ParseTuple(args, "et#ObbObb", + if (!PyArg_ParseTuple(args, "et#ObbObb|O", "utf-8", &collection_name, &collection_name_length, &docs, &check_keys, &safe, &last_error_args, - &continue_on_error, &uuid_subtype)) { + &continue_on_error, &uuid_subtype, + &codec_options)) { return NULL; } + + if (codec_options != Py_None) { + if (!PyArg_ParseTuple(codec_options, "Obb", + &as_class, &tz_aware, &uuid_subtype)) { + PyMem_Free(collection_name); + return NULL; + } + } + if (continue_on_error) { options += 1; } @@ -307,16 +320,28 @@ static PyObject* _cbson_update_message(PyObject* self, PyObject* args) { buffer_t buffer; int length_location, message_length; PyObject* result; + PyObject* codec_options = Py_None; + PyObject* as_class; + unsigned char tz_aware; - if (!PyArg_ParseTuple(args, "et#bbOObObb", + if (!PyArg_ParseTuple(args, "et#bbOObObb|O", "utf-8", &collection_name, &collection_name_length, &upsert, &multi, &spec, &doc, &safe, - &last_error_args, &check_keys, &uuid_subtype)) { + &last_error_args, &check_keys, &uuid_subtype, + &codec_options)) { return NULL; } + if (codec_options != Py_None) { + if (!PyArg_ParseTuple(codec_options, "Obb", + &as_class, &tz_aware, &uuid_subtype)) { + PyMem_Free(collection_name); + return NULL; + } + } + options = 0; if (upsert) { options += 1; @@ -410,16 +435,29 @@ static PyObject* _cbson_query_message(PyObject* self, PyObject* args) { buffer_t buffer; int length_location, message_length; PyObject* result; + PyObject* codec_options = Py_None; + PyObject* as_class; + unsigned char tz_aware; - if (!PyArg_ParseTuple(args, "Iet#iiO|Ob", + if (!PyArg_ParseTuple(args, "Iet#iiO|ObO", &options, "utf-8", &collection_name, &collection_name_length, &num_to_skip, &num_to_return, - &query, &field_selector, &uuid_subtype)) { + &query, &field_selector, &uuid_subtype, + &codec_options)) { return NULL; } + + if (codec_options != Py_None) { + if (!PyArg_ParseTuple(codec_options, "Obb", + &as_class, &tz_aware, &uuid_subtype)) { + PyMem_Free(collection_name); + return NULL; + } + } + buffer = buffer_new(); if (!buffer) { PyErr_NoMemory(); diff --git a/pymongo/message.py b/pymongo/message.py index 17c09c000..43dbe31bb 100644 --- a/pymongo/message.py +++ b/pymongo/message.py @@ -81,7 +81,8 @@ def __pack_message(operation, data): def insert(collection_name, docs, check_keys, - safe, last_error_args, continue_on_error, uuid_subtype): + safe, last_error_args, continue_on_error, uuid_subtype, + codec_options=None): """Get an **insert** message. .. note:: As of PyMongo 2.6, this function is no longer used. It @@ -90,6 +91,8 @@ def insert(collection_name, docs, check_keys, be removed in a future release. """ + if codec_options is not None: + uuid_subtype = codec_options.uuid_representation options = 0 if continue_on_error: options += 1 @@ -113,9 +116,12 @@ if _use_c: def update(collection_name, upsert, multi, - spec, doc, safe, last_error_args, check_keys, uuid_subtype): + spec, doc, safe, last_error_args, check_keys, uuid_subtype, + codec_options=None): """Get an **update** message. """ + if codec_options is not None: + uuid_subtype = codec_options.uuid_representation options = 0 if upsert: options += 1 @@ -142,9 +148,11 @@ if _use_c: def query(options, collection_name, num_to_skip, num_to_return, query, field_selector=None, - uuid_subtype=OLD_UUID_SUBTYPE): + uuid_subtype=OLD_UUID_SUBTYPE, codec_options=None): """Get a **query** message. """ + if codec_options is not None: + uuid_subtype = codec_options.uuid_representation data = struct.pack("= 1.1.1")