/** * Remove all the transactions from the manager * */ PHP_METHOD(Phalcon_Mvc_Model_Transaction_Manager, collectTransactions){ zval *transactions, *managed_transaction = NULL; HashTable *ah0; HashPosition hp0; zval **hd; PHALCON_MM_GROW(); PHALCON_OBS_VAR(transactions); phalcon_read_property_this(&transactions, this_ptr, SL("_transactions"), PH_NOISY_CC); if (phalcon_fast_count_ev(transactions TSRMLS_CC)) { phalcon_is_iterable(transactions, &ah0, &hp0, 0, 0); while (zend_hash_get_current_data_ex(ah0, (void**) &hd, &hp0) == SUCCESS) { PHALCON_GET_HVALUE(managed_transaction); phalcon_property_decr(this_ptr, SL("_number") TSRMLS_CC); zend_hash_move_forward_ex(ah0, &hp0); } phalcon_update_property_null(this_ptr, SL("_transactions") TSRMLS_CC); } PHALCON_MM_RESTORE(); }
/** * Rollbacks the active transaction in the connection * * @return boolean */ PHP_METHOD(Phalcon_Db_Adapter_Pdo, rollback){ zval *pdo, *transaction_level, *events_manager; zval *event_name, *status; PHALCON_MM_GROW(); PHALCON_OBS_VAR(pdo); phalcon_read_property(&pdo, this_ptr, SL("_pdo"), PH_NOISY_CC); if (Z_TYPE_P(pdo) != IS_OBJECT) { RETURN_MM_FALSE; } /** * Reduce the transaction nesting level */ phalcon_property_decr(this_ptr, SL("_transactionLevel") TSRMLS_CC); /** * Check the transaction nesting level */ PHALCON_OBS_VAR(transaction_level); phalcon_read_property(&transaction_level, this_ptr, SL("_transactionLevel"), PH_NOISY_CC); if (zend_is_true(transaction_level)) { RETURN_MM_FALSE; } PHALCON_OBS_VAR(events_manager); phalcon_read_property(&events_manager, this_ptr, SL("_eventsManager"), PH_NOISY_CC); /** * Notify the events manager about the rollbacked transaction */ if (Z_TYPE_P(events_manager) == IS_OBJECT) { PHALCON_INIT_VAR(event_name); ZVAL_STRING(event_name, "db:rollbackTransaction", 1); PHALCON_CALL_METHOD_PARAMS_2_NORETURN(events_manager, "fire", event_name, this_ptr); } PHALCON_INIT_VAR(status); PHALCON_CALL_METHOD(status, pdo, "rollback"); RETURN_CCTOR(status); }
/** * Removes transactions from the TransactionManager * * @param Phalcon\Mvc\Model\TransactionInterface $transaction */ PHP_METHOD(Phalcon_Mvc_Model_Transaction_Manager, _collectTransaction){ zval *transaction, *transactions, *new_transactions; zval *managed_transaction = NULL; HashTable *ah0; HashPosition hp0; zval **hd; PHALCON_MM_GROW(); phalcon_fetch_params(1, 1, 0, &transaction); PHALCON_OBS_VAR(transactions); phalcon_read_property_this(&transactions, this_ptr, SL("_transactions"), PH_NOISY_CC); if (phalcon_fast_count_ev(transactions TSRMLS_CC)) { PHALCON_INIT_VAR(new_transactions); array_init(new_transactions); phalcon_is_iterable(transactions, &ah0, &hp0, 0, 0); while (zend_hash_get_current_data_ex(ah0, (void**) &hd, &hp0) == SUCCESS) { PHALCON_GET_HVALUE(managed_transaction); if (PHALCON_IS_EQUAL(managed_transaction, transaction)) { phalcon_array_append(&new_transactions, transaction, PH_SEPARATE); phalcon_property_decr(this_ptr, SL("_number") TSRMLS_CC); } zend_hash_move_forward_ex(ah0, &hp0); } phalcon_update_property_this(this_ptr, SL("_transactions"), new_transactions TSRMLS_CC); } PHALCON_MM_RESTORE(); }
/** * Rollbacks the active transaction in the connection * * @param boolean $nesting * @return boolean */ PHP_METHOD(Phalcon_Db_Adapter_Pdo, rollback){ zval *nesting = NULL, *pdo, *transaction_level, *events_manager = NULL; zval *event_name = NULL, *ntw_savepoint = NULL, *savepoint_name = NULL; PHALCON_MM_GROW(); phalcon_fetch_params(1, 0, 1, &nesting); if (!nesting) { nesting = PHALCON_GLOBAL(z_true); } pdo = phalcon_fetch_nproperty_this(this_ptr, SL("_pdo"), PH_NOISY TSRMLS_CC); if (Z_TYPE_P(pdo) != IS_OBJECT) { RETURN_MM_FALSE; } /** * Check the transaction nesting level */ transaction_level = phalcon_fetch_nproperty_this(this_ptr, SL("_transactionLevel"), PH_NOISY TSRMLS_CC); if (!zend_is_true(transaction_level)) { PHALCON_THROW_EXCEPTION_STR(phalcon_db_exception_ce, "There is no active transaction"); return; } if (PHALCON_IS_LONG(transaction_level, 1)) { events_manager = phalcon_fetch_nproperty_this(this_ptr, SL("_eventsManager"), PH_NOISY TSRMLS_CC); /** * Notify the events manager about the rollbacked transaction */ if (Z_TYPE_P(events_manager) == IS_OBJECT) { PHALCON_INIT_VAR(event_name); ZVAL_STRING(event_name, "db:rollbackTransaction", 1); PHALCON_CALL_METHOD(NULL, events_manager, "fire", event_name, this_ptr); } /** * Reduce the transaction nesting level */ phalcon_property_decr(this_ptr, SL("_transactionLevel") TSRMLS_CC); PHALCON_RETURN_CALL_METHOD(pdo, "rollback"); RETURN_MM(); } if (zend_is_true(transaction_level)) { if (zend_is_true(nesting)) { PHALCON_CALL_METHOD(&ntw_savepoint, this_ptr, "isnestedtransactionswithsavepoints"); if (zend_is_true(ntw_savepoint)) { events_manager = phalcon_fetch_nproperty_this(this_ptr, SL("_eventsManager"), PH_NOISY TSRMLS_CC); PHALCON_CALL_METHOD(&savepoint_name, this_ptr, "getnestedtransactionsavepointname"); /** * Notify the events manager about the rollbacked savepoint */ if (Z_TYPE_P(events_manager) == IS_OBJECT) { PHALCON_INIT_NVAR(event_name); ZVAL_STRING(event_name, "db:rollbackSavepoint", 1); PHALCON_CALL_METHOD(NULL, events_manager, "fire", event_name, this_ptr, savepoint_name); } /** * Reduce the transaction nesting level */ phalcon_property_decr(this_ptr, SL("_transactionLevel") TSRMLS_CC); PHALCON_RETURN_CALL_METHOD(this_ptr, "rollbacksavepoint", savepoint_name); RETURN_MM(); } } } /** * Reduce the transaction nesting level */ if (PHALCON_GT_LONG(transaction_level, 0)) { phalcon_property_decr(this_ptr, SL("_transactionLevel") TSRMLS_CC); } RETURN_MM_FALSE; }
/** * Commits the active transaction in the connection * * @param boolean $nesting * @return boolean */ PHP_METHOD(Phalcon_Db_Adapter_Pdo, commit){ zval *nesting = NULL, *pdo, *transaction_level, *events_manager = NULL; zval *event_name = NULL, *ntw_savepoint, *savepoint_name; PHALCON_MM_GROW(); phalcon_fetch_params(1, 0, 1, &nesting); if (!nesting) { PHALCON_INIT_VAR(nesting); ZVAL_BOOL(nesting, 1); } PHALCON_OBS_VAR(pdo); phalcon_read_property_this(&pdo, this_ptr, SL("_pdo"), PH_NOISY_CC); if (Z_TYPE_P(pdo) != IS_OBJECT) { RETURN_MM_FALSE; } /** * Check the transaction nesting level */ PHALCON_OBS_VAR(transaction_level); phalcon_read_property_this(&transaction_level, this_ptr, SL("_transactionLevel"), PH_NOISY_CC); if (!zend_is_true(transaction_level)) { PHALCON_THROW_EXCEPTION_STR(phalcon_db_exception_ce, "There is no active transaction"); return; } if (PHALCON_IS_LONG(transaction_level, 1)) { PHALCON_OBS_VAR(events_manager); phalcon_read_property_this(&events_manager, this_ptr, SL("_eventsManager"), PH_NOISY_CC); /** * Notify the events manager about the commited transaction */ if (Z_TYPE_P(events_manager) == IS_OBJECT) { PHALCON_INIT_VAR(event_name); ZVAL_STRING(event_name, "db:commitTransaction", 1); phalcon_call_method_p2_noret(events_manager, "fire", event_name, this_ptr); } /** * Reduce the transaction nesting level */ phalcon_property_decr(this_ptr, SL("_transactionLevel") TSRMLS_CC); phalcon_call_method(return_value, pdo, "commit"); RETURN_MM(); } else { if (zend_is_true(transaction_level)) { if (zend_is_true(nesting)) { /** * Check if the current database system supports nested transactions */ PHALCON_INIT_VAR(ntw_savepoint); phalcon_call_method(ntw_savepoint, this_ptr, "isnestedtransactionswithsavepoints"); if (zend_is_true(ntw_savepoint)) { PHALCON_OBS_NVAR(events_manager); phalcon_read_property_this(&events_manager, this_ptr, SL("_eventsManager"), PH_NOISY_CC); PHALCON_INIT_VAR(savepoint_name); phalcon_call_method(savepoint_name, this_ptr, "getnestedtransactionsavepointname"); /** * Notify the events manager about the commited savepoint */ if (Z_TYPE_P(events_manager) == IS_OBJECT) { PHALCON_INIT_NVAR(event_name); ZVAL_STRING(event_name, "db:releaseSavepoint", 1); phalcon_call_method_p3_noret(events_manager, "fire", event_name, this_ptr, savepoint_name); } /** * Reduce the transaction nesting level */ phalcon_property_decr(this_ptr, SL("_transactionLevel") TSRMLS_CC); phalcon_call_method_p1(return_value, this_ptr, "releasesavepoint", savepoint_name); RETURN_MM(); } } } } /** * Reduce the transaction nesting level */ if (PHALCON_GT_LONG(transaction_level, 0)) { phalcon_property_decr(this_ptr, SL("_transactionLevel") TSRMLS_CC); } RETURN_MM_FALSE; }