@@ -209,7 +209,7 @@ static void php_phongo_log(mongoc_log_level_t log_level, const char* log_domain,
209209/* }}} */
210210
211211/* {{{ Init objects */
212- static void phongo_cursor_init (zval * return_value , mongoc_client_t * client , mongoc_cursor_t * cursor , zval * readPreference TSRMLS_DC ) /* {{{ */
212+ static void phongo_cursor_init (zval * return_value , mongoc_client_t * client , mongoc_cursor_t * cursor , zval * readPreference , zval * session TSRMLS_DC ) /* {{{ */
213213{
214214 php_phongo_cursor_t * intern ;
215215
@@ -227,15 +227,24 @@ static void phongo_cursor_init(zval* return_value, mongoc_client_t* client, mong
227227#else
228228 Z_ADDREF_P (readPreference );
229229 intern -> read_preference = readPreference ;
230+ #endif
231+ }
232+
233+ if (session ) {
234+ #if PHP_VERSION_ID >= 70000
235+ ZVAL_ZVAL (& intern -> session , session , 1 , 0 );
236+ #else
237+ Z_ADDREF_P (session );
238+ intern -> session = session ;
230239#endif
231240 }
232241} /* }}} */
233242
234- 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 ) /* {{{ */
243+ 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 ) /* {{{ */
235244{
236245 php_phongo_cursor_t * intern ;
237246
238- phongo_cursor_init (return_value , client , cursor , readPreference TSRMLS_CC );
247+ phongo_cursor_init (return_value , client , cursor , readPreference , session TSRMLS_CC );
239248 intern = Z_CURSOR_OBJ_P (return_value );
240249
241250 intern -> database = estrdup (db );
@@ -248,11 +257,11 @@ static void phongo_cursor_init_for_command(zval* return_value, mongoc_client_t*
248257#endif
249258} /* }}} */
250259
251- 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 ) /* {{{ */
260+ 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 ) /* {{{ */
252261{
253262 php_phongo_cursor_t * intern ;
254263
255- phongo_cursor_init (return_value , client , cursor , readPreference TSRMLS_CC );
264+ phongo_cursor_init (return_value , client , cursor , readPreference , session TSRMLS_CC );
256265 intern = Z_CURSOR_OBJ_P (return_value );
257266
258267 /* namespace has already been validated by phongo_execute_query() */
@@ -511,11 +520,13 @@ bool phongo_parse_read_preference(zval* options, zval** zreadPreference TSRMLS_D
511520 return true;
512521} /* }}} */
513522
514- /* Parses the "session" option for an execute method. If mongoc_opts is not
515- * NULL, the option will be appended. If zsession is not NULL, it will be
523+ /* Parses the "session" option for an execute method. The client object should
524+ * correspond to the Manager executing the operation and will be used to ensure
525+ * that the session is correctly associated with that client. If mongoc_opts is
526+ * not NULL, the option will be appended. If zsession is not NULL, it will be
516527 * assigned to the option. On error, false is returned and an exception is
517528 * thrown. */
518- static bool phongo_parse_session (zval * options , bson_t * mongoc_opts , zval * * zsession , mongoc_client_t * client TSRMLS_DC ) /* {{{ */
529+ static bool phongo_parse_session (zval * options , mongoc_client_t * client , bson_t * mongoc_opts , zval * * zsession TSRMLS_DC ) /* {{{ */
519530{
520531 zval * option = NULL ;
521532 const mongoc_client_session_t * client_session ;
@@ -623,7 +634,7 @@ bool phongo_execute_bulk_write(mongoc_client_t* client, const char* namespace, p
623634 return false;
624635 }
625636
626- if (!phongo_parse_session (options , NULL , & zsession , client TSRMLS_CC )) {
637+ if (!phongo_parse_session (options , client , NULL , & zsession TSRMLS_CC )) {
627638 /* Exception should already have been thrown */
628639 return false;
629640 }
@@ -716,6 +727,7 @@ int phongo_execute_query(mongoc_client_t* client, const char* namespace, zval* z
716727 char * collname ;
717728 mongoc_collection_t * collection ;
718729 zval * zreadPreference = NULL ;
730+ zval * zsession = NULL ;
719731
720732 if (!phongo_split_namespace (namespace , & dbname , & collname )) {
721733 phongo_throw_exception (PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC , "%s: %s" , "Invalid namespace provided" , namespace );
@@ -737,7 +749,7 @@ int phongo_execute_query(mongoc_client_t* client, const char* namespace, zval* z
737749 return false;
738750 }
739751
740- if (!phongo_parse_session (options , query -> opts , NULL , client TSRMLS_CC )) {
752+ if (!phongo_parse_session (options , client , query -> opts , & zsession TSRMLS_CC )) {
741753 /* Exception should already have been thrown */
742754 mongoc_collection_destroy (collection );
743755 return false;
@@ -767,7 +779,8 @@ int phongo_execute_query(mongoc_client_t* client, const char* namespace, zval* z
767779 return true;
768780 }
769781
770- phongo_cursor_init_for_query (return_value , client , cursor , namespace , zquery , zreadPreference TSRMLS_CC );
782+ phongo_cursor_init_for_query (return_value , client , cursor , namespace , zquery , zreadPreference , zsession TSRMLS_CC );
783+
771784 return true;
772785} /* }}} */
773786
@@ -793,6 +806,7 @@ int phongo_execute_command(mongoc_client_t* client, php_phongo_command_type_t ty
793806 bson_t opts = BSON_INITIALIZER ;
794807 mongoc_cursor_t * cmd_cursor ;
795808 zval * zreadPreference = NULL ;
809+ zval * zsession = NULL ;
796810 int result ;
797811
798812 command = Z_COMMAND_OBJ_P (zcommand );
@@ -809,7 +823,7 @@ int phongo_execute_command(mongoc_client_t* client, php_phongo_command_type_t ty
809823 return false;
810824 }
811825
812- if (!phongo_parse_session (options , & opts , NULL , client TSRMLS_CC )) {
826+ if (!phongo_parse_session (options , client , & opts , & zsession TSRMLS_CC )) {
813827 /* Exception should already have been thrown */
814828 bson_destroy (& opts );
815829 return false;
@@ -908,7 +922,7 @@ int phongo_execute_command(mongoc_client_t* client, php_phongo_command_type_t ty
908922 bson_destroy (& reply );
909923 }
910924
911- phongo_cursor_init_for_command (return_value , client , cmd_cursor , db , zcommand , zreadPreference TSRMLS_CC );
925+ phongo_cursor_init_for_command (return_value , client , cmd_cursor , db , zcommand , zreadPreference , zsession TSRMLS_CC );
912926 return true;
913927} /* }}} */
914928/* }}} */
0 commit comments