|
29 | 29 |
|
30 | 30 | zend_class_entry* php_phongo_session_ce;
|
31 | 31 |
|
| 32 | +#define PHONGO_TRANSACTION_NONE "none" |
| 33 | +#define PHONGO_TRANSACTION_STARTING "starting" |
| 34 | +#define PHONGO_TRANSACTION_IN_PROGRESS "in_progress" |
| 35 | +#define PHONGO_TRANSACTION_COMMITTED "committed" |
| 36 | +#define PHONGO_TRANSACTION_ABORTED "aborted" |
| 37 | + |
32 | 38 | #define SESSION_CHECK_LIVELINESS(i, m) \
|
33 | 39 | if (!(i)->client_session) { \
|
34 | 40 | phongo_throw_exception( \
|
@@ -93,6 +99,25 @@ static bool php_phongo_session_get_timestamp_parts(zval* obj, uint32_t* timestam
|
93 | 99 | return retval;
|
94 | 100 | }
|
95 | 101 |
|
| 102 | +static const char* php_phongo_get_transaction_state_string(mongoc_transaction_state_t state TSRMLS_DC) |
| 103 | +{ |
| 104 | + switch (state) { |
| 105 | + case MONGOC_TRANSACTION_NONE: |
| 106 | + return PHONGO_TRANSACTION_NONE; |
| 107 | + case MONGOC_TRANSACTION_STARTING: |
| 108 | + return PHONGO_TRANSACTION_STARTING; |
| 109 | + case MONGOC_TRANSACTION_IN_PROGRESS: |
| 110 | + return PHONGO_TRANSACTION_IN_PROGRESS; |
| 111 | + case MONGOC_TRANSACTION_COMMITTED: |
| 112 | + return PHONGO_TRANSACTION_COMMITTED; |
| 113 | + case MONGOC_TRANSACTION_ABORTED: |
| 114 | + return PHONGO_TRANSACTION_ABORTED; |
| 115 | + default: |
| 116 | + phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Invalid transaction state %d given", (int) state); |
| 117 | + return NULL; |
| 118 | + } |
| 119 | +} |
| 120 | + |
96 | 121 | /* {{{ proto void MongoDB\Driver\Session::advanceClusterTime(array|object $clusterTime)
|
97 | 122 | Advances the cluster time for this Session */
|
98 | 123 | static PHP_METHOD(Session, advanceClusterTime)
|
@@ -343,6 +368,30 @@ static PHP_METHOD(Session, getTransactionOptions)
|
343 | 368 | }
|
344 | 369 | } /* }}} */
|
345 | 370 |
|
| 371 | +/* {{{ proto string MongoDB\Driver\Session::getTransactionState() |
| 372 | + Returns the current transaction state for this session */ |
| 373 | +static PHP_METHOD(Session, getTransactionState) |
| 374 | +{ |
| 375 | + php_phongo_session_t* intern; |
| 376 | + const char* state; |
| 377 | + |
| 378 | + intern = Z_SESSION_OBJ_P(getThis()); |
| 379 | + SESSION_CHECK_LIVELINESS(intern, "getTransactionState") |
| 380 | + |
| 381 | + if (zend_parse_parameters_none() == FAILURE) { |
| 382 | + return; |
| 383 | + } |
| 384 | + |
| 385 | + state = php_phongo_get_transaction_state_string(mongoc_client_session_get_transaction_state(intern->client_session) TSRMLS_CC); |
| 386 | + if (!state) { |
| 387 | + /* Exception already thrown */ |
| 388 | + return; |
| 389 | + } |
| 390 | + |
| 391 | + PHONGO_RETURN_STRING(state); |
| 392 | +} /* }}} */ |
| 393 | + |
| 394 | + |
346 | 395 | /* Creates a opts structure from an array optionally containing an RP, RC,
|
347 | 396 | * WC object, and/or maxCommitTimeMS int. Returns NULL if no options were found,
|
348 | 397 | * or there was an invalid option. If there was an invalid option or structure,
|
@@ -572,6 +621,7 @@ static zend_function_entry php_phongo_session_me[] = {
|
572 | 621 | PHP_ME(Session, getOperationTime, ai_Session_void, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
|
573 | 622 | PHP_ME(Session, getServer, ai_Session_void, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
|
574 | 623 | PHP_ME(Session, getTransactionOptions, ai_Session_void, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
|
| 624 | + PHP_ME(Session, getTransactionState, ai_Session_void, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL) |
575 | 625 | PHP_ME(Session, isInTransaction, ai_Session_void, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
|
576 | 626 | PHP_ME(Session, startTransaction, ai_Session_startTransaction, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
|
577 | 627 | ZEND_NAMED_ME(__construct, PHP_FN(MongoDB_disabled___construct), ai_Session_void, ZEND_ACC_PRIVATE | ZEND_ACC_FINAL)
|
@@ -760,6 +810,12 @@ void php_phongo_session_init_ce(INIT_FUNC_ARGS) /* {{{ */
|
760 | 810 | php_phongo_handler_session.free_obj = php_phongo_session_free_object;
|
761 | 811 | php_phongo_handler_session.offset = XtOffsetOf(php_phongo_session_t, std);
|
762 | 812 | #endif
|
| 813 | + |
| 814 | + zend_declare_class_constant_string(php_phongo_session_ce, ZEND_STRL("TRANSACTION_NONE"), PHONGO_TRANSACTION_NONE TSRMLS_CC); |
| 815 | + zend_declare_class_constant_string(php_phongo_session_ce, ZEND_STRL("TRANSACTION_STARTING"), PHONGO_TRANSACTION_STARTING TSRMLS_CC); |
| 816 | + zend_declare_class_constant_string(php_phongo_session_ce, ZEND_STRL("TRANSACTION_IN_PROGRESS"), PHONGO_TRANSACTION_IN_PROGRESS TSRMLS_CC); |
| 817 | + zend_declare_class_constant_string(php_phongo_session_ce, ZEND_STRL("TRANSACTION_COMMITTED"), PHONGO_TRANSACTION_COMMITTED TSRMLS_CC); |
| 818 | + zend_declare_class_constant_string(php_phongo_session_ce, ZEND_STRL("TRANSACTION_ABORTED"), PHONGO_TRANSACTION_ABORTED TSRMLS_CC); |
763 | 819 | } /* }}} */
|
764 | 820 |
|
765 | 821 | /*
|
|
0 commit comments