From 0d73e362f9d941c2fea24118a9d4ae36e84550bd Mon Sep 17 00:00:00 2001 From: Jeremy Mikola Date: Fri, 7 Aug 2015 15:22:38 -0400 Subject: [PATCH] PHPC-271: Server::executeBulkWrite() should take a write concern --- src/MongoDB/Server.c | 8 ++-- tests/server/server-executeBulkWrite-002.phpt | 31 +++++++++++++ tests/server/server-executeBulkWrite-003.phpt | 36 ++++++++++++++++ tests/server/server-executeBulkWrite-004.phpt | 43 +++++++++++++++++++ tests/server/server-executeBulkWrite-005.phpt | 37 ++++++++++++++++ 5 files changed, 152 insertions(+), 3 deletions(-) create mode 100644 tests/server/server-executeBulkWrite-002.phpt create mode 100644 tests/server/server-executeBulkWrite-003.phpt create mode 100644 tests/server/server-executeBulkWrite-004.phpt create mode 100644 tests/server/server-executeBulkWrite-005.phpt diff --git a/src/MongoDB/Server.c b/src/MongoDB/Server.c index 6ad96c9c..75f17fab 100644 --- a/src/MongoDB/Server.c +++ b/src/MongoDB/Server.c @@ -102,7 +102,7 @@ PHP_METHOD(Server, executeQuery) phongo_execute_query(intern->client, namespace, phongo_query_from_zval(zquery TSRMLS_CC), NULL, intern->server_id, return_value, return_value_used TSRMLS_CC); } /* }}} */ -/* {{{ proto MongoDB\Driver\WriteResult Server::executeBulkWrite(string $namespace, MongoDB\Driver\BulkWrite $zbulk) +/* {{{ proto MongoDB\Driver\WriteResult Server::executeBulkWrite(string $namespace, MongoDB\Driver\BulkWrite $zbulk[, MongoDB\Driver\WriteConcern $writeConcern = null]) Executes a write operation bulk (e.g. insert, update, delete) */ PHP_METHOD(Server, executeBulkWrite) { @@ -110,19 +110,20 @@ PHP_METHOD(Server, executeBulkWrite) char *namespace; int namespace_len; zval *zbulk; + zval *zwrite_concern = NULL; php_phongo_bulkwrite_t *bulk; (void)return_value_ptr; intern = (php_phongo_server_t *)zend_object_store_get_object(getThis() TSRMLS_CC); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sO", &namespace, &namespace_len, &zbulk, php_phongo_bulkwrite_ce) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sO|O!", &namespace, &namespace_len, &zbulk, php_phongo_bulkwrite_ce, &zwrite_concern, php_phongo_writeconcern_ce) == FAILURE) { return; } bulk = (php_phongo_bulkwrite_t *)zend_object_store_get_object(zbulk TSRMLS_CC); - phongo_execute_write(intern->client, namespace, bulk->bulk, NULL, intern->server_id, return_value, return_value_used TSRMLS_CC); + phongo_execute_write(intern->client, namespace, bulk->bulk, phongo_write_concern_from_zval(zwrite_concern TSRMLS_CC), intern->server_id, return_value, return_value_used TSRMLS_CC); } /* }}} */ /* {{{ proto string Server::getHost() @@ -400,6 +401,7 @@ ZEND_END_ARG_INFO(); ZEND_BEGIN_ARG_INFO_EX(ai_Server_executeBulkWrite, 0, 0, 2) ZEND_ARG_INFO(0, namespace) ZEND_ARG_OBJ_INFO(0, zbulk, MongoDB\\Driver\\BulkWrite, 0) + ZEND_ARG_OBJ_INFO(0, writeConcern, MongoDB\\Driver\\WriteConcern, 1) ZEND_END_ARG_INFO(); ZEND_BEGIN_ARG_INFO_EX(ai_Server_getHost, 0, 0, 0) diff --git a/tests/server/server-executeBulkWrite-002.phpt b/tests/server/server-executeBulkWrite-002.phpt new file mode 100644 index 00000000..0ef1a3bd --- /dev/null +++ b/tests/server/server-executeBulkWrite-002.phpt @@ -0,0 +1,31 @@ +--TEST-- +MongoDB\Driver\Server::executeBulkWrite() with write concern (standalone) +--SKIPIF-- + +--FILE-- +selectServer(new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY)); + +$writeConcerns = array(0, 1); + +foreach ($writeConcerns as $writeConcern) { + $bulk = new MongoDB\Driver\BulkWrite(); + $bulk->insert(array('wc' => $writeConcern)); + + $result = $primary->executeBulkWrite(NS, $bulk, new MongoDB\Driver\WriteConcern($writeConcern)); + var_dump($result->isAcknowledged()); + var_dump($result->getInsertedCount()); +} + +?> +===DONE=== + +--EXPECT-- +bool(false) +int(0) +bool(true) +int(1) +===DONE=== diff --git a/tests/server/server-executeBulkWrite-003.phpt b/tests/server/server-executeBulkWrite-003.phpt new file mode 100644 index 00000000..314ed1aa --- /dev/null +++ b/tests/server/server-executeBulkWrite-003.phpt @@ -0,0 +1,36 @@ +--TEST-- +MongoDB\Driver\Server::executeBulkWrite() with write concern (replica set primary) +--SKIPIF-- + + +--FILE-- +selectServer(new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY)); + +$writeConcerns = array(0, 1, 2, MongoDB\Driver\WriteConcern::MAJORITY); + +foreach ($writeConcerns as $wc) { + $bulk = new MongoDB\Driver\BulkWrite(); + $bulk->insert(array('wc' => $wc)); + + $result = $server->executeBulkWrite(NS, $bulk, new MongoDB\Driver\WriteConcern($wc)); + var_dump($result->isAcknowledged()); + var_dump($result->getInsertedCount()); +} + +?> +===DONE=== + +--EXPECT-- +bool(false) +int(0) +bool(true) +int(1) +bool(true) +int(1) +bool(true) +int(1) +===DONE=== diff --git a/tests/server/server-executeBulkWrite-004.phpt b/tests/server/server-executeBulkWrite-004.phpt new file mode 100644 index 00000000..a10c47da --- /dev/null +++ b/tests/server/server-executeBulkWrite-004.phpt @@ -0,0 +1,43 @@ +--TEST-- +MongoDB\Driver\Server::executeBulkWrite() with write concern (replica set secondary) +--SKIPIF-- + + +--FILE-- +selectServer(new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_SECONDARY)); + +$bulk = new MongoDB\Driver\BulkWrite(); +$bulk->insert(array('wc' => 0)); + +$result = $server->executeBulkWrite(NS, $bulk, new MongoDB\Driver\WriteConcern(0)); +var_dump($result->isAcknowledged()); +var_dump($result->getInsertedCount()); + +$writeConcerns = array(1, 2, MongoDB\Driver\WriteConcern::MAJORITY); + +foreach ($writeConcerns as $wc) { + $bulk = new MongoDB\Driver\BulkWrite(); + $bulk->insert(array('wc' => $wc)); + + echo throws(function() use ($server, $bulk, $wc) { + $server->executeBulkWrite(NS, $bulk, new MongoDB\Driver\WriteConcern($wc)); + }, "MongoDB\Driver\Exception\RuntimeException"), "\n"; +} + +?> +===DONE=== + +--EXPECT-- +bool(false) +int(0) +OK: Got MongoDB\Driver\Exception\RuntimeException +not master +OK: Got MongoDB\Driver\Exception\RuntimeException +not master +OK: Got MongoDB\Driver\Exception\RuntimeException +not master +===DONE=== diff --git a/tests/server/server-executeBulkWrite-005.phpt b/tests/server/server-executeBulkWrite-005.phpt new file mode 100644 index 00000000..017f1e99 --- /dev/null +++ b/tests/server/server-executeBulkWrite-005.phpt @@ -0,0 +1,37 @@ +--TEST-- +MongoDB\Driver\Server::executeBulkWrite() with write concern (replica set secondary, local DB) +--SKIPIF-- + + +--FILE-- +selectServer(new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_SECONDARY)); + +/* The server ignores write concerns with w>2 for writes to the local database, + * so we won't test behavior for w=2 and w=majority. */ +$writeConcerns = array(0, 1); + +foreach ($writeConcerns as $wc) { + $bulk = new MongoDB\Driver\BulkWrite(); + $bulk->insert(array('wc' => $wc)); + + $result = $server->executeBulkWrite('local.' . COLLECTION_NAME, $bulk, new MongoDB\Driver\WriteConcern($wc)); + var_dump($result->isAcknowledged()); + var_dump($result->getInsertedCount()); +} + +$command = new MongoDB\Driver\Command(array('drop' => COLLECTION_NAME)); +$server->executeCommand('local', $command); + +?> +===DONE=== + +--EXPECT-- +bool(false) +int(0) +bool(true) +int(1) +===DONE===