Array HHVM_METHOD(MongoDBDriverManager, getServers)
{
	MongoDBDriverManagerData     *data = Native::data<MongoDBDriverManagerData>(this_);
	size_t                        i;
	mongoc_server_description_t **sds;
	size_t                        n;

	Array retval = Array::Create();

	sds = mongoc_client_get_server_descriptions(data->m_client, &n);
	for (i = 0; i < n; i++) {
		if (sds[i]->type == MONGOC_SERVER_UNKNOWN) {
			continue;
		}

		retval.add(
			(int64_t) i,
			hippo_mongo_driver_server_create_from_id(data->m_client, sds[i]->id)
		);

	}
	mongoc_server_descriptions_destroy_all(sds, n);

	return retval;
}
Object HHVM_METHOD(MongoDBDriverManager, selectServer, const Object &readPreference)
{
	MongoDBDriverManagerData* data = Native::data<MongoDBDriverManagerData>(this_);
	MongoDBDriverReadPreferenceData *rp_data = Native::data<MongoDBDriverReadPreferenceData>(readPreference.get());
	bson_error_t error;
	mongoc_server_description_t *selected_server = NULL;
	Object tmp;

	selected_server = mongoc_client_select_server(data->m_client, false, rp_data->m_read_preference, &error);
	if (selected_server) {
		tmp = hippo_mongo_driver_server_create_from_id(data->m_client, selected_server->id);
		mongoc_server_description_destroy(selected_server);
		return tmp;
	} else {
		throw MongoDriver::Utils::throwExceptionFromBsonError(&error);
	}
}
Object HHVM_METHOD(MongoDBDriverWriteResult, getServer)
{
	MongoDBDriverWriteResultData* data = Native::data<MongoDBDriverWriteResultData>(this_);

	return hippo_mongo_driver_server_create_from_id(data->m_client, data->m_server_id);
}