void _mongoc_write_command_execute_idl (mongoc_write_command_t *command, mongoc_client_t *client, mongoc_server_stream_t *server_stream, const char *database, const char *collection, uint32_t offset, const mongoc_crud_opts_t *crud, mongoc_write_result_t *result) { ENTRY; BSON_ASSERT (command); BSON_ASSERT (client); BSON_ASSERT (server_stream); BSON_ASSERT (database); BSON_ASSERT (collection); BSON_ASSERT (result); if (command->flags.has_collation) { if (!mongoc_write_concern_is_acknowledged (crud->writeConcern)) { result->failed = true; bson_set_error (&result->error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot set collation for unacknowledged writes"); EXIT; } if (server_stream->sd->max_wire_version < WIRE_VERSION_COLLATION) { bson_set_error (&result->error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION, "The selected server does not support collation"); result->failed = true; EXIT; } } if (command->flags.has_array_filters) { if (!mongoc_write_concern_is_acknowledged (crud->writeConcern)) { result->failed = true; bson_set_error (&result->error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot use array filters with unacknowledged writes"); EXIT; } if (server_stream->sd->max_wire_version < WIRE_VERSION_ARRAY_FILTERS) { bson_set_error (&result->error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION, "The selected server does not support array filters"); result->failed = true; EXIT; } } if (command->flags.bypass_document_validation != MONGOC_BYPASS_DOCUMENT_VALIDATION_DEFAULT) { if (!mongoc_write_concern_is_acknowledged (crud->writeConcern)) { result->failed = true; bson_set_error ( &result->error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot set bypassDocumentValidation for unacknowledged writes"); EXIT; } } if (crud->client_session && !mongoc_write_concern_is_acknowledged (crud->writeConcern)) { result->failed = true; bson_set_error (&result->error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot use client session with unacknowledged writes"); EXIT; } if (command->payload.len == 0) { _empty_error (command, &result->error); EXIT; } if (server_stream->sd->max_wire_version >= WIRE_VERSION_OP_MSG) { _mongoc_write_opmsg (command, client, server_stream, database, collection, crud->writeConcern, offset, crud->client_session, result, &result->error); } else { if (mongoc_write_concern_is_acknowledged (crud->writeConcern)) { _mongoc_write_opquery (command, client, server_stream, database, collection, crud->writeConcern, offset, result, &result->error); } else { gLegacyWriteOps[command->type](command, client, server_stream, database, collection, offset, result, &result->error); } } EXIT; }
void _mongoc_write_command_execute ( mongoc_write_command_t *command, /* IN */ mongoc_client_t *client, /* IN */ mongoc_server_stream_t *server_stream, /* IN */ const char *database, /* IN */ const char *collection, /* IN */ const mongoc_write_concern_t *write_concern, /* IN */ uint32_t offset, /* IN */ mongoc_client_session_t *cs, /* IN */ mongoc_write_result_t *result) /* OUT */ { ENTRY; BSON_ASSERT (command); BSON_ASSERT (client); BSON_ASSERT (server_stream); BSON_ASSERT (database); BSON_ASSERT (collection); BSON_ASSERT (result); if (!write_concern) { write_concern = client->write_concern; } if (!mongoc_write_concern_is_valid (write_concern)) { bson_set_error (&result->error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "The write concern is invalid."); result->failed = true; EXIT; } if (command->flags.has_collation) { if (!mongoc_write_concern_is_acknowledged (write_concern)) { result->failed = true; bson_set_error (&result->error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot set collation for unacknowledged writes"); EXIT; } if (server_stream->sd->max_wire_version < WIRE_VERSION_COLLATION) { bson_set_error (&result->error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION, "Collation is not supported by the selected server"); result->failed = true; EXIT; } } if (command->flags.bypass_document_validation != MONGOC_BYPASS_DOCUMENT_VALIDATION_DEFAULT) { if (!mongoc_write_concern_is_acknowledged (write_concern)) { result->failed = true; bson_set_error ( &result->error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot set bypassDocumentValidation for unacknowledged writes"); EXIT; } } if (command->payload.len == 0) { _empty_error (command, &result->error); EXIT; } if (server_stream->sd->max_wire_version >= WIRE_VERSION_OP_MSG) { if (cs && !mongoc_write_concern_is_acknowledged (write_concern)) { bson_set_error ( &result->error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot use client session with unacknowledged writes"); EXIT; } _mongoc_write_opmsg (command, client, server_stream, database, collection, write_concern, offset, cs, result, &result->error); } else { if (mongoc_write_concern_is_acknowledged (write_concern)) { _mongoc_write_opquery (command, client, server_stream, database, collection, write_concern, offset, result, &result->error); } else { gLegacyWriteOps[command->type](command, client, server_stream, database, collection, offset, result, &result->error); } } EXIT; }