@@ -238,7 +238,7 @@ static void php_phongo_log(mongoc_log_level_t log_level, const char *log_domain,
238238/* }}} */
239239
240240/* {{{ Init objects */
241- static void phongo_cursor_init (zval * return_value , mongoc_client_t * client , mongoc_cursor_t * cursor , zval * readPreference TSRMLS_DC ) /* {{{ */
241+ static void phongo_cursor_init (zval * return_value , mongoc_client_t * client , mongoc_cursor_t * cursor , zval * readPreference , zval * session TSRMLS_DC ) /* {{{ */
242242{
243243 php_phongo_cursor_t * intern ;
244244
@@ -256,15 +256,24 @@ static void phongo_cursor_init(zval *return_value, mongoc_client_t *client, mong
256256#else
257257 Z_ADDREF_P (readPreference );
258258 intern -> read_preference = readPreference ;
259+ #endif
260+ }
261+
262+ if (session ) {
263+ #if PHP_VERSION_ID >= 70000
264+ ZVAL_ZVAL (& intern -> session , session , 1 , 0 );
265+ #else
266+ Z_ADDREF_P (session );
267+ intern -> session = session ;
259268#endif
260269 }
261270} /* }}} */
262271
263- static void phongo_cursor_init_for_command (zval * return_value , mongoc_client_t * client , mongoc_cursor_t * cursor , const char * db , zval * command , zval * readPreference TSRMLS_DC ) /* {{{ */
272+ static void phongo_cursor_init_for_command (zval * return_value , mongoc_client_t * client , mongoc_cursor_t * cursor , const char * db , zval * command , zval * readPreference , zval * session TSRMLS_DC ) /* {{{ */
264273{
265274 php_phongo_cursor_t * intern ;
266275
267- phongo_cursor_init (return_value , client , cursor , readPreference TSRMLS_CC );
276+ phongo_cursor_init (return_value , client , cursor , readPreference , session TSRMLS_CC );
268277 intern = Z_CURSOR_OBJ_P (return_value );
269278
270279 intern -> database = estrdup (db );
@@ -277,11 +286,11 @@ static void phongo_cursor_init_for_command(zval *return_value, mongoc_client_t *
277286#endif
278287} /* }}} */
279288
280- static void phongo_cursor_init_for_query (zval * return_value , mongoc_client_t * client , mongoc_cursor_t * cursor , const char * namespace , zval * query , zval * readPreference TSRMLS_DC ) /* {{{ */
289+ static void phongo_cursor_init_for_query (zval * return_value , mongoc_client_t * client , mongoc_cursor_t * cursor , const char * namespace , zval * query , zval * readPreference , zval * session TSRMLS_DC ) /* {{{ */
281290{
282291 php_phongo_cursor_t * intern ;
283292
284- phongo_cursor_init (return_value , client , cursor , readPreference TSRMLS_CC );
293+ phongo_cursor_init (return_value , client , cursor , readPreference , session TSRMLS_CC );
285294 intern = Z_CURSOR_OBJ_P (return_value );
286295
287296 /* namespace has already been validated by phongo_execute_query() */
@@ -540,11 +549,13 @@ bool phongo_parse_read_preference(zval *options, zval **zreadPreference TSRMLS_D
540549 return true;
541550} /* }}} */
542551
543- /* Parses the "session" option for an execute method. If mongoc_opts is not
544- * NULL, the option will be appended. If zsession is not NULL, it will be
552+ /* Parses the "session" option for an execute method. The client object should
553+ * correspond to the Manager executing the operation and will be used to ensure
554+ * that the session is correctly associated with that client. If mongoc_opts is
555+ * not NULL, the option will be appended. If zsession is not NULL, it will be
545556 * assigned to the option. On error, false is returned and an exception is
546557 * thrown. */
547- static bool phongo_parse_session (zval * options , bson_t * mongoc_opts , zval * * zsession , mongoc_client_t * client TSRMLS_DC ) /* {{{ */
558+ static bool phongo_parse_session (zval * options , mongoc_client_t * client , bson_t * mongoc_opts , zval * * zsession TSRMLS_DC ) /* {{{ */
548559{
549560 zval * option = NULL ;
550561 const mongoc_client_session_t * client_session ;
@@ -652,7 +663,7 @@ bool phongo_execute_bulk_write(mongoc_client_t *client, const char *namespace, p
652663 return false;
653664 }
654665
655- if (!phongo_parse_session (options , NULL , & zsession , client TSRMLS_CC )) {
666+ if (!phongo_parse_session (options , client , NULL , & zsession TSRMLS_CC )) {
656667 /* Exception should already have been thrown */
657668 return false;
658669 }
@@ -746,6 +757,7 @@ int phongo_execute_query(mongoc_client_t *client, const char *namespace, zval *z
746757 char * collname ;
747758 mongoc_collection_t * collection ;
748759 zval * zreadPreference = NULL ;
760+ zval * zsession = NULL ;
749761
750762 if (!phongo_split_namespace (namespace , & dbname , & collname )) {
751763 phongo_throw_exception (PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC , "%s: %s" , "Invalid namespace provided" , namespace );
@@ -767,7 +779,7 @@ int phongo_execute_query(mongoc_client_t *client, const char *namespace, zval *z
767779 return false;
768780 }
769781
770- if (!phongo_parse_session (options , query -> opts , NULL , client TSRMLS_CC )) {
782+ if (!phongo_parse_session (options , client , query -> opts , & zsession TSRMLS_CC )) {
771783 /* Exception should already have been thrown */
772784 mongoc_collection_destroy (collection );
773785 return false;
@@ -797,7 +809,8 @@ int phongo_execute_query(mongoc_client_t *client, const char *namespace, zval *z
797809 return true;
798810 }
799811
800- phongo_cursor_init_for_query (return_value , client , cursor , namespace , zquery , zreadPreference TSRMLS_CC );
812+ phongo_cursor_init_for_query (return_value , client , cursor , namespace , zquery , zreadPreference , zsession TSRMLS_CC );
813+
801814 return true;
802815} /* }}} */
803816
@@ -823,6 +836,7 @@ int phongo_execute_command(mongoc_client_t *client, php_phongo_command_type_t ty
823836 bson_t opts = BSON_INITIALIZER ;
824837 mongoc_cursor_t * cmd_cursor ;
825838 zval * zreadPreference = NULL ;
839+ zval * zsession = NULL ;
826840 int result ;
827841
828842 command = Z_COMMAND_OBJ_P (zcommand );
@@ -839,7 +853,7 @@ int phongo_execute_command(mongoc_client_t *client, php_phongo_command_type_t ty
839853 return false;
840854 }
841855
842- if (!phongo_parse_session (options , & opts , NULL , client TSRMLS_CC )) {
856+ if (!phongo_parse_session (options , client , & opts , & zsession TSRMLS_CC )) {
843857 /* Exception should already have been thrown */
844858 bson_destroy (& opts );
845859 return false;
@@ -920,7 +934,7 @@ int phongo_execute_command(mongoc_client_t *client, php_phongo_command_type_t ty
920934 bson_destroy (& reply );
921935 }
922936
923- phongo_cursor_init_for_command (return_value , client , cmd_cursor , db , zcommand , zreadPreference TSRMLS_CC );
937+ phongo_cursor_init_for_command (return_value , client , cmd_cursor , db , zcommand , zreadPreference , zsession TSRMLS_CC );
924938 return true;
925939} /* }}} */
926940/* }}} */
0 commit comments