From a61bda3fe3c80e80282beece3858d42536f1b60f Mon Sep 17 00:00:00 2001 From: Maga Napanga Date: Thu, 13 Mar 2014 19:13:20 +0100 Subject: [PATCH] added support for accessing getLastError document. new: mongoc_collection_get_last_error(). Documentation added. Related to: https://jira.mongodb.org/browse/CDRIVER-295 --- build/cmake/libmongoc-ssl.def | 1 + build/cmake/libmongoc.def | 1 + doc/mongoc_collection_get_last_error.txt | 46 ++++++++++++++++++ doc/mongoc_symbols.txt | 1 + src/libmongoc.symbols | 1 + src/mongoc/mongoc-client-private.h | 2 +- src/mongoc/mongoc-client.c | 16 +++++-- src/mongoc/mongoc-collection-private.h | 1 + src/mongoc/mongoc-collection.c | 60 ++++++++++++++++++++++-- src/mongoc/mongoc-collection.h | 1 + 10 files changed, 122 insertions(+), 8 deletions(-) create mode 100644 doc/mongoc_collection_get_last_error.txt diff --git a/build/cmake/libmongoc-ssl.def b/build/cmake/libmongoc-ssl.def index 9646c78de50..9b30c244c09 100644 --- a/build/cmake/libmongoc-ssl.def +++ b/build/cmake/libmongoc-ssl.def @@ -29,6 +29,7 @@ mongoc_collection_drop mongoc_collection_drop_index mongoc_collection_ensure_index mongoc_collection_find +mongoc_collection_get_last_error mongoc_collection_get_name mongoc_collection_get_read_prefs mongoc_collection_get_write_concern diff --git a/build/cmake/libmongoc.def b/build/cmake/libmongoc.def index 004ecbcb0c5..472d559c067 100644 --- a/build/cmake/libmongoc.def +++ b/build/cmake/libmongoc.def @@ -28,6 +28,7 @@ mongoc_collection_drop mongoc_collection_drop_index mongoc_collection_ensure_index mongoc_collection_find +mongoc_collection_get_last_error mongoc_collection_get_name mongoc_collection_get_read_prefs mongoc_collection_get_write_concern diff --git a/doc/mongoc_collection_get_last_error.txt b/doc/mongoc_collection_get_last_error.txt new file mode 100644 index 00000000000..c4ebcc2b541 --- /dev/null +++ b/doc/mongoc_collection_get_last_error.txt @@ -0,0 +1,46 @@ +mongoc_collection_get_last_error(3) +============================= + + +NAME +---- +mongoc_collection_get_last_error - Returns getLastError document. + + +SYNOPSIS +-------- +[source,c] +----------------------- +bson_t * +mongoc_collection_get_last_error (const mongoc_collection_t *collection); +----------------------- + + +DESCRIPTION +----------- +The _mongoc_collection_get_last_error()_ function shall return getLastError +document, according to write_concern on last executed command for current +collection instance. + +write_concern must be at least MONGOC_WRITE_CONCERN_W_DEFAULT (1) in +last command execution for getLastError to be available. + +Last executed command must be any of: +_mongoc_collection_insert()_ +_mongoc_collection_insert_bulk()_ +_mongoc_collection_update()_ +_mongoc_collection_delete()_ +_mongoc_collection_save()_ +_mongoc_collection_ensure_index()_ + + +RETURN VALUE +------------ +A newly allocated bson_t getLastError document, that *must* be destroyed +with _bson_destroy()_. Or NULL if no getLastError present. + + +AUTHORS +------- + +This page was written by MongoDB Inc. diff --git a/doc/mongoc_symbols.txt b/doc/mongoc_symbols.txt index fa62b20faae..871ab768d16 100644 --- a/doc/mongoc_symbols.txt +++ b/doc/mongoc_symbols.txt @@ -29,6 +29,7 @@ linkmongoc:mongoc_collection_drop[3] + linkmongoc:mongoc_collection_drop_index[3] + linkmongoc:mongoc_collection_ensure_index[3] + linkmongoc:mongoc_collection_find[3] + +linkmongoc:mongoc_collection_get_last_error[3] + linkmongoc:mongoc_collection_get_name[3] + linkmongoc:mongoc_collection_get_read_prefs[3] + linkmongoc:mongoc_collection_get_write_concern[3] + diff --git a/src/libmongoc.symbols b/src/libmongoc.symbols index 937fd570973..255b7d84738 100644 --- a/src/libmongoc.symbols +++ b/src/libmongoc.symbols @@ -29,6 +29,7 @@ mongoc_collection_drop mongoc_collection_drop_index mongoc_collection_ensure_index mongoc_collection_find +mongoc_collection_get_last_error mongoc_collection_get_name mongoc_collection_get_read_prefs mongoc_collection_get_write_concern diff --git a/src/mongoc/mongoc-client-private.h b/src/mongoc/mongoc-client-private.h index 54ccca5fb99..e729e9d117f 100644 --- a/src/mongoc/mongoc-client-private.h +++ b/src/mongoc/mongoc-client-private.h @@ -74,7 +74,7 @@ bool _mongoc_client_recv (mongoc_client_t *cli mongoc_buffer_t *buffer, uint32_t hint, bson_error_t *error); -bool _mongoc_client_recv_gle (mongoc_client_t *client, +bool _mongoc_client_recv_gle (mongoc_collection_t *collection, uint32_t hint, bson_error_t *error); uint32_t _mongoc_client_stamp (mongoc_client_t *client, diff --git a/src/mongoc/mongoc-client.c b/src/mongoc/mongoc-client.c index 368c8687cf6..850cac9ac75 100644 --- a/src/mongoc/mongoc-client.c +++ b/src/mongoc/mongoc-client.c @@ -554,10 +554,11 @@ _bson_to_error (const bson_t *b, */ bool -_mongoc_client_recv_gle (mongoc_client_t *client, +_mongoc_client_recv_gle (mongoc_collection_t *collection, uint32_t hint, bson_error_t *error) { + mongoc_client_t *client; mongoc_buffer_t buffer; mongoc_rpc_t rpc; bson_iter_t iter; @@ -566,6 +567,8 @@ _mongoc_client_recv_gle (mongoc_client_t *client, ENTRY; + bson_return_val_if_fail (collection, false); + client = collection->client; bson_return_val_if_fail (client, false); bson_return_val_if_fail (hint, false); @@ -594,9 +597,14 @@ _mongoc_client_recv_gle (mongoc_client_t *client, if (_mongoc_rpc_reply_get_first (&rpc.reply, &b)) { if (!bson_iter_init_find (&iter, &b, "ok") || - !BSON_ITER_HOLDS_DOUBLE (&iter) || - (bson_iter_double (&iter) == 0.0)) { - _bson_to_error (&b, error); + BSON_ITER_HOLDS_DOUBLE (&iter)) { + if (bson_iter_double (&iter) == 0.0) { + _bson_to_error (&b, error); + } + if (collection->gle) { + bson_destroy (collection->gle); + } + collection->gle = bson_copy (&b); } bson_destroy (&b); } diff --git a/src/mongoc/mongoc-collection-private.h b/src/mongoc/mongoc-collection-private.h index 050d7cab0cc..69f8ec5fbfe 100644 --- a/src/mongoc/mongoc-collection-private.h +++ b/src/mongoc/mongoc-collection-private.h @@ -40,6 +40,7 @@ struct _mongoc_collection_t mongoc_read_prefs_t *read_prefs; mongoc_write_concern_t *write_concern; + bson_t *gle; }; diff --git a/src/mongoc/mongoc-collection.c b/src/mongoc/mongoc-collection.c index 93f3bb2a86f..52db8112690 100644 --- a/src/mongoc/mongoc-collection.c +++ b/src/mongoc/mongoc-collection.c @@ -99,6 +99,8 @@ _mongoc_collection_new (mongoc_client_t *client, _mongoc_buffer_init(&col->buffer, NULL, 0, NULL); + col->gle = NULL; + RETURN(col); } @@ -127,6 +129,10 @@ mongoc_collection_destroy (mongoc_collection_t *collection) /* IN */ bson_return_if_fail(collection); + if (collection->gle) { + bson_destroy(collection->gle); + } + _mongoc_buffer_destroy(&collection->buffer); if (collection->read_prefs) { @@ -293,6 +299,10 @@ mongoc_collection_find (mongoc_collection_t *collection, /* IN */ read_prefs = collection->read_prefs; } + if (collection->gle) { + bson_destroy(collection->gle); + } + return _mongoc_cursor_new(collection->client, collection->ns, flags, skip, limit, batch_size, false, query, fields, read_prefs); } @@ -344,6 +354,10 @@ mongoc_collection_command (mongoc_collection_t *collection, read_prefs = collection->read_prefs; } + if (collection->gle) { + bson_destroy(collection->gle); + } + return mongoc_client_command (collection->client, collection->db, flags, skip, limit, batch_size, query, fields, read_prefs); } @@ -358,6 +372,10 @@ mongoc_collection_command_simple (mongoc_collection_t *collection, BSON_ASSERT (collection); BSON_ASSERT (command); + if (collection->gle) { + bson_destroy(collection->gle); + } + return mongoc_client_command_simple (collection->client, collection->db, command, read_prefs, reply, error); } @@ -722,6 +740,11 @@ _mongoc_collection_insert_bulk_raw (mongoc_collection_t *collection, bson_init_static (&reply_bson, reply.reply.documents, reply.reply.documents_len); + if (collection->gle) { + bson_destroy (collection->gle); + } + collection->gle = bson_copy (&reply_bson); + if (bson_iter_init_find (&reply_iter, &reply_bson, "err") && BSON_ITER_HOLDS_UTF8 (&reply_iter)) { errmsg = bson_iter_utf8 (&reply_iter, NULL); @@ -771,6 +794,7 @@ _mongoc_collection_insert_bulk_raw (mongoc_collection_t *collection, * not actually inserted on the MongoDB server or cluster. * * Side effects: + * @collection->gle is setup, depending on write_concern->w value. * @error may be set upon failure if non-NULL. * *-------------------------------------------------------------------------- @@ -856,6 +880,7 @@ mongoc_collection_insert_bulk (mongoc_collection_t *collection, * not actually inserted on the MongoDB server or cluster. * * Side effects: + * @collection->gle is setup, depending on write_concern->w value. * @error may be set upon failure if non-NULL. * *-------------------------------------------------------------------------- @@ -911,6 +936,7 @@ mongoc_collection_insert (mongoc_collection_t *collection, * true if successful; otherwise false and @error is set. * * Side effects: + * @collection->gle is setup, depending on write_concern->w value. * @error is setup upon failure. * *-------------------------------------------------------------------------- @@ -979,7 +1005,7 @@ mongoc_collection_update (mongoc_collection_t *collection, } if (_mongoc_write_concern_has_gle (write_concern)) { - if (!_mongoc_client_recv_gle (collection->client, hint, error)) { + if (!_mongoc_client_recv_gle (collection, hint, error)) { RETURN(false); } } @@ -1068,7 +1094,8 @@ mongoc_collection_save (mongoc_collection_t *collection, * function may return true even if it failed. * * Side effects: - * None. + * @collection->gle is setup, depending on write_concern->w value. + * @error is setup upon failure. * *-------------------------------------------------------------------------- */ @@ -1109,7 +1136,7 @@ mongoc_collection_delete (mongoc_collection_t *collection, } if (_mongoc_write_concern_has_gle(write_concern)) { - if (!_mongoc_client_recv_gle(collection->client, hint, error)) { + if (!_mongoc_client_recv_gle (collection, hint, error)) { return false; } } @@ -1256,3 +1283,30 @@ mongoc_collection_get_name (mongoc_collection_t *collection) return collection->collection; } + + +/* + *-------------------------------------------------------------------------- + * + * mongoc_collection_get_last_error -- + * + * Returns getLastError document, according to write_concern on last + * executed command for current collection instance. + * + * Returns: + * A newly allocated bson_t getLastError document, that *must* be + * destroyed with bson_destroy(). Or NULL if no getLastError present. + * + * Side effects: + * None. + * + *-------------------------------------------------------------------------- + */ + +bson_t * +mongoc_collection_get_last_error (const mongoc_collection_t *collection) +{ + bson_return_val_if_fail (collection, NULL); + + return collection->gle ? bson_copy (collection->gle) : NULL; +} diff --git a/src/mongoc/mongoc-collection.h b/src/mongoc/mongoc-collection.h index 5b3affeafff..fcb219ab0eb 100644 --- a/src/mongoc/mongoc-collection.h +++ b/src/mongoc/mongoc-collection.h @@ -114,6 +114,7 @@ const mongoc_write_concern_t *mongoc_collection_get_write_concern (const mong void mongoc_collection_set_write_concern (mongoc_collection_t *collection, const mongoc_write_concern_t *write_concern); const char *mongoc_collection_get_name (mongoc_collection_t *collection); +bson_t *mongoc_collection_get_last_error (const mongoc_collection_t *collection); char *mongoc_collection_keys_to_index_string (const bson_t *keys);