dao = $dao; $this->beginStmt = $beginStmt; $this->commitStmt = $commitStmt; $this->rollbackStmt = $rollbackStmt; $this->callbacks = array( \CRM_Core_Transaction::PHASE_PRE_COMMIT => array(), \CRM_Core_Transaction::PHASE_POST_COMMIT => array(), \CRM_Core_Transaction::PHASE_PRE_ROLLBACK => array(), \CRM_Core_Transaction::PHASE_POST_ROLLBACK => array(), ); } public function inc() { $this->refCount++; } public function dec() { $this->refCount--; } /** * @return bool */ public function isEmpty() { return ($this->refCount == 0); } /** * @return bool */ public function isRollbackOnly() { return !$this->doCommit; } public function setRollbackOnly() { $this->doCommit = FALSE; } public function begin() { assert('$this->state === self::F_NEW'); $this->state = self::F_ACTIVE; if ($this->beginStmt) { $this->dao->query($this->beginStmt); } } /** * @param int $newState * @void */ public function finish($newState = self::F_DONE) { if ($this->state == self::F_FORCED) { return; } assert('$this->state === self::F_ACTIVE'); $this->state = $newState; if ($this->doCommit) { $this->invokeCallbacks(\CRM_Core_Transaction::PHASE_PRE_COMMIT); if ($this->commitStmt) { $this->dao->query($this->commitStmt); } $this->invokeCallbacks(\CRM_Core_Transaction::PHASE_POST_COMMIT); } else { $this->invokeCallbacks(\CRM_Core_Transaction::PHASE_PRE_ROLLBACK); if ($this->rollbackStmt) { $this->dao->query($this->rollbackStmt); } $this->invokeCallbacks(\CRM_Core_Transaction::PHASE_POST_ROLLBACK); } } public function forceRollback() { $this->setRollbackOnly(); $this->finish(self::F_FORCED); } /** * Add a transaction callback. * * Pre-condition: isActive() * * @param int $phase * A constant; one of: self::PHASE_{PRE,POST}_{COMMIT,ROLLBACK}. * @param mixed $callback * A PHP callback. * @param array|NULL $params Optional values to pass to callback. * See php manual call_user_func_array for details. * @param null $id */ public function addCallback($phase, $callback, $params = NULL, $id = NULL) { if ($id) { $this->callbacks[$phase][$id] = array( 'callback' => $callback, 'parameters' => (is_array($params) ? $params : array($params)), ); } else { $this->callbacks[$phase][] = array( 'callback' => $callback, 'parameters' => (is_array($params) ? $params : array($params)), ); } } /** * @param int $phase */ public function invokeCallbacks($phase) { if (is_array($this->callbacks[$phase])) { foreach ($this->callbacks[$phase] as $cb) { call_user_func_array($cb['callback'], $cb['parameters']); } } } }