Skip to content

Commit 0cae425

Browse files
committed
Fixes for batched update/delete
o Expands scope to all bulk write methods o Fixes for 2.4 o Fixes for upserts
1 parent dcc9053 commit 0cae425

File tree

5 files changed

+211
-158
lines changed

5 files changed

+211
-158
lines changed

src/mongoc/mongoc-bulk-operation.c

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,12 @@ mongoc_bulk_operation_remove (mongoc_bulk_operation_t *bulk, /* IN */
128128
bulk->commands.len - 1);
129129
if ((last->type == MONGOC_WRITE_COMMAND_DELETE) &&
130130
last->u.delete.multi) {
131-
_mongoc_write_command_delete_append (last, &selector, 1);
131+
_mongoc_write_command_delete_append (last, selector);
132132
EXIT;
133133
}
134134
}
135135

136-
_mongoc_write_command_init_delete (&command, &selector, 1, true, bulk->ordered);
136+
_mongoc_write_command_init_delete (&command, selector, true, bulk->ordered);
137137

138138
_mongoc_array_append_val (&bulk->commands, command);
139139

@@ -159,13 +159,12 @@ mongoc_bulk_operation_remove_one (mongoc_bulk_operation_t *bulk, /* IN */
159159
bulk->commands.len - 1);
160160
if ((last->type == MONGOC_WRITE_COMMAND_DELETE) &&
161161
!last->u.delete.multi) {
162-
_mongoc_write_command_delete_append (last, &selector, 1);
162+
_mongoc_write_command_delete_append (last, selector);
163163
EXIT;
164164
}
165165
}
166166

167-
_mongoc_write_command_init_delete (&command, &selector, 1, false,
168-
bulk->ordered);
167+
_mongoc_write_command_init_delete (&command, selector, false, bulk->ordered);
169168

170169
_mongoc_array_append_val (&bulk->commands, command);
171170

@@ -237,6 +236,7 @@ mongoc_bulk_operation_replace_one (mongoc_bulk_operation_t *bulk,
237236
{
238237
mongoc_write_command_t command = { 0 };
239238
size_t err_off;
239+
mongoc_write_command_t *last;
240240

241241
bson_return_if_fail (bulk);
242242
bson_return_if_fail (selector);
@@ -253,6 +253,16 @@ mongoc_bulk_operation_replace_one (mongoc_bulk_operation_t *bulk,
253253
EXIT;
254254
}
255255

256+
if (bulk->commands.len) {
257+
last = &_mongoc_array_index (&bulk->commands,
258+
mongoc_write_command_t,
259+
bulk->commands.len - 1);
260+
if (last->type == MONGOC_WRITE_COMMAND_UPDATE) {
261+
_mongoc_write_command_update_append (last, selector, document, upsert, false);
262+
EXIT;
263+
}
264+
}
265+
256266
_mongoc_write_command_init_update (&command, selector, document, upsert,
257267
false, bulk->ordered);
258268
_mongoc_array_append_val (&bulk->commands, command);
@@ -293,7 +303,7 @@ mongoc_bulk_operation_update (mongoc_bulk_operation_t *bulk,
293303
mongoc_write_command_t,
294304
bulk->commands.len - 1);
295305
if (last->type == MONGOC_WRITE_COMMAND_UPDATE) {
296-
_mongoc_write_command_update_append (last, selector, document, multi, upsert);
306+
_mongoc_write_command_update_append (last, selector, document, upsert, multi);
297307
EXIT;
298308
}
299309
}
@@ -313,6 +323,7 @@ mongoc_bulk_operation_update_one (mongoc_bulk_operation_t *bulk,
313323
{
314324
mongoc_write_command_t command = { 0 };
315325
bson_iter_t iter;
326+
mongoc_write_command_t *last;
316327

317328
bson_return_if_fail (bulk);
318329
bson_return_if_fail (selector);
@@ -330,6 +341,16 @@ mongoc_bulk_operation_update_one (mongoc_bulk_operation_t *bulk,
330341
}
331342
}
332343

344+
if (bulk->commands.len) {
345+
last = &_mongoc_array_index (&bulk->commands,
346+
mongoc_write_command_t,
347+
bulk->commands.len - 1);
348+
if (last->type == MONGOC_WRITE_COMMAND_UPDATE) {
349+
_mongoc_write_command_update_append (last, selector, document, upsert, false);
350+
EXIT;
351+
}
352+
}
353+
333354
_mongoc_write_command_init_update (&command, selector, document, upsert,
334355
false, bulk->ordered);
335356
_mongoc_array_append_val (&bulk->commands, command);

src/mongoc/mongoc-collection.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1395,7 +1395,7 @@ mongoc_collection_remove (mongoc_collection_t *collection,
13951395
multi = !(flags & MONGOC_REMOVE_SINGLE_REMOVE);
13961396

13971397
_mongoc_write_result_init (&result);
1398-
_mongoc_write_command_init_delete (&command, &selector, 1, multi, true);
1398+
_mongoc_write_command_init_delete (&command, selector, multi, true);
13991399

14001400
_mongoc_write_command_execute (&command, collection->client, 0,
14011401
collection->db, collection->collection,

src/mongoc/mongoc-error.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ typedef enum
8080
MONGOC_ERROR_COMMAND_INVALID_ARG,
8181

8282
MONGOC_ERROR_COLLECTION_INSERT_FAILED,
83-
MONGOC_ERROR_COLLECTION_UPDATE_FAILED,
83+
MONGOC_ERROR_COLLECTION_UPDATE_FAILED,
84+
MONGOC_ERROR_COLLECTION_DELETE_FAILED,
8485
MONGOC_ERROR_COLLECTION_DOES_NOT_EXIST = 26,
8586

8687
MONGOC_ERROR_GRIDFS_INVALID_FILENAME,

src/mongoc/mongoc-write-command-private.h

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,10 @@ void _mongoc_write_command_init_insert (mongoc_write_command_t *command,
9191
uint32_t n_documents,
9292
bool ordered,
9393
bool allow_bulk_op_insert);
94-
void _mongoc_write_command_init_delete (mongoc_write_command_t *command,
95-
const bson_t * const *selectors,
96-
uint32_t n_selectors,
97-
bool multi,
98-
bool ordered);
94+
void _mongoc_write_command_init_delete (mongoc_write_command_t *command,
95+
const bson_t *selectors,
96+
bool multi,
97+
bool ordered);
9998
void _mongoc_write_command_init_update (mongoc_write_command_t *command,
10099
const bson_t *selector,
101100
const bson_t *update,
@@ -109,12 +108,11 @@ void _mongoc_write_command_insert_append (mongoc_write_command_t *command,
109108
void _mongoc_write_command_update_append (mongoc_write_command_t *command,
110109
const bson_t *selector,
111110
const bson_t *update,
112-
bool upsert,
113-
bool multi);
111+
bool upsert,
112+
bool multi);
114113

115114
void _mongoc_write_command_delete_append (mongoc_write_command_t *command,
116-
const bson_t * const *selectors,
117-
uint32_t n_selectors);
115+
const bson_t *selector);
118116

119117
void _mongoc_write_command_execute (mongoc_write_command_t *command,
120118
mongoc_client_t *client,

0 commit comments

Comments
 (0)