diff --git a/.travis.scripts/compile.sh b/.travis.scripts/compile.sh index ccc49f29..e1051b36 100755 --- a/.travis.scripts/compile.sh +++ b/.travis.scripts/compile.sh @@ -20,7 +20,7 @@ build_lcov() { build_lcov phpize -./configure --enable-developer-flags --enable-coverage +./configure --enable-developer-flags --enable-coverage CFLAGS="-Wno-type-limits" make all -j4 sudo make install echo "Use the most-up-to-date run-tests.. old ones like 5.3 don't report failure exit codes" diff --git a/VERSION_CURRENT b/VERSION_CURRENT new file mode 100644 index 00000000..b6bb93f7 --- /dev/null +++ b/VERSION_CURRENT @@ -0,0 +1 @@ +1.3.0-dev diff --git a/VERSION_RELEASED b/VERSION_RELEASED new file mode 100644 index 00000000..23aa8390 --- /dev/null +++ b/VERSION_RELEASED @@ -0,0 +1 @@ +1.2.2 diff --git a/config.m4 b/config.m4 index 1a30639b..90d62c47 100644 --- a/config.m4 +++ b/config.m4 @@ -235,6 +235,7 @@ if test "$MONGODB" != "no"; then mongoc-cursor-transform.c \ mongoc-cursor-cursorid.c \ mongoc-database.c \ + mongoc-find-and-modify.c \ mongoc-init.c \ mongoc-gridfs.c \ mongoc-gridfs-file.c \ @@ -246,12 +247,15 @@ if test "$MONGODB" != "no"; then mongoc-log.c \ mongoc-matcher-op.c \ mongoc-matcher.c \ + mongoc-memcmp.c \ mongoc-opcode.c \ mongoc-queue.c \ + mongoc-read-concern.c \ mongoc-read-prefs.c \ mongoc-rpc.c \ mongoc-set.c \ mongoc-server-description.c \ + mongoc-server-stream.c \ mongoc-socket.c \ mongoc-stream.c \ mongoc-stream-buffered.c \ @@ -299,13 +303,13 @@ PHP_ARG_WITH(libbson, Use system libbson, AC_PATH_PROG(PKG_CONFIG, pkg-config, no) AC_MSG_CHECKING(for libbson) if test -x "$PKG_CONFIG" && $PKG_CONFIG --exists libbson-1.0; then - if $PKG_CONFIG libbson-1.0 --atleast-version 1.2.0; then + if $PKG_CONFIG libbson-1.0 --atleast-version 1.3.0; then LIBBSON_INC=`$PKG_CONFIG libbson-1.0 --cflags` LIBBSON_LIB=`$PKG_CONFIG libbson-1.0 --libs` LIBBSON_VER=`$PKG_CONFIG libbson-1.0 --modversion` AC_MSG_RESULT(version $LIBBSON_VER found) else - AC_MSG_ERROR(system libbson must be upgraded to version >= 1.2.0) + AC_MSG_ERROR(system libbson must be upgraded to version >= 1.3.0) fi else AC_MSG_ERROR(pkgconfig and libbson must be installed) @@ -314,8 +318,8 @@ PHP_ARG_WITH(libbson, Use system libbson, PHP_EVAL_LIBLINE($LIBBSON_LIB, MONGODB_SHARED_LIBADD) AC_DEFINE(HAVE_SYSTEM_LIBBSON, 1, [Use system libbson]) else - PHP_ADD_SOURCES_X(PHP_EXT_DIR(mongodb)[src/libbson/src/yajl], $YAJL_SOURCES, [$STD_CFLAGS $MAINTAINER_CFLAGS], shared_objects_mongodb, yes) - PHP_ADD_SOURCES_X(PHP_EXT_DIR(mongodb)[src/libbson/src/bson], $BSON_SOURCES, [$STD_CFLAGS $MAINTAINER_CFLAGS], shared_objects_mongodb, yes) + PHP_ADD_SOURCES_X(PHP_EXT_DIR(mongodb)[src/libbson/src/yajl], $YAJL_SOURCES, [$STD_CFLAGS], shared_objects_mongodb, yes) + PHP_ADD_SOURCES_X(PHP_EXT_DIR(mongodb)[src/libbson/src/bson], $BSON_SOURCES, [$STD_CFLAGS], shared_objects_mongodb, yes) fi dnl libmongoc stuff {{{ @@ -331,7 +335,7 @@ PHP_ARG_WITH(libmongoc, Use system libmongoc, AC_PATH_PROG(PKG_CONFIG, pkg-config, no) AC_MSG_CHECKING(for libmongoc) if test -x "$PKG_CONFIG" && $PKG_CONFIG --exists libmongoc-1.0 && $PKG_CONFIG --exists libmongoc-priv; then - if $PKG_CONFIG libmongoc-1.0 --atleast-version 1.2.0; then + if $PKG_CONFIG libmongoc-1.0 --atleast-version 1.3.0; then LIBMONGOC_INC=`$PKG_CONFIG libmongoc-priv --cflags` LIBMONGOC_LIB=`$PKG_CONFIG libmongoc-priv --libs` LIBMONGOC_VER=`$PKG_CONFIG libmongoc-priv --modversion` @@ -339,7 +343,7 @@ PHP_ARG_WITH(libmongoc, Use system libmongoc, CFLAGS="$CFLAGS -DMONGOC_I_AM_A_DRIVER" else - AC_MSG_ERROR(system libmongoc must be upgraded to version >= 1.2.0) + AC_MSG_ERROR(system libmongoc must be upgraded to version >= 1.3.0) fi else AC_MSG_ERROR(pkgconfig and mongoc must be installed) @@ -350,9 +354,9 @@ PHP_ARG_WITH(libmongoc, Use system libmongoc, else CPPFLAGS="$CPPFLAGS -DBSON_COMPILATION -DMONGOC_COMPILATION -DMONGOC_TRACE" - PHP_ADD_SOURCES_X(PHP_EXT_DIR(mongodb)[src/libmongoc/src/mongoc], $MONGOC_SOURCES, [$STD_CFLAGS $MAINTAINER_CFLAGS], shared_objects_mongodb, yes) - PHP_ADD_SOURCES_X(PHP_EXT_DIR(mongodb)[src/libmongoc/src/mongoc], $MONGOC_SOURCES_SSL, [$STD_CFLAGS $MAINTAINER_CFLAGS], shared_objects_mongodb, yes) - PHP_ADD_SOURCES_X(PHP_EXT_DIR(mongodb)[src/libmongoc/src/mongoc], $MONGOC_SOURCES_SASL, [$STD_CFLAGS $MAINTAINER_CFLAGS], shared_objects_mongodb, yes) + PHP_ADD_SOURCES_X(PHP_EXT_DIR(mongodb)[src/libmongoc/src/mongoc], $MONGOC_SOURCES, [$STD_CFLAGS], shared_objects_mongodb, yes) + PHP_ADD_SOURCES_X(PHP_EXT_DIR(mongodb)[src/libmongoc/src/mongoc], $MONGOC_SOURCES_SSL, [$STD_CFLAGS], shared_objects_mongodb, yes) + PHP_ADD_SOURCES_X(PHP_EXT_DIR(mongodb)[src/libmongoc/src/mongoc], $MONGOC_SOURCES_SASL, [$STD_CFLAGS], shared_objects_mongodb, yes) PHP_SETUP_OPENSSL(MONGODB_SHARED_LIBADD) @@ -426,6 +430,7 @@ else AC_SUBST(MONGOC_HAVE_SASL_CLIENT_DONE, 0) fi + m4_include(src/libmongoc/build/autotools/WeakSymbols.m4) m4_include(src/libmongoc/build/autotools/m4/ax_pthread.m4) AX_PTHREAD diff --git a/config.w32 b/config.w32 index 88aeeb9f..6458a591 100644 --- a/config.w32 +++ b/config.w32 @@ -15,11 +15,12 @@ if (PHP_MONGODB != "no") { ADD_SOURCES(configure_module_dirname + "/src/contrib/", "php-ssl.c", "mongodb"); ADD_SOURCES(configure_module_dirname + "/src/libbson/src/yajl", "yajl_version.c yajl.c yajl_encode.c yajl_lex.c yajl_parser.c yajl_buf.c yajl_tree.c yajl_alloc.c yajl_gen.c", "mongodb"); ADD_SOURCES(configure_module_dirname + "/src/libbson/src/bson", "bcon.c bson.c bson-atomic.c bson-clock.c bson-context.c bson-error.c bson-iter.c bson-iso8601.c bson-json.c bson-keys.c bson-md5.c bson-memory.c bson-oid.c bson-reader.c bson-string.c bson-timegm.c bson-utf8.c bson-value.c bson-version-functions.c bson-writer.c", "mongodb"); - ADD_SOURCES(configure_module_dirname + "/src/libmongoc/src/mongoc", "mongoc-array.c mongoc-async.c mongoc-async-cmd.c mongoc-buffer.c mongoc-bulk-operation.c mongoc-b64.c mongoc-client.c mongoc-client-pool.c mongoc-cluster.c mongoc-collection.c mongoc-counters.c mongoc-cursor.c mongoc-cursor-array.c mongoc-cursor-transform.c mongoc-cursor-cursorid.c mongoc-database.c mongoc-init.c mongoc-gridfs.c mongoc-gridfs-file.c mongoc-gridfs-file-page.c mongoc-gridfs-file-list.c mongoc-host-list.c mongoc-index.c mongoc-list.c mongoc-log.c mongoc-matcher-op.c mongoc-matcher.c mongoc-opcode.c mongoc-queue.c mongoc-read-prefs.c mongoc-rpc.c mongoc-set.c mongoc-server-description.c mongoc-socket.c mongoc-stream.c mongoc-stream-buffered.c mongoc-stream-file.c mongoc-stream-gridfs.c mongoc-stream-socket.c mongoc-topology.c mongoc-topology-scanner.c mongoc-topology-description.c mongoc-uri.c mongoc-util.c mongoc-version-functions.c mongoc-write-command.c mongoc-write-concern.c", "mongodb"); + ADD_SOURCES(configure_module_dirname + "/src/libmongoc/src/mongoc", "mongoc-array.c mongoc-async.c mongoc-async-cmd.c mongoc-buffer.c mongoc-bulk-operation.c mongoc-b64.c mongoc-client.c mongoc-client-pool.c mongoc-cluster.c mongoc-collection.c mongoc-counters.c mongoc-cursor.c mongoc-cursor-array.c mongoc-cursor-transform.c mongoc-cursor-cursorid.c mongoc-database.c mongoc-find-and-modify.c mongoc-init.c mongoc-gridfs.c mongoc-gridfs-file.c mongoc-gridfs-file-page.c mongoc-gridfs-file-list.c mongoc-host-list.c mongoc-index.c mongoc-list.c mongoc-log.c mongoc-matcher-op.c mongoc-matcher.c mongoc-memcmp.c mongoc-opcode.c mongoc-queue.c mongoc-read-prefs.c mongoc-read-concern.c mongoc-rpc.c mongoc-set.c mongoc-server-description.c mongoc-server-stream.c mongoc-socket.c mongoc-stream.c mongoc-stream-buffered.c mongoc-stream-file.c mongoc-stream-gridfs.c mongoc-stream-socket.c mongoc-topology.c mongoc-topology-scanner.c mongoc-topology-description.c mongoc-uri.c mongoc-util.c mongoc-version-functions.c mongoc-write-command.c mongoc-write-concern.c", "mongodb"); ADD_SOURCES(configure_module_dirname + "/src/libmongoc/src/mongoc", "mongoc-rand.c mongoc-scram.c mongoc-stream-tls.c mongoc-ssl.c", "mongodb"); ADD_SOURCES(configure_module_dirname + "/src/libmongoc/src/mongoc", "mongoc-sasl.c", "mongodb"); AC_DEFINE("HAVE_MONGOC", 1); + AC_DEFINE("MONGOC_HAVE_WEAK_SYMBOLS", 1); if (!CHECK_LIB("libsasl.lib", "mongodb", PHP_MONGODB)) { WARNING("mongodb libsasl support not enabled, libs not found"); diff --git a/php_phongo.c b/php_phongo.c index 1e2ada96..a3cd8f4a 100644 --- a/php_phongo.c +++ b/php_phongo.c @@ -643,12 +643,14 @@ int phongo_execute_command(mongoc_client_t *client, const char *db, const bson_t * after the error checking above. */ if (bson_iter_init_find(&iter, doc, "cursor") && BSON_ITER_HOLDS_DOCUMENT(&iter) && bson_iter_recurse(&iter, &child)) { mongoc_cursor_cursorid_t *cid; + bson_t empty = BSON_INITIALIZER; - _mongoc_cursor_cursorid_init(cursor); + _mongoc_cursor_cursorid_init(cursor, &empty); cursor->limit = 0; cid = cursor->iface_data; - cid->has_cursor = true; + cid->in_batch = true; + bson_destroy (&empty); while (bson_iter_next(&child)) { if (BSON_ITER_IS_KEY(&child, "id")) { @@ -659,8 +661,8 @@ int phongo_execute_command(mongoc_client_t *client, const char *db, const bson_t ns = bson_iter_utf8(&child, &cursor->nslen); bson_strncpy(cursor->ns, ns, sizeof cursor->ns); } else if (BSON_ITER_IS_KEY(&child, "firstBatch")) { - if (BSON_ITER_HOLDS_ARRAY(&child) && bson_iter_recurse(&child, &cid->first_batch_iter)) { - cid->in_first_batch = true; + if (BSON_ITER_HOLDS_ARRAY(&child) && bson_iter_recurse(&child, &cid->batch_iter)) { + cid->in_batch = true; } } } @@ -919,11 +921,6 @@ bool phongo_stream_socket_check_closed(mongoc_stream_t *stream) /* {{{ */ return PHP_STREAM_OPTION_RETURN_OK != php_stream_set_option(base_stream->stream, PHP_STREAM_OPTION_CHECK_LIVENESS, 0, NULL); } /* }}} */ -mongoc_stream_t* phongo_stream_get_base_stream(mongoc_stream_t *stream) /* {{{ */ -{ - return (mongoc_stream_t *) stream; -} /* }}} */ - ssize_t phongo_stream_poll (mongoc_stream_poll_t *streams, size_t nstreams, int32_t timeout) /* {{{ */ { php_pollfd *fds = NULL; @@ -1174,7 +1171,6 @@ mongoc_stream_t* phongo_stream_initiator(const mongoc_uri_t *uri, const mongoc_h base_stream->vtable.readv = phongo_stream_readv; base_stream->vtable.setsockopt = phongo_stream_setsockopt; base_stream->vtable.check_closed = phongo_stream_socket_check_closed; - base_stream->vtable.get_base_stream = phongo_stream_get_base_stream; base_stream->vtable.poll = phongo_stream_poll; if (host->family != AF_UNIX) { @@ -1356,10 +1352,8 @@ void php_phongo_cursor_to_zval(zval *retval, php_phongo_cursor_t *cursor) /* {{{ _ADD_BOOL(zcursor, is_command); _ADD_BOOL(zcursor, sent); _ADD_BOOL(zcursor, done); - _ADD_BOOL(zcursor, failed); _ADD_BOOL(zcursor, end_of_event); _ADD_BOOL(zcursor, in_exhaust); - _ADD_BOOL(zcursor, redir_primary); _ADD_BOOL(zcursor, has_fields); #undef _ADD_BOOL diff --git a/src/BSON/Javascript.c b/src/BSON/Javascript.c index 83ff2510..ef6dd9d4 100644 --- a/src/BSON/Javascript.c +++ b/src/BSON/Javascript.c @@ -73,6 +73,7 @@ PHP_METHOD(Javascript, __construct) } php_phongo_new_javascript_from_javascript_and_scope(0, getThis(), javascript, javascript_len, &scope TSRMLS_CC); + bson_destroy(&scope); } /* }}} */ diff --git a/src/MongoDB/BulkWrite.c b/src/MongoDB/BulkWrite.c index 8bcfb330..bae8055e 100644 --- a/src/MongoDB/BulkWrite.c +++ b/src/MongoDB/BulkWrite.c @@ -315,7 +315,7 @@ HashTable *php_phongo_bulkwrite_get_debug_info(zval *object, int *is_temp TSRMLS add_assoc_null_ex(&retval, ZEND_STRS("collection")); } - add_assoc_bool_ex(&retval, ZEND_STRS("ordered"), intern->bulk->ordered); + add_assoc_bool_ex(&retval, ZEND_STRS("ordered"), intern->bulk->flags.ordered); add_assoc_bool_ex(&retval, ZEND_STRS("executed"), intern->bulk->executed); add_assoc_long_ex(&retval, ZEND_STRS("server_id"), intern->bulk->hint); diff --git a/src/MongoDB/Manager.c b/src/MongoDB/Manager.c index d933d436..c8e68529 100644 --- a/src/MongoDB/Manager.c +++ b/src/MongoDB/Manager.c @@ -256,7 +256,8 @@ PHP_METHOD(Manager, selectServer) php_phongo_manager_t *intern; zval *zreadPreference = NULL; const mongoc_read_prefs_t *readPreference; - uint32_t server_id; + bson_error_t error; + mongoc_server_description_t *selected_server = NULL; (void)return_value_ptr; (void)return_value_used; @@ -267,8 +268,13 @@ PHP_METHOD(Manager, selectServer) } readPreference = phongo_read_preference_from_zval(zreadPreference TSRMLS_CC); - server_id = mongoc_cluster_preselect(&intern->client->cluster, MONGOC_OPCODE_QUERY, readPreference, NULL); - phongo_server_init(return_value, intern->client, server_id TSRMLS_CC); + selected_server = mongoc_topology_select(intern->client->topology, MONGOC_SS_READ, readPreference, MONGOC_SS_DEFAULT_LOCAL_THRESHOLD_MS, &error); + if (selected_server) { + phongo_server_init(return_value, intern->client, selected_server->id TSRMLS_CC); + mongoc_server_description_destroy(selected_server); + } else { + phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", error.message); + } } /* }}} */ /* {{{ proto void MongoDB\Driver\Manager::__wakeUp() diff --git a/src/MongoDB/Query.c b/src/MongoDB/Query.c index 5f455f2d..b92e67e9 100644 --- a/src/MongoDB/Query.c +++ b/src/MongoDB/Query.c @@ -75,7 +75,6 @@ PHP_METHOD(Query, __construct) zval_to_bson(zfilter, PHONGO_BSON_NONE, &bfilter, NULL TSRMLS_CC); if (zoptions) { - bson_init(&boptions); zval_to_bson(zoptions, PHONGO_BSON_NONE, &boptions, NULL TSRMLS_CC); } if (!phongo_query_init(intern, &bfilter, &boptions TSRMLS_CC)) { diff --git a/src/MongoDB/Server.c b/src/MongoDB/Server.c index fe9d8041..e6a41ec9 100644 --- a/src/MongoDB/Server.c +++ b/src/MongoDB/Server.c @@ -134,6 +134,7 @@ PHP_METHOD(Server, getHost) { php_phongo_server_t *intern; mongoc_server_description_t *sd; + bson_error_t error; (void)return_value_ptr; (void)return_value_used; intern = (php_phongo_server_t *)zend_object_store_get_object(getThis() TSRMLS_CC); @@ -142,11 +143,11 @@ PHP_METHOD(Server, getHost) return; } - if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id))) { + if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id, &error))) { RETURN_STRING(sd->host.host, 1); } - phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", "Failed to get server description, server likely gone"); + phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "Failed to get server description: %s", error.message); } /* }}} */ /* {{{ proto array Server::getTags() @@ -155,6 +156,7 @@ PHP_METHOD(Server, getTags) { php_phongo_server_t *intern; mongoc_server_description_t *sd; + bson_error_t error; (void)return_value_ptr; (void)return_value_used; @@ -165,7 +167,7 @@ PHP_METHOD(Server, getTags) } - if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id))) { + if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id, &error))) { php_phongo_bson_state state = PHONGO_BSON_STATE_INITIALIZER; state.map.root_type = PHONGO_TYPEMAP_NATIVE_ARRAY; state.map.document_type = PHONGO_TYPEMAP_NATIVE_ARRAY; @@ -175,7 +177,7 @@ PHP_METHOD(Server, getTags) RETURN_ZVAL(state.zchild, 0, 1); } - phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", "Failed to get server description, server likely gone"); + phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "Failed to get server description: %s", error.message); } /* }}} */ /* {{{ proto array Server::getInfo() @@ -184,6 +186,7 @@ PHP_METHOD(Server, getInfo) { php_phongo_server_t *intern; mongoc_server_description_t *sd; + bson_error_t error; (void)return_value_ptr; (void)return_value_used; @@ -194,7 +197,7 @@ PHP_METHOD(Server, getInfo) } - if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id))) { + if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id, &error))) { php_phongo_bson_state state = PHONGO_BSON_STATE_INITIALIZER; state.map.root_type = PHONGO_TYPEMAP_NATIVE_ARRAY; state.map.document_type = PHONGO_TYPEMAP_NATIVE_ARRAY; @@ -204,7 +207,7 @@ PHP_METHOD(Server, getInfo) RETURN_ZVAL(state.zchild, 0, 1); } - phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", "Failed to get server description, server likely gone"); + phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "Failed to get server description: %s", error.message); } /* }}} */ /* {{{ proto integer Server::getLatency() @@ -213,6 +216,7 @@ PHP_METHOD(Server, getLatency) { php_phongo_server_t *intern; mongoc_server_description_t *sd; + bson_error_t error; (void)return_value_ptr; (void)return_value_used; @@ -222,11 +226,11 @@ PHP_METHOD(Server, getLatency) return; } - if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id))) { + if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id, &error))) { RETURN_LONG(sd->round_trip_time); } - phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", "Failed to get server description, server likely gone"); + phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "Failed to get server description: %s", error.message); } /* }}} */ /* {{{ proto integer Server::getPort() @@ -235,6 +239,7 @@ PHP_METHOD(Server, getPort) { php_phongo_server_t *intern; mongoc_server_description_t *sd; + bson_error_t error; (void)return_value_ptr; (void)return_value_used; @@ -244,11 +249,11 @@ PHP_METHOD(Server, getPort) return; } - if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id))) { + if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id, &error))) { RETURN_LONG(sd->host.port); } - phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", "Failed to get server description, server likely gone"); + phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "Failed to get server description: %s", error.message); } /* }}} */ /* {{{ proto integer Server::getType() @@ -257,6 +262,7 @@ PHP_METHOD(Server, getType) { php_phongo_server_t *intern; mongoc_server_description_t *sd; + bson_error_t error; (void)return_value_ptr; (void)return_value_used; @@ -266,11 +272,11 @@ PHP_METHOD(Server, getType) return; } - if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id))) { + if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id, &error))) { RETURN_LONG(sd->type); } - phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", "Failed to get server description, server likely gone"); + phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "Failed to get server description: %s", error.message); } /* }}} */ /* {{{ proto bool Server::isPrimary() @@ -279,6 +285,7 @@ PHP_METHOD(Server, isPrimary) { php_phongo_server_t *intern; mongoc_server_description_t *sd; + bson_error_t error; (void)return_value_ptr; (void)return_value_used; @@ -288,11 +295,11 @@ PHP_METHOD(Server, isPrimary) return; } - if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id))) { + if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id, &error))) { RETURN_BOOL(sd->type == MONGOC_SERVER_RS_PRIMARY); } - phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", "Failed to get server description, server likely gone"); + phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "Failed to get server description: %s", error.message); } /* }}} */ /* {{{ proto bool Server::isSecondary() @@ -301,6 +308,7 @@ PHP_METHOD(Server, isSecondary) { php_phongo_server_t *intern; mongoc_server_description_t *sd; + bson_error_t error; (void)return_value_ptr; (void)return_value_used; @@ -310,11 +318,11 @@ PHP_METHOD(Server, isSecondary) return; } - if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id))) { + if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id, &error))) { RETURN_BOOL(sd->type == MONGOC_SERVER_RS_SECONDARY); } - phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", "Failed to get server description, server likely gone"); + phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "Failed to get server description: %s", error.message); } /* }}} */ /* {{{ proto bool Server::isArbiter() @@ -323,6 +331,7 @@ PHP_METHOD(Server, isArbiter) { php_phongo_server_t *intern; mongoc_server_description_t *sd; + bson_error_t error; (void)return_value_ptr; (void)return_value_used; @@ -332,11 +341,11 @@ PHP_METHOD(Server, isArbiter) return; } - if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id))) { + if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id, &error))) { RETURN_BOOL(sd->type == MONGOC_SERVER_RS_ARBITER); } - phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", "Failed to get server description, server likely gone"); + phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "Failed to get server description: %s", error.message); } /* }}} */ /* {{{ proto bool Server::isHidden() @@ -345,6 +354,7 @@ PHP_METHOD(Server, isHidden) { php_phongo_server_t *intern; mongoc_server_description_t *sd; + bson_error_t error; (void)return_value_ptr; (void)return_value_used; @@ -354,13 +364,13 @@ PHP_METHOD(Server, isHidden) return; } - if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id))) { + if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id, &error))) { bson_iter_t iter; RETURN_BOOL(bson_iter_init_find_case(&iter, &sd->last_is_master, "hidden") && bson_iter_as_bool(&iter)); } - phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", "Failed to get server description, server likely gone"); + phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "Failed to get server description: %s", error.message); } /* }}} */ /* {{{ proto bool Server::isPassive() @@ -369,6 +379,7 @@ PHP_METHOD(Server, isPassive) { php_phongo_server_t *intern; mongoc_server_description_t *sd; + bson_error_t error; (void)return_value_ptr; (void)return_value_used; @@ -378,13 +389,13 @@ PHP_METHOD(Server, isPassive) return; } - if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id))) { + if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id, &error))) { bson_iter_t iter; RETURN_BOOL(bson_iter_init_find_case(&iter, &sd->last_is_master, "passive") && bson_iter_as_bool(&iter)); } - phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", "Failed to get server description, server likely gone"); + phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "Failed to get server description: %s", error.message); } /* }}} */ @@ -470,16 +481,24 @@ static int php_phongo_server_compare_objects(zval *o1, zval *o2 TSRMLS_DC) /* {{ { php_phongo_server_t *intern1; php_phongo_server_t *intern2; + bson_error_t error1; + bson_error_t error2; mongoc_server_description_t *sd1, *sd2; intern1 = (php_phongo_server_t *)zend_object_store_get_object(o1 TSRMLS_CC); intern2 = (php_phongo_server_t *)zend_object_store_get_object(o2 TSRMLS_CC); - sd1 = mongoc_topology_description_server_by_id(&intern1->client->topology->description, intern1->server_id); - sd2 = mongoc_topology_description_server_by_id(&intern2->client->topology->description, intern2->server_id); + sd1 = mongoc_topology_description_server_by_id(&intern1->client->topology->description, intern1->server_id, &error1); + sd2 = mongoc_topology_description_server_by_id(&intern2->client->topology->description, intern2->server_id, &error2); if (!sd1 || !sd2) { - phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", "Failed to get server description, server likely gone"); + if (!sd1 && !sd2) { + phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "Failed to get server descriptions: %s and %s", error1.message, error2.message); + } else if (!sd1) { + phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "Failed to get server description: %s", error1.message); + } else { + phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "Failed to get server description: %s", error2.message); + } return 0; } @@ -517,14 +536,14 @@ HashTable *php_phongo_server_get_debug_info(zval *object, int *is_temp TSRMLS_DC php_phongo_server_t *intern = NULL; zval retval = zval_used_for_init; mongoc_server_description_t *sd; - + bson_error_t error; *is_temp = 1; intern = (php_phongo_server_t *)zend_object_store_get_object(object TSRMLS_CC); - if (!(sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id))) { - phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", "Failed to get server description, server likely gone"); + if (!(sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id, &error))) { + phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "Failed to get server description: %s", error.message); return NULL; } diff --git a/src/libbson b/src/libbson index e434c354..96731f79 160000 --- a/src/libbson +++ b/src/libbson @@ -1 +1 @@ -Subproject commit e434c354a3939db063ee78345834baed19002f7e +Subproject commit 96731f7926a8480d8f456ee163db6bdf4fecdf9e diff --git a/src/libmongoc b/src/libmongoc index 495cd3ff..4839021d 160000 --- a/src/libmongoc +++ b/src/libmongoc @@ -1 +1 @@ -Subproject commit 495cd3ffa9beade31c2b410eb5e9555c7db240e1 +Subproject commit 4839021d589f8948cbfac3a5bc795a79c980237d diff --git a/tests/manager/manager-executeCommand-001.phpt b/tests/manager/manager-executeCommand-001.phpt index 0cecc288..98bf32cb 100644 --- a/tests/manager/manager-executeCommand-001.phpt +++ b/tests/manager/manager-executeCommand-001.phpt @@ -38,7 +38,7 @@ object(MongoDB\Driver\Command)#%d (1) { bool(true) object(MongoDB\Driver\Cursor)#%d (%d) { ["cursor"]=> - array(19) { + array(%d) { ["stamp"]=> int(0) ["is_command"]=> @@ -47,14 +47,10 @@ object(MongoDB\Driver\Cursor)#%d (%d) { bool(true) ["done"]=> bool(false) - ["failed"]=> - bool(false) ["end_of_event"]=> bool(false) ["in_exhaust"]=> bool(false) - ["redir_primary"]=> - bool(false) ["has_fields"]=> bool(false) ["query"]=> diff --git a/tests/manager/manager-executeQuery-001.phpt b/tests/manager/manager-executeQuery-001.phpt index 7268b9e4..fe4a1281 100644 --- a/tests/manager/manager-executeQuery-001.phpt +++ b/tests/manager/manager-executeQuery-001.phpt @@ -36,7 +36,7 @@ var_dump(iterator_to_array($qr)); bool(true) object(MongoDB\Driver\Cursor)#%d (%d) { ["cursor"]=> - array(19) { + array(%d) { ["stamp"]=> int(0) ["is_command"]=> @@ -45,14 +45,10 @@ object(MongoDB\Driver\Cursor)#%d (%d) { bool(true) ["done"]=> bool(false) - ["failed"]=> - bool(false) ["end_of_event"]=> bool(false) ["in_exhaust"]=> bool(false) - ["redir_primary"]=> - bool(false) ["has_fields"]=> bool(true) ["query"]=> diff --git a/tests/readPreference/bug0146.phpt b/tests/readPreference/bug0146.phpt index d55141a2..4122f68c 100644 --- a/tests/readPreference/bug0146.phpt +++ b/tests/readPreference/bug0146.phpt @@ -32,7 +32,7 @@ foreach($rps as $r) { --EXPECTF-- object(MongoDB\Driver\Cursor)#%d (%d) { ["cursor"]=> - array(18) { + array(%d) { ["stamp"]=> int(0) ["is_command"]=> @@ -41,14 +41,10 @@ object(MongoDB\Driver\Cursor)#%d (%d) { bool(true) ["done"]=> bool(true) - ["failed"]=> - bool(false) ["end_of_event"]=> bool(true) ["in_exhaust"]=> bool(false) - ["redir_primary"]=> - bool(false) ["has_fields"]=> bool(false) ["query"]=> @@ -88,7 +84,7 @@ object(MongoDB\Driver\Cursor)#%d (%d) { } object(MongoDB\Driver\Cursor)#%d (%d) { ["cursor"]=> - array(18) { + array(%d) { ["stamp"]=> int(0) ["is_command"]=> @@ -97,14 +93,10 @@ object(MongoDB\Driver\Cursor)#%d (%d) { bool(true) ["done"]=> bool(true) - ["failed"]=> - bool(false) ["end_of_event"]=> bool(true) ["in_exhaust"]=> bool(false) - ["redir_primary"]=> - bool(false) ["has_fields"]=> bool(false) ["query"]=> @@ -144,7 +136,7 @@ object(MongoDB\Driver\Cursor)#%d (%d) { } object(MongoDB\Driver\Cursor)#%d (%d) { ["cursor"]=> - array(18) { + array(%d) { ["stamp"]=> int(0) ["is_command"]=> @@ -153,14 +145,10 @@ object(MongoDB\Driver\Cursor)#%d (%d) { bool(true) ["done"]=> bool(true) - ["failed"]=> - bool(false) ["end_of_event"]=> bool(true) ["in_exhaust"]=> bool(false) - ["redir_primary"]=> - bool(false) ["has_fields"]=> bool(false) ["query"]=> @@ -200,7 +188,7 @@ object(MongoDB\Driver\Cursor)#%d (%d) { } object(MongoDB\Driver\Cursor)#%d (%d) { ["cursor"]=> - array(18) { + array(%d) { ["stamp"]=> int(0) ["is_command"]=> @@ -209,14 +197,10 @@ object(MongoDB\Driver\Cursor)#%d (%d) { bool(true) ["done"]=> bool(true) - ["failed"]=> - bool(false) ["end_of_event"]=> bool(true) ["in_exhaust"]=> bool(false) - ["redir_primary"]=> - bool(false) ["has_fields"]=> bool(false) ["query"]=> @@ -256,7 +240,7 @@ object(MongoDB\Driver\Cursor)#%d (%d) { } object(MongoDB\Driver\Cursor)#%d (%d) { ["cursor"]=> - array(18) { + array(%d) { ["stamp"]=> int(0) ["is_command"]=> @@ -265,14 +249,10 @@ object(MongoDB\Driver\Cursor)#%d (%d) { bool(true) ["done"]=> bool(true) - ["failed"]=> - bool(false) ["end_of_event"]=> bool(true) ["in_exhaust"]=> bool(false) - ["redir_primary"]=> - bool(false) ["has_fields"]=> bool(false) ["query"]=> diff --git a/tests/server/server-executeCommand-001.phpt b/tests/server/server-executeCommand-001.phpt index e3498e2c..c1ac7805 100644 --- a/tests/server/server-executeCommand-001.phpt +++ b/tests/server/server-executeCommand-001.phpt @@ -27,7 +27,7 @@ var_dump($server == $result->getServer()); bool(true) object(MongoDB\Driver\Cursor)#%d (%d) { ["cursor"]=> - array(19) { + array(%d) { ["stamp"]=> int(0) ["is_command"]=> @@ -36,14 +36,10 @@ object(MongoDB\Driver\Cursor)#%d (%d) { bool(true) ["done"]=> bool(false) - ["failed"]=> - bool(false) ["end_of_event"]=> bool(false) ["in_exhaust"]=> bool(false) - ["redir_primary"]=> - bool(false) ["has_fields"]=> bool(false) ["query"]=>