Пример #1
0
 public function likeContent($contentType, $contentId, $contentUserId, $likeUserId = null, $likeDate = null)
 {
     // hoist bits out of the Like Transaction
     SV_DeadlockAvoidance_DataWriter::enterTransaction();
     $ret = false;
     try {
         $ret = parent::likeContent($contentType, $contentId, $contentUserId, $likeUserId, $likeDate);
     } catch (Zend_Db_Statement_Mysqli_Exception $e) {
         SV_DeadlockAvoidance_DataWriter::exitTransaction(false);
         @XenForo_Db::rollbackAll();
         // something went wrong, retry
         if (stripos($e->getMessage(), "Deadlock found when trying to get lock; try restarting transaction") !== false) {
             SV_DeadlockAvoidance_DataWriter::enterTransaction();
             $ret = parent::likeContent($contentType, $contentId, $contentUserId, $likeUserId, $likeDate);
         } else {
             throw $e;
         }
     } finally {
         SV_DeadlockAvoidance_DataWriter::exitTransaction($ret);
     }
     return $ret;
 }
Пример #2
0
 public static function logException(Exception $e, $rollbackTransactions = true)
 {
     try {
         $db = XenForo_Application::get('db');
         if ($db->getConnection()) {
             $rootDir = XenForo_Application::getInstance()->getRootDir();
             $file = $e->getFile();
             if (strpos($file, $rootDir) === 0) {
                 $file = substr($file, strlen($rootDir));
                 if (strlen($file) && ($file[0] == '/' || $file[0] == '\\')) {
                     $file = substr($file, 1);
                 }
             }
             $requestPaths = XenForo_Application::get('requestPaths');
             $request = array('url' => $requestPaths['fullUri'], '_GET' => $_GET, '_POST' => $_POST);
             if ($rollbackTransactions) {
                 XenForo_Db::rollbackAll($db);
             }
             $db->insert('xf_error_log', array('exception_date' => XenForo_Application::$time, 'user_id' => XenForo_Visitor::hasInstance() ? XenForo_Visitor::getUserId() : null, 'ip_address' => XenForo_Model::create('XenForo_Model_Login')->convertIpToLong(), 'exception_type' => get_class($e), 'message' => $e->getMessage(), 'filename' => $file, 'line' => $e->getLine(), 'trace_string' => $e->getTraceAsString(), 'request_state' => serialize($request)));
         }
     } catch (Exception $e) {
     }
 }
Пример #3
0
 public function runDeferred(array $deferred, $targetRunTime, &$status, &$canCancel)
 {
     $this->resetUniqueDeferInserts();
     $canCancel = false;
     if (!$this->deleteDeferredById($deferred['deferred_id'])) {
         // already being run
         return false;
     }
     $runner = XenForo_Deferred_Abstract::create($deferred['execute_class']);
     if (!$runner) {
         return false;
     }
     $data = unserialize($deferred['execute_data']);
     if (!self::$_shutdownRegistered) {
         self::$_shutdownRegistered = true;
         register_shutdown_function(array(__CLASS__, 'shutdownHandleFatalDeferred'));
     }
     self::$_runningDeferred = $deferred;
     try {
         $output = $runner->execute($deferred, $data, $targetRunTime, $status);
         self::$_runningDeferred = false;
     } catch (Exception $e) {
         self::$_runningDeferred = false;
         // transactions are likely from the manual runner, so we need to roll them back
         // as they probably won't be committed
         XenForo_Db::rollbackAll();
         if ($deferred['manual_execute']) {
             // reinsert and throw so a refresh will catch it
             XenForo_Application::defer($deferred['execute_class'], $data, $deferred['unique_key'], $deferred['manual_execute'], $deferred['trigger_date'], true);
             throw $e;
         } else {
             // log and ignore
             XenForo_Error::logException($e, false);
             $output = false;
             $status = "{$deferred['execute_class']} threw exception. See error log.";
             // TODO: phrase?
         }
     }
     if ($output === 'exit') {
         // this is for debugging - restore to previous state
         XenForo_Db::rollbackAll();
         XenForo_Application::defer($deferred['execute_class'], $data, $deferred['unique_key'], $deferred['manual_execute'], $deferred['trigger_date'], true);
         exit;
     } else {
         if (is_array($output)) {
             $canCancel = $runner->canCancel();
             return XenForo_Application::defer($deferred['execute_class'], $output, $deferred['unique_key'], $deferred['manual_execute'], $deferred['trigger_date'], true);
         } else {
             return false;
         }
     }
 }
Пример #4
0
 public static function logException($e, $rollbackTransactions = true, $messagePrefix = '')
 {
     $isValidArg = $e instanceof Exception || $e instanceof Throwable;
     if (!$isValidArg) {
         throw new Exception("logException requires an Exception or a Throwable");
     }
     try {
         $db = XenForo_Application::getDb();
         if ($db->getConnection()) {
             if ($rollbackTransactions) {
                 @XenForo_Db::rollbackAll($db);
             }
             $dbVersionId = @$db->fetchOne("SELECT option_value FROM xf_option WHERE option_id = 'currentVersionId'");
             if ($dbVersionId && $dbVersionId != XenForo_Application::$versionId) {
                 // do not log errors when an upgrade is pending
                 return;
             }
             if (!file_exists(XenForo_Helper_File::getInternalDataPath() . '/install-lock.php')) {
                 // install hasn't finished yet, don't write
                 return;
             }
             $rootDir = XenForo_Application::getInstance()->getRootDir();
             $file = $e->getFile();
             if (strpos($file, $rootDir) === 0) {
                 $file = substr($file, strlen($rootDir));
                 if (strlen($file) && ($file[0] == '/' || $file[0] == '\\')) {
                     $file = substr($file, 1);
                 }
             }
             $requestPaths = XenForo_Application::get('requestPaths');
             $request = array('url' => $requestPaths['fullUri'], '_GET' => $_GET, '_POST' => $_POST);
             // don't log passwords
             foreach ($request['_POST'] as $key => &$value) {
                 if (strpos($key, 'password') !== false || $key == '_xfToken') {
                     $value = '********';
                 }
             }
             $db->insert('xf_error_log', array('exception_date' => XenForo_Application::$time, 'user_id' => XenForo_Visitor::hasInstance() ? XenForo_Visitor::getUserId() : null, 'ip_address' => XenForo_Helper_Ip::getBinaryIp(), 'exception_type' => get_class($e), 'message' => $messagePrefix . $e->getMessage(), 'filename' => $file, 'line' => $e->getLine(), 'trace_string' => $e->getTraceAsString(), 'request_state' => serialize($request)));
         }
     } catch (Exception $e) {
     }
 }