Skip to content

Commit 20ca2dd

Browse files
committed
Allow array or document for updateOne/Many update arg
1 parent 3535b1a commit 20ca2dd

File tree

3 files changed

+46
-5
lines changed

3 files changed

+46
-5
lines changed

src/libmongoc/tests/bsonutil/bson-parser.c

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ typedef enum {
2727
BSON_PARSER_BOOL,
2828
BSON_PARSER_DOC,
2929
BSON_PARSER_ARRAY,
30+
BSON_PARSER_ARRAY_OR_DOC,
3031
BSON_PARSER_ANY,
3132
BSON_PARSER_WRITE_CONCERN,
3233
BSON_PARSER_READ_CONCERN,
@@ -62,6 +63,8 @@ parser_type_to_string (bson_parser_type_t ptype)
6263
return "DOC";
6364
case BSON_PARSER_ARRAY:
6465
return "ARRAY";
66+
case BSON_PARSER_ARRAY_OR_DOC:
67+
return "ARRAY or DOC";
6568
case BSON_PARSER_ANY:
6669
return "ANY";
6770
case BSON_PARSER_WRITE_CONCERN:
@@ -240,7 +243,8 @@ bson_parser_entry_destroy (bson_parser_entry_t *entry, bool with_parsed_fields)
240243
{
241244
if (with_parsed_fields) {
242245
if (entry->ptype == BSON_PARSER_DOC ||
243-
entry->ptype == BSON_PARSER_ARRAY) {
246+
entry->ptype == BSON_PARSER_ARRAY ||
247+
entry->ptype == BSON_PARSER_ARRAY_OR_DOC) {
244248
bson_t **out;
245249

246250
out = (bson_t **) entry->out;
@@ -399,6 +403,23 @@ bson_parser_array_optional (bson_parser_t *parser,
399403
bson_parser_add_entry (parser, key, (void *) out, BSON_PARSER_ARRAY, true);
400404
}
401405

406+
void
407+
bson_parser_array_or_doc (bson_parser_t *parser, const char *key, bson_t **out)
408+
{
409+
*out = NULL;
410+
bson_parser_add_entry (
411+
parser, key, (void *) out, BSON_PARSER_ARRAY_OR_DOC, false);
412+
}
413+
void
414+
bson_parser_array_or_doc_optional (bson_parser_t *parser,
415+
const char *key,
416+
bson_t **out)
417+
{
418+
*out = NULL;
419+
bson_parser_add_entry (
420+
parser, key, (void *) out, BSON_PARSER_ARRAY_OR_DOC, true);
421+
}
422+
402423
void
403424
bson_parser_bool (bson_parser_t *parser, const char *key, bool **out)
404425
{
@@ -579,6 +600,19 @@ entry_marshal (bson_parser_entry_t *entry,
579600
*out = bson_copy (&tmp);
580601
}
581602

603+
else if (ptype == BSON_PARSER_ARRAY_OR_DOC) {
604+
bson_t tmp;
605+
bson_t **out = (bson_t **) entry->out;
606+
607+
if (btype != BSON_TYPE_ARRAY && btype != BSON_TYPE_DOCUMENT) {
608+
marshal_error (key, btype, ptype, error);
609+
goto done;
610+
}
611+
612+
bson_iter_bson (iter, &tmp);
613+
*out = bson_copy (&tmp);
614+
}
615+
582616
else if (ptype == BSON_PARSER_ANY) {
583617
bson_val_t **out = (bson_val_t **) entry->out;
584618

src/libmongoc/tests/bsonutil/bson-parser.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,13 @@ bson_parser_array (bson_parser_t *bp, const char *key, bson_t **out);
8181
void
8282
bson_parser_array_optional (bson_parser_t *bp, const char *key, bson_t **out);
8383

84+
void
85+
bson_parser_array_or_doc (bson_parser_t *bp, const char *key, bson_t **out);
86+
void
87+
bson_parser_array_or_doc_optional (bson_parser_t *bp,
88+
const char *key,
89+
bson_t **out);
90+
8491
void
8592
bson_parser_bool (bson_parser_t *bp, const char *key, bool **out);
8693
void

src/libmongoc/tests/unified/operation.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ bulk_op_append (mongoc_bulk_operation_t *bulk,
422422
}
423423
} else if (0 == strcmp (op_type, "updateOne")) {
424424
bson_parser_doc (parser, "filter", &filter);
425-
bson_parser_doc (parser, "update", &update);
425+
bson_parser_array_or_doc (parser, "update", &update);
426426
if (!bson_parser_parse (parser, &request_doc, error)) {
427427
goto done;
428428
}
@@ -432,7 +432,7 @@ bulk_op_append (mongoc_bulk_operation_t *bulk,
432432
}
433433
} else if (0 == strcmp (op_type, "updateMany")) {
434434
bson_parser_doc (parser, "filter", &filter);
435-
bson_parser_doc (parser, "update", &update);
435+
bson_parser_array_or_doc (parser, "update", &update);
436436
if (!bson_parser_parse (parser, &request_doc, error)) {
437437
goto done;
438438
}
@@ -1209,7 +1209,7 @@ operation_update_one (test_t *test,
12091209
parser = bson_parser_new ();
12101210
bson_parser_allow_extra (parser, true);
12111211
bson_parser_doc (parser, "filter", &filter);
1212-
bson_parser_doc (parser, "update", &update);
1212+
bson_parser_array_or_doc (parser, "update", &update);
12131213
if (!bson_parser_parse (parser, op->arguments, error)) {
12141214
goto done;
12151215
}
@@ -1253,7 +1253,7 @@ operation_update_many (test_t *test,
12531253
parser = bson_parser_new ();
12541254
bson_parser_allow_extra (parser, true);
12551255
bson_parser_doc (parser, "filter", &filter);
1256-
bson_parser_doc (parser, "update", &update);
1256+
bson_parser_array_or_doc (parser, "update", &update);
12571257
if (!bson_parser_parse (parser, op->arguments, error)) {
12581258
goto done;
12591259
}

0 commit comments

Comments
 (0)