/* {{{ proto void BulkWrite::update(array|object $query, array|object $newObj[, array $updateOptions = array()]) Adds an update operation to bulk */ PHP_METHOD(BulkWrite, update) { php_phongo_bulkwrite_t *intern; zval *query; zval *newObj; zval *updateOptions = NULL; mongoc_update_flags_t flags = MONGOC_UPDATE_NONE; bson_t *bquery; bson_t *bupdate; SUPPRESS_UNUSED_WARNING(return_value_ptr) SUPPRESS_UNUSED_WARNING(return_value) SUPPRESS_UNUSED_WARNING(return_value_used) intern = Z_BULKWRITE_OBJ_P(getThis()); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "AA|a!", &query, &newObj, &updateOptions) == FAILURE) { return; } bquery = bson_new(); bupdate = bson_new(); phongo_zval_to_bson(query, PHONGO_BSON_NONE, bquery, NULL TSRMLS_CC); phongo_zval_to_bson(newObj, PHONGO_BSON_NONE, bupdate, NULL TSRMLS_CC); if (updateOptions) { flags |= php_array_fetch_bool(updateOptions, "multi") ? MONGOC_UPDATE_MULTI_UPDATE : 0; flags |= php_array_fetch_bool(updateOptions, "upsert") ? MONGOC_UPDATE_UPSERT : 0; } if (flags & MONGOC_UPDATE_MULTI_UPDATE) { mongoc_bulk_operation_update(intern->bulk, bquery, bupdate, !!(flags & MONGOC_UPDATE_UPSERT)); } else { bson_iter_t iter; zend_bool replaced = 0; if (bson_iter_init(&iter, bupdate)) { while (bson_iter_next (&iter)) { if (!strchr (bson_iter_key (&iter), '$')) { mongoc_bulk_operation_replace_one(intern->bulk, bquery, bupdate, !!(flags & MONGOC_UPDATE_UPSERT)); replaced = 1; break; } } } if (!replaced) { mongoc_bulk_operation_update_one(intern->bulk, bquery, bupdate, !!(flags & MONGOC_UPDATE_UPSERT)); } } intern->num_ops++; bson_clear(&bquery); bson_clear(&bupdate); }
int lua_mongo_collection_update (lua_State *L) { collection_t *collection; bson_t filter = BSON_INITIALIZER; bson_t update = BSON_INITIALIZER; bool upsert; bool update_many; bson_error_t error; bool ret; mongoc_bulk_operation_t *bulk_update = NULL; bson_t reply = BSON_INITIALIZER; bool throw_error = false; collection = (collection_t *)luaL_checkudata(L, 1, "lua_mongoc_collection"); if (!(lua_isnil(L, 2))) { if (!(lua_table_to_bson(L, &filter, 2, false, &error))) { throw_error = true; goto DONE; } } if (lua_isnil(L, 3)) { luaL_error(L, "update parameters must be included"); } else { if (!(lua_table_to_bson(L, &update, 3, false, &error))) { throw_error = true; goto DONE; } } if ((lua_isboolean(L, 4))) { upsert = lua_toboolean(L, 4); } else { luaL_error(L, "upsert parameter must be a boolean"); } if ((lua_isboolean(L, 5))) { update_many = lua_toboolean(L, 5); } else { luaL_error(L, "update_many parameter must be a boolean"); } bulk_update = mongoc_collection_create_bulk_operation (collection->c_collection, false, NULL); if (update_many) { mongoc_bulk_operation_update(bulk_update, &filter, &update, upsert); } else { mongoc_bulk_operation_update_one(bulk_update, &filter, &update, upsert); } ret = mongoc_bulk_operation_execute (bulk_update, &reply, &error); if (!ret) { throw_error = true; goto DONE; } if (!(bson_document_or_array_to_table(L, &reply, true, &error))) { throw_error = true; goto DONE; } DONE: bson_destroy(&filter); bson_destroy(&update); bson_destroy(&reply); if (bulk_update) { mongoc_bulk_operation_destroy (bulk_update); } if (throw_error) { luaL_error(L, error.message); } return 1; }