/* {{{ proto WriteError[] WriteResult::getWriteErrors() Returns any write errors that occurred */ PHP_METHOD(WriteResult, getWriteErrors) { bson_iter_t iter, child; php_phongo_writeresult_t *intern; SUPPRESS_UNUSED_WARNING(return_value_ptr) SUPPRESS_UNUSED_WARNING(return_value_used) intern = Z_WRITERESULT_OBJ_P(getThis()); if (zend_parse_parameters_none() == FAILURE) { return; } array_init(return_value); if (bson_iter_init_find(&iter, intern->reply, "writeErrors") && BSON_ITER_HOLDS_ARRAY(&iter) && bson_iter_recurse(&iter, &child)) { while (bson_iter_next(&child)) { bson_t cbson; uint32_t len; const uint8_t *data; #if PHP_VERSION_ID >= 70000 zval writeerror; #else zval *writeerror = NULL; #endif if (!BSON_ITER_HOLDS_DOCUMENT(&child)) { continue; } bson_iter_document(&child, &len, &data); if (!bson_init_static(&cbson, data, len)) { continue; } #if PHP_VERSION_ID >= 70000 object_init_ex(&writeerror, php_phongo_writeerror_ce); if (!phongo_writeerror_init(&writeerror, &cbson TSRMLS_CC)) { zval_ptr_dtor(&writeerror); continue; } add_next_index_zval(return_value, &writeerror); #else MAKE_STD_ZVAL(writeerror); object_init_ex(writeerror, php_phongo_writeerror_ce); if (!phongo_writeerror_init(writeerror, &cbson TSRMLS_CC)) { zval_ptr_dtor(&writeerror); continue; } add_next_index_zval(return_value, writeerror); #endif } } }
/* {{{ proto MongoDB\Driver\BulkWrite BulkWrite::__construct([array $options = array()]) Constructs a new BulkWrite */ PHP_METHOD(BulkWrite, __construct) { php_phongo_bulkwrite_t *intern; zend_error_handling error_handling; zval *options = NULL; zend_bool ordered = 1; SUPPRESS_UNUSED_WARNING(return_value_ptr) SUPPRESS_UNUSED_WARNING(return_value) SUPPRESS_UNUSED_WARNING(return_value_used) zend_replace_error_handling(EH_THROW, phongo_exception_from_phongo_domain(PHONGO_ERROR_INVALID_ARGUMENT), &error_handling TSRMLS_CC); intern = Z_BULKWRITE_OBJ_P(getThis()); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|a!", &options) == FAILURE) { zend_restore_error_handling(&error_handling TSRMLS_CC); return; } zend_restore_error_handling(&error_handling TSRMLS_CC); if (options && php_array_exists(options, "ordered")) { ordered = php_array_fetch_bool(options, "ordered"); } intern->bulk = phongo_bulkwrite_init(ordered); intern->ordered = ordered; intern->bypass = BYPASS_UNSET; intern->num_ops = 0; if (options && php_array_exists(options, "bypassDocumentValidation")) { zend_bool bypass = php_array_fetch_bool(options, "bypassDocumentValidation"); mongoc_bulk_operation_set_bypass_document_validation(intern->bulk, bypass); intern->bypass = bypass; } }
/* {{{ proto string|integer|null MongoDB\Driver\WriteConcern::getW() Returns the WriteConcern "w" option */ static PHP_METHOD(WriteConcern, getW) { php_phongo_writeconcern_t *intern; const char *wtag; SUPPRESS_UNUSED_WARNING(return_value_ptr) SUPPRESS_UNUSED_WARNING(return_value_used) intern = Z_WRITECONCERN_OBJ_P(getThis()); if (zend_parse_parameters_none() == FAILURE) { return; } wtag = mongoc_write_concern_get_wtag(intern->write_concern); if (wtag) { PHONGO_RETURN_STRING(wtag); } if (mongoc_write_concern_get_wmajority(intern->write_concern)) { PHONGO_RETURN_STRING(PHONGO_WRITE_CONCERN_W_MAJORITY); } if (mongoc_write_concern_get_w(intern->write_concern) != MONGOC_WRITE_CONCERN_W_DEFAULT) { RETURN_LONG(mongoc_write_concern_get_w(intern->write_concern)); } RETURN_NULL(); } /* }}} */
/* {{{ proto array WriteResult::getUpsertedIds() Returns the identifiers generated by the server for upsert operations. */ PHP_METHOD(WriteResult, getUpsertedIds) { bson_iter_t iter, child; php_phongo_writeresult_t *intern; SUPPRESS_UNUSED_WARNING(return_value_ptr) SUPPRESS_UNUSED_WARNING(return_value_used) intern = Z_WRITERESULT_OBJ_P(getThis()); if (zend_parse_parameters_none() == FAILURE) { return; } array_init(return_value); if (bson_iter_init_find(&iter, intern->reply, "upserted") && BSON_ITER_HOLDS_ARRAY(&iter) && bson_iter_recurse(&iter, &child)) { while (bson_iter_next(&child)) { int32_t index; bson_iter_t outer; if (!BSON_ITER_HOLDS_DOCUMENT(&child) || !bson_iter_recurse(&child, &outer)) { continue; } if (!bson_iter_find(&outer, "index") || !BSON_ITER_HOLDS_INT32(&outer)) { continue; } index = bson_iter_int32(&outer); if (!bson_iter_find(&outer, "_id")) { continue; } if (BSON_ITER_HOLDS_OID(&outer)) { #if PHP_VERSION_ID >= 70000 zval zid; php_phongo_objectid_new_from_oid(&zid, bson_iter_oid(&outer) TSRMLS_CC); add_index_zval(return_value, index, &zid); #else zval *zid = NULL; MAKE_STD_ZVAL(zid); php_phongo_objectid_new_from_oid(zid, bson_iter_oid(&outer) TSRMLS_CC); add_index_zval(return_value, index, zid); #endif } else if (BSON_ITER_HOLDS_INT32(&outer)) { int32_t val = bson_iter_int32(&outer); add_index_long(return_value, index, val); } else if (BSON_ITER_HOLDS_INT64(&outer)) { int64_t val = bson_iter_int64(&outer); ADD_INDEX_INT64(return_value, index, val); } } } }
/* {{{ 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); }
/* {{{ proto MongoDB\Driver\Server CommandFailedEvent::getServer() Returns the Server from which the event originated */ PHP_METHOD(CommandFailedEvent, getServer) { php_phongo_commandfailedevent_t *intern; SUPPRESS_UNUSED_WARNING(return_value_ptr) SUPPRESS_UNUSED_WARNING(return_value_used) intern = Z_COMMANDFAILEDEVENT_OBJ_P(getThis()); if (zend_parse_parameters_none() == FAILURE) { return; } phongo_server_init(return_value, intern->client, intern->server_id TSRMLS_CC); } /* }}} */
/* {{{ proto string CommandFailedEvent::getCommandName() Returns the command name for this event */ PHP_METHOD(CommandFailedEvent, getCommandName) { php_phongo_commandfailedevent_t *intern; SUPPRESS_UNUSED_WARNING(return_value_ptr) SUPPRESS_UNUSED_WARNING(return_value_used) intern = Z_COMMANDFAILEDEVENT_OBJ_P(getThis()); if (zend_parse_parameters_none() == FAILURE) { return; } PHONGO_RETVAL_STRING(intern->command_name); } /* }}} */
/* {{{ proto boolean MongoDB\Driver\WriteConcern::isDefault() Returns whether the write concern has not been modified (i.e. from a Manager with no write concern URI options). */ static PHP_METHOD(WriteConcern, isDefault) { php_phongo_writeconcern_t *intern; SUPPRESS_UNUSED_WARNING(return_value_ptr) SUPPRESS_UNUSED_WARNING(return_value_used) intern = Z_WRITECONCERN_OBJ_P(getThis()); if (zend_parse_parameters_none() == FAILURE) { return; } RETURN_BOOL(mongoc_write_concern_is_default(intern->write_concern)); } /* }}} */
/* {{{ proto int CommandFailedEvent::getDurationMicros() Returns the event's duration in microseconds */ PHP_METHOD(CommandFailedEvent, getDurationMicros) { php_phongo_commandfailedevent_t *intern; SUPPRESS_UNUSED_WARNING(return_value_ptr) SUPPRESS_UNUSED_WARNING(return_value_used) intern = Z_COMMANDFAILEDEVENT_OBJ_P(getThis()); if (zend_parse_parameters_none() == FAILURE) { return; } RETURN_LONG(intern->duration_micros); } /* }}} */
/* {{{ proto integer|null WriteResult::getModifiedCount() Returns the number of documents that were actually modified by an update */ PHP_METHOD(WriteResult, getModifiedCount) { bson_iter_t iter; php_phongo_writeresult_t *intern; SUPPRESS_UNUSED_WARNING(return_value_ptr) SUPPRESS_UNUSED_WARNING(return_value_used) intern = Z_WRITERESULT_OBJ_P(getThis()); if (zend_parse_parameters_none() == FAILURE) { return; } RETURN_LONG_FROM_BSON_INT32(&iter, intern->reply, "nModified"); }
/* {{{ proto boolean WriteResult::isAcknowledged() Returns whether the write operation was acknowledged (based on the write concern). */ PHP_METHOD(WriteResult, isAcknowledged) { php_phongo_writeresult_t *intern; SUPPRESS_UNUSED_WARNING(return_value_ptr) SUPPRESS_UNUSED_WARNING(return_value_used) intern = Z_WRITERESULT_OBJ_P(getThis()); if (zend_parse_parameters_none() == FAILURE) { return; } RETURN_BOOL(mongoc_write_concern_is_acknowledged(intern->write_concern)); }
/* {{{ proto string CommandFailedEvent::getOperationId() Returns the event's operation ID */ PHP_METHOD(CommandFailedEvent, getOperationId) { php_phongo_commandfailedevent_t *intern; char int_as_string[20]; SUPPRESS_UNUSED_WARNING(return_value_ptr) SUPPRESS_UNUSED_WARNING(return_value_used) intern = Z_COMMANDFAILEDEVENT_OBJ_P(getThis()); if (zend_parse_parameters_none() == FAILURE) { return; } sprintf(int_as_string, "%" PHONGO_LONG_FORMAT, intern->operation_id); PHONGO_RETVAL_STRING(int_as_string); } /* }}} */
/* {{{ proto string CursorId::__toString() Returns the string representation of the CursorId */ PHP_METHOD(CursorId, __toString) { php_phongo_cursorid_t *intern; SUPPRESS_UNUSED_WARNING(return_value_ptr) SUPPRESS_UNUSED_WARNING(return_value_used) intern = Z_CURSORID_OBJ_P(getThis()); if (zend_parse_parameters_none() == FAILURE) { return; } RETVAL_LONG(intern->id); convert_to_string(return_value); }
/* {{{ proto null|boolean MongoDB\Driver\WriteConcern::getJournal() Returns the WriteConcern "journal" option */ static PHP_METHOD(WriteConcern, getJournal) { php_phongo_writeconcern_t *intern; SUPPRESS_UNUSED_WARNING(return_value_ptr) SUPPRESS_UNUSED_WARNING(return_value_used) intern = Z_WRITECONCERN_OBJ_P(getThis()); if (zend_parse_parameters_none() == FAILURE) { return; } if (mongoc_write_concern_journal_is_set(intern->write_concern)) { RETURN_BOOL(mongoc_write_concern_get_journal(intern->write_concern)); } RETURN_NULL(); } /* }}} */
/* {{{ proto Exception CommandFailedEvent::getError() Returns the error document associated with the event */ PHP_METHOD(CommandFailedEvent, getError) { php_phongo_commandfailedevent_t *intern; SUPPRESS_UNUSED_WARNING(return_value_ptr) SUPPRESS_UNUSED_WARNING(return_value_used) intern = Z_COMMANDFAILEDEVENT_OBJ_P(getThis()); if (zend_parse_parameters_none() == FAILURE) { return; } #if PHP_VERSION_ID >= 70000 RETURN_ZVAL(&intern->z_error, 1, 0); #else RETURN_ZVAL(intern->z_error, 1, 0); #endif } /* }}} */
/* {{{ proto string CursorId::__toString() Returns the string representation of the CursorId */ PHP_METHOD(CursorId, __toString) { php_phongo_cursorid_t *intern; char *tmp; int tmp_len; SUPPRESS_UNUSED_WARNING(return_value_ptr) SUPPRESS_UNUSED_WARNING(return_value_used) intern = Z_CURSORID_OBJ_P(getThis()); if (zend_parse_parameters_none() == FAILURE) { return; } tmp_len = spprintf(&tmp, 0, "%" PRIu64, intern->id); PHONGO_RETVAL_STRINGL(tmp, tmp_len); efree(tmp); }
/* {{{ proto MongoDB\Driver\Server WriteResult::getServer() Returns the Server from which the result originated */ PHP_METHOD(WriteResult, getServer) { php_phongo_writeresult_t *intern; SUPPRESS_UNUSED_WARNING(return_value_ptr) SUPPRESS_UNUSED_WARNING(return_value_used) intern = Z_WRITERESULT_OBJ_P(getThis()); if (zend_parse_parameters_none() == FAILURE) { return; } #if PHP_VERSION_ID >= 70000 phongo_server_init(return_value, &intern->manager, intern->server_id TSRMLS_CC); #else phongo_server_init(return_value, intern->manager, intern->server_id TSRMLS_CC); #endif }
/* {{{ proto void Cursor::setTypeMap(array $typemap) Sets a type map to use for BSON unserialization */ PHP_METHOD(Cursor, setTypeMap) { php_phongo_cursor_t *intern; php_phongo_bson_state state = PHONGO_BSON_STATE_INITIALIZER; zval *typemap = NULL; SUPPRESS_UNUSED_WARNING(return_value) SUPPRESS_UNUSED_WARNING(return_value_ptr) SUPPRESS_UNUSED_WARNING(return_value_used) intern = Z_CURSOR_OBJ_P(getThis()); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a!", &typemap) == FAILURE) { return; } phongo_bson_typemap_to_state(typemap, &state.map TSRMLS_CC); intern->visitor_data = state; }
/* {{{ proto mixed BulkWrite::insert(array|object $document) Adds an insert operation to the bulk */ PHP_METHOD(BulkWrite, insert) { php_phongo_bulkwrite_t *intern; zval *document; bson_t *bson; bson_t *bson_out = NULL; int bson_flags = PHONGO_BSON_ADD_ID; DECLARE_RETURN_VALUE_USED SUPPRESS_UNUSED_WARNING(return_value_ptr) intern = Z_BULKWRITE_OBJ_P(getThis()); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "A", &document) == FAILURE) { return; } if (return_value_used) { bson_flags |= PHONGO_BSON_RETURN_ID; } bson = bson_new(); phongo_zval_to_bson(document, bson_flags, bson, &bson_out TSRMLS_CC); mongoc_bulk_operation_insert(intern->bulk, bson); bson_clear(&bson); intern->num_ops++; if (bson_out && return_value_used) { bson_iter_t iter; if (bson_iter_init_find(&iter, bson_out, "_id")) { php_phongo_objectid_new_from_oid(return_value, bson_iter_oid(&iter) TSRMLS_CC); bson_clear(&bson_out); return; } bson_clear(&bson_out); } }
/* {{{ proto void MongoDB\Driver\WriteConcern::__construct(integer|string $w[, integer $wtimeout[, boolean $journal]]) Constructs a new WriteConcern */ static PHP_METHOD(WriteConcern, __construct) { php_phongo_writeconcern_t *intern; zend_error_handling error_handling; zval *w, *journal; phongo_long wtimeout = 0; SUPPRESS_UNUSED_WARNING(return_value) SUPPRESS_UNUSED_WARNING(return_value_ptr) SUPPRESS_UNUSED_WARNING(return_value_used) zend_replace_error_handling(EH_THROW, phongo_exception_from_phongo_domain(PHONGO_ERROR_INVALID_ARGUMENT), &error_handling TSRMLS_CC); intern = Z_WRITECONCERN_OBJ_P(getThis()); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|lz", &w, &wtimeout, &journal) == FAILURE) { zend_restore_error_handling(&error_handling TSRMLS_CC); return; } zend_restore_error_handling(&error_handling TSRMLS_CC); intern->write_concern = mongoc_write_concern_new(); if (Z_TYPE_P(w) == IS_LONG) { if (Z_LVAL_P(w) < -3) { phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Expected w to be >= -3, %ld given", Z_LVAL_P(w)); return; } mongoc_write_concern_set_w(intern->write_concern, Z_LVAL_P(w)); } else if (Z_TYPE_P(w) == IS_STRING) { if (strcmp(Z_STRVAL_P(w), PHONGO_WRITE_CONCERN_W_MAJORITY) == 0) { mongoc_write_concern_set_w(intern->write_concern, MONGOC_WRITE_CONCERN_W_MAJORITY); } else { mongoc_write_concern_set_wtag(intern->write_concern, Z_STRVAL_P(w)); } } else { phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Expected w to be integer or string, %s given", zend_get_type_by_const(Z_TYPE_P(w))); return; } switch(ZEND_NUM_ARGS()) { case 3: if (Z_TYPE_P(journal) != IS_NULL) { #ifdef ZEND_ENGINE_3 mongoc_write_concern_set_journal(intern->write_concern, zend_is_true(journal)); #else mongoc_write_concern_set_journal(intern->write_concern, Z_BVAL_P(journal)); #endif } /* fallthrough */ case 2: if (wtimeout < 0) { phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Expected wtimeout to be >= 0, %" PHONGO_LONG_FORMAT " given", wtimeout); return; } if (wtimeout > INT32_MAX) { phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Expected wtimeout to be <= %" PRId32 ", %" PHONGO_LONG_FORMAT " given", INT32_MAX, wtimeout); return; } mongoc_write_concern_set_wtimeout(intern->write_concern, wtimeout); } } /* }}} */