Skip to content

Commit a0f2e15

Browse files
committed
PHP-1296: Implement WriteConcerns
1 parent c17001a commit a0f2e15

File tree

5 files changed

+74
-29
lines changed

5 files changed

+74
-29
lines changed

php_phongo.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -459,21 +459,21 @@ mongoc_bulk_operation_t *phongo_writebatch_init(zend_bool ordered) { /* {{{ */
459459
return mongoc_bulk_operation_new(ordered);
460460
} /* }}} */
461461

462-
int phongo_execute_single_insert(mongoc_client_t *client, char *namespace, bson_t *doc, zval *return_value, int return_value_used TSRMLS_DC) /* {{{ */
462+
int phongo_execute_single_insert(mongoc_client_t *client, char *namespace, bson_t *doc, mongoc_write_concern_t *write_concern, zval *return_value, int return_value_used TSRMLS_DC) /* {{{ */
463463
{
464464
bool retval = false;
465465
mongoc_bulk_operation_t *batch;
466466

467467
batch = phongo_writebatch_init(true);
468468
mongoc_bulk_operation_insert(batch, doc);
469469

470-
retval = phongo_execute_write(client, namespace, batch, 0, return_value, return_value_used TSRMLS_CC);
470+
retval = phongo_execute_write(client, namespace, batch, write_concern, 0, return_value, return_value_used TSRMLS_CC);
471471
mongoc_bulk_operation_destroy(batch);
472472

473473
return retval;
474474
} /* }}} */
475475

476-
int phongo_execute_single_update(mongoc_client_t *client, char *namespace, bson_t *query, bson_t *update, mongoc_update_flags_t flags, zval *return_value, int return_value_used TSRMLS_DC) /* {{{ */
476+
int phongo_execute_single_update(mongoc_client_t *client, char *namespace, bson_t *query, bson_t *update, mongoc_write_concern_t *write_concern, mongoc_update_flags_t flags, zval *return_value, int return_value_used TSRMLS_DC) /* {{{ */
477477
{
478478
bool retval = false;
479479
mongoc_bulk_operation_t *batch;
@@ -484,13 +484,13 @@ int phongo_execute_single_update(mongoc_client_t *client, char *namespace, bson_
484484
} else {
485485
mongoc_bulk_operation_update(batch, query, update, !!(flags & MONGOC_UPDATE_UPSERT));
486486
}
487-
retval = phongo_execute_write(client, namespace, batch, 0, return_value, return_value_used TSRMLS_CC);
487+
retval = phongo_execute_write(client, namespace, batch, write_concern, 0, return_value, return_value_used TSRMLS_CC);
488488
mongoc_bulk_operation_destroy(batch);
489489

490490
return retval;
491491
} /* }}} */
492492

493-
int phongo_execute_single_delete(mongoc_client_t *client, char *namespace, bson_t *query, mongoc_delete_flags_t flags, zval *return_value, int return_value_used TSRMLS_DC) /* {{{ */
493+
int phongo_execute_single_delete(mongoc_client_t *client, char *namespace, bson_t *query, mongoc_write_concern_t *write_concern, mongoc_delete_flags_t flags, zval *return_value, int return_value_used TSRMLS_DC) /* {{{ */
494494
{
495495
bool retval = false;
496496
mongoc_bulk_operation_t *batch;
@@ -502,13 +502,13 @@ int phongo_execute_single_delete(mongoc_client_t *client, char *namespace, bson_
502502
mongoc_bulk_operation_remove(batch, query);
503503
}
504504

505-
retval = phongo_execute_write(client, namespace, batch, 0, return_value, return_value_used TSRMLS_CC);
505+
retval = phongo_execute_write(client, namespace, batch, write_concern, 0, return_value, return_value_used TSRMLS_CC);
506506
mongoc_bulk_operation_destroy(batch);
507507

508508
return retval;
509509
} /* }}} */
510510

511-
bool phongo_execute_write(mongoc_client_t *client, char *namespace, mongoc_bulk_operation_t *batch, int server_hint, zval *return_value, int return_value_used TSRMLS_DC) /* {{{ */
511+
bool phongo_execute_write(mongoc_client_t *client, char *namespace, mongoc_bulk_operation_t *batch, mongoc_write_concern_t *write_concern, int server_hint, zval *return_value, int return_value_used TSRMLS_DC) /* {{{ */
512512
{
513513
bson_error_t error;
514514
bson_t reply;
@@ -524,6 +524,7 @@ bool phongo_execute_write(mongoc_client_t *client, char *namespace, mongoc_bulk_
524524
mongoc_bulk_operation_set_database(batch, dbname);
525525
mongoc_bulk_operation_set_collection(batch, collname);
526526
mongoc_bulk_operation_set_client(batch, client);
527+
mongoc_bulk_operation_set_write_concern (batch, write_concern);
527528
efree(dbname);
528529
efree(collname);
529530

php_phongo.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,12 @@ PHONGO_API zend_object_handlers *phongo_get_std_object_handlers(void);
9595
void phongo_server_init (zval *return_value, int server_hint, mongoc_host_list_t *host TSRMLS_DC);
9696
bool phongo_query_init (php_phongo_query_t *query, zval *filter, zval *options TSRMLS_DC);
9797
mongoc_bulk_operation_t* phongo_writebatch_init (zend_bool ordered);
98-
bool phongo_execute_write (mongoc_client_t *client, char *namespace, mongoc_bulk_operation_t *batch, int server_hint, zval *return_value, int return_value_used TSRMLS_DC);
98+
bool phongo_execute_write (mongoc_client_t *client, char *namespace, mongoc_bulk_operation_t *batch, mongoc_write_concern_t *write_concern, int server_hint, zval *return_value, int return_value_used TSRMLS_DC);
9999
int phongo_execute_command (mongoc_client_t *client, char *db, bson_t *command, mongoc_read_prefs_t *read_preference, zval *return_value, int return_value_used TSRMLS_DC);
100100
int phongo_execute_query (mongoc_client_t *client, char *namespace, php_phongo_query_t *query, mongoc_read_prefs_t *read_preference, zval *return_value, int return_value_used TSRMLS_DC);
101-
int phongo_execute_single_insert(mongoc_client_t *client, char *namespace, bson_t *doc, zval *return_value, int return_value_used TSRMLS_DC);
102-
int phongo_execute_single_update(mongoc_client_t *client, char *namespace, bson_t *query, bson_t *update, mongoc_update_flags_t flags, zval *return_value, int return_value_used TSRMLS_DC);
103-
int phongo_execute_single_delete(mongoc_client_t *client, char *namespace, bson_t *query, mongoc_delete_flags_t flags, zval *return_value, int return_value_used TSRMLS_DC);
101+
int phongo_execute_single_insert(mongoc_client_t *client, char *namespace, bson_t *doc, mongoc_write_concern_t *write_concern, zval *return_value, int return_value_used TSRMLS_DC);
102+
int phongo_execute_single_update(mongoc_client_t *client, char *namespace, bson_t *query, bson_t *update, mongoc_write_concern_t *write_concern, mongoc_update_flags_t flags, zval *return_value, int return_value_used TSRMLS_DC);
103+
int phongo_execute_single_delete(mongoc_client_t *client, char *namespace, bson_t *query, mongoc_write_concern_t *write_concern, mongoc_delete_flags_t flags, zval *return_value, int return_value_used TSRMLS_DC);
104104

105105
mongoc_stream_t* phongo_stream_initiator (const mongoc_uri_t *uri, const mongoc_host_list_t *host, void *user_data, bson_error_t *error);
106106
zend_object_iterator* phongo_result_get_iterator (zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC);

src/MongoDB/Manager.c

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -133,27 +133,29 @@ PHP_METHOD(Manager, executeQuery)
133133
Executes a write operation batch (e.g. insert, update, delete) */
134134
PHP_METHOD(Manager, executeWriteBatch)
135135
{
136-
php_phongo_manager_t *intern;
137-
zend_error_handling error_handling;
138-
char *namespace;
139-
int namespace_len;
140-
zval *zbatch;
141-
zval *writeConcern = NULL;
136+
php_phongo_manager_t *intern;
137+
zend_error_handling error_handling;
138+
char *namespace;
139+
int namespace_len;
140+
zval *zbatch;
141+
zval *zwrite_concern = NULL;
142142
php_phongo_writebatch_t *batch;
143+
php_phongo_writeconcern_t *write_concern;
143144

144145

145146
zend_replace_error_handling(EH_THROW, phongo_exception_from_phongo_domain(PHONGO_ERROR_INVALID_ARGUMENT), &error_handling TSRMLS_CC);
146147
intern = (php_phongo_manager_t *)zend_object_store_get_object(getThis() TSRMLS_CC);
147148

148-
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sO|O!", &namespace, &namespace_len, &zbatch, php_phongo_writebatch_ce, &writeConcern, php_phongo_writeconcern_ce) == FAILURE) {
149+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sO|O!", &namespace, &namespace_len, &zbatch, php_phongo_writebatch_ce, &zwrite_concern, php_phongo_writeconcern_ce) == FAILURE) {
149150
zend_restore_error_handling(&error_handling TSRMLS_CC);
150151
return;
151152
}
152153
zend_restore_error_handling(&error_handling TSRMLS_CC);
153154

154155

155156
batch = (php_phongo_writebatch_t *)zend_object_store_get_object(zbatch TSRMLS_CC);
156-
phongo_execute_write(intern->client, namespace, batch->batch, 0, return_value, return_value_used TSRMLS_CC);
157+
write_concern = (php_phongo_writeconcern_t *)zend_object_store_get_object(zwrite_concern TSRMLS_CC);
158+
phongo_execute_write(intern->client, namespace, batch->batch, write_concern->write_concern, 0, return_value, return_value_used TSRMLS_CC);
157159
}
158160
/* }}} */
159161
/* {{{ proto MongoDB\WriteResult Manager::executeInsert(string $namespace, array|object $document[, MongoDB\WriteConcern $writeConcern = null])
@@ -165,23 +167,25 @@ PHP_METHOD(Manager, executeInsert)
165167
char *namespace;
166168
int namespace_len;
167169
zval *document;
168-
zval *writeConcern = NULL;
170+
zval *zwrite_concern = NULL;
169171
bson_t *bson;
172+
php_phongo_writeconcern_t *write_concern;
170173

171174

172175
zend_replace_error_handling(EH_THROW, phongo_exception_from_phongo_domain(PHONGO_ERROR_INVALID_ARGUMENT), &error_handling TSRMLS_CC);
173176
intern = (php_phongo_manager_t *)zend_object_store_get_object(getThis() TSRMLS_CC);
174177

175-
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sA|O!", &namespace, &namespace_len, &document, &writeConcern, php_phongo_writeconcern_ce) == FAILURE) {
178+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sA|O!", &namespace, &namespace_len, &document, &zwrite_concern, php_phongo_writeconcern_ce) == FAILURE) {
176179
zend_restore_error_handling(&error_handling TSRMLS_CC);
177180
return;
178181
}
179182
zend_restore_error_handling(&error_handling TSRMLS_CC);
180183

181184

185+
write_concern = (php_phongo_writeconcern_t *)zend_object_store_get_object(zwrite_concern TSRMLS_CC);
182186
bson = bson_new();
183187
zval_to_bson(document, PHONGO_BSON_NONE, bson, NULL TSRMLS_CC);
184-
phongo_execute_single_insert(intern->client, namespace, bson, return_value, return_value_used TSRMLS_CC);
188+
phongo_execute_single_insert(intern->client, namespace, bson, write_concern->write_concern, return_value, return_value_used TSRMLS_CC);
185189
bson_clear(&bson);
186190
}
187191
/* }}} */
@@ -196,22 +200,24 @@ PHP_METHOD(Manager, executeUpdate)
196200
zval *zquery;
197201
zval *newObj;
198202
zval *updateOptions = NULL;
199-
zval *writeConcern = NULL;
203+
zval *zwrite_concern = NULL;
200204
bson_t *query;
201205
bson_t *update;
202206
mongoc_update_flags_t flags = MONGOC_UPDATE_NONE;
207+
php_phongo_writeconcern_t *write_concern;
203208

204209

205210
zend_replace_error_handling(EH_THROW, phongo_exception_from_phongo_domain(PHONGO_ERROR_INVALID_ARGUMENT), &error_handling TSRMLS_CC);
206211
intern = (php_phongo_manager_t *)zend_object_store_get_object(getThis() TSRMLS_CC);
207212

208-
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sAA|a!O!", &namespace, &namespace_len, &zquery, &newObj, &updateOptions, &writeConcern, php_phongo_writeconcern_ce) == FAILURE) {
213+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sAA|a!O!", &namespace, &namespace_len, &zquery, &newObj, &updateOptions, &zwrite_concern, php_phongo_writeconcern_ce) == FAILURE) {
209214
zend_restore_error_handling(&error_handling TSRMLS_CC);
210215
return;
211216
}
212217
zend_restore_error_handling(&error_handling TSRMLS_CC);
213218

214219

220+
write_concern = (php_phongo_writeconcern_t *)zend_object_store_get_object(zwrite_concern TSRMLS_CC);
215221
query = bson_new();
216222
update = bson_new();
217223
zval_to_bson(zquery, PHONGO_BSON_NONE, query, NULL TSRMLS_CC);
@@ -224,7 +230,7 @@ PHP_METHOD(Manager, executeUpdate)
224230
flags |= MONGOC_UPDATE_MULTI_UPDATE;
225231
}
226232

227-
phongo_execute_single_update(intern->client, namespace, query, update, flags, return_value, return_value_used TSRMLS_CC);
233+
phongo_execute_single_update(intern->client, namespace, query, update, write_concern->write_concern, flags, return_value, return_value_used TSRMLS_CC);
228234
bson_clear(&query);
229235
bson_clear(&update);
230236
}
@@ -239,27 +245,29 @@ PHP_METHOD(Manager, executeDelete)
239245
int namespace_len;
240246
zval *query;
241247
zval *deleteOptions = NULL;
242-
zval *writeConcern = NULL;
248+
zval *zwrite_concern = NULL;
243249
bson_t *bson;
244250
mongoc_delete_flags_t flags = MONGOC_DELETE_NONE;
251+
php_phongo_writeconcern_t *write_concern;
245252

246253

247254
zend_replace_error_handling(EH_THROW, phongo_exception_from_phongo_domain(PHONGO_ERROR_INVALID_ARGUMENT), &error_handling TSRMLS_CC);
248255
intern = (php_phongo_manager_t *)zend_object_store_get_object(getThis() TSRMLS_CC);
249256

250-
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sA|a!O!", &namespace, &namespace_len, &query, &deleteOptions, &writeConcern, php_phongo_writeconcern_ce) == FAILURE) {
257+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sA|a!O!", &namespace, &namespace_len, &query, &deleteOptions, &zwrite_concern, php_phongo_writeconcern_ce) == FAILURE) {
251258
zend_restore_error_handling(&error_handling TSRMLS_CC);
252259
return;
253260
}
254261
zend_restore_error_handling(&error_handling TSRMLS_CC);
255262

256263

264+
write_concern = (php_phongo_writeconcern_t *)zend_object_store_get_object(zwrite_concern TSRMLS_CC);
257265
if (deleteOptions && php_array_fetch_bool(deleteOptions, "limit")) {
258266
flags |= MONGOC_DELETE_SINGLE_REMOVE;
259267
}
260268
bson = bson_new();
261269
zval_to_bson(query, PHONGO_BSON_NONE, bson, NULL TSRMLS_CC);
262-
phongo_execute_single_delete(intern->client, namespace, bson, flags, return_value, return_value_used TSRMLS_CC);
270+
phongo_execute_single_delete(intern->client, namespace, bson, write_concern->write_concern, flags, return_value, return_value_used TSRMLS_CC);
263271
bson_clear(&bson);
264272
}
265273
/* }}} */

src/MongoDB/Server.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ PHP_METHOD(Server, executeWriteBatch)
158158

159159

160160
batch = (php_phongo_writebatch_t *)zend_object_store_get_object(zbatch TSRMLS_CC);
161-
phongo_execute_write(intern->client, namespace, batch->batch, intern->hint, return_value, return_value_used TSRMLS_CC);
161+
phongo_execute_write(intern->client, namespace, batch->batch, NULL, intern->hint, return_value, return_value_used TSRMLS_CC);
162162
}
163163
/* }}} */
164164
/* {{{ proto string Server::getHost()

tests/standalone/write-error-001.phpt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
--TEST--
2+
MongoDB\Manager::executeInsert()
3+
--SKIPIF--
4+
<?php require "tests/utils/basic-skipif.inc" ?>
5+
--FILE--
6+
<?php
7+
require_once "tests/utils/basic.inc";
8+
9+
$manager = new MongoDB\Manager(MONGODB_URI);
10+
11+
$hannes = array("name" => "Hannes", "country" => "USA", "gender" => "male");
12+
$ordered = true;
13+
14+
$insertBatch = new \MongoDB\WriteBatch($ordered);
15+
$hannes_id = $insertBatch->insert($hannes);
16+
17+
$w = 2;
18+
$wtimeout = 1000;
19+
$writeConcern = new \MongoDB\WriteConcern($w, $wtimeout);
20+
try {
21+
$result = $manager->executeWriteBatch("db.collection", $insertBatch, $writeConcern);
22+
} catch(MongoDB\WriteException $e) {
23+
printWriteResult($e->getWriteResult());
24+
}
25+
26+
?>
27+
===DONE===
28+
<?php exit(0); ?>
29+
--EXPECT--
30+
server: localhost:27017
31+
numInserted: 0
32+
numMatched: 0
33+
numModified: 0
34+
numUpserted: 0
35+
numRemoved: 0
36+
===DONE===

0 commit comments

Comments
 (0)