public function __construct($message, $code = 0, \Exception $previous = null)
 {
     parent::__construct($message, $code, $previous);
     preg_match("/Duplicate entry '([^']+)' for key '([^']+)'/i", $message, $output);
     if ($output) {
         $messageFormat = 'Duplicate value: %s<br>(%s)';
         $this->message = sprintf($messageFormat, $output[1], $output[2]);
     }
 }
Example #2
0
 /**
  * Kills a process on the server.
  */
 public function actionKillProcess()
 {
     $ids = CJSON::decode(Yii::app()->getRequest()->getParam('ids'));
     $response = new AjaxResponse();
     $response->refresh = true;
     foreach ($ids as $id) {
         $sql = 'KILL ' . $id;
         try {
             Yii::app()->getDb()->setActive(true);
             $cmd = Yii::app()->getDb()->createCommand($sql);
             $cmd->prepare();
             $cmd->execute();
             $response->addNotification('success', Yii::t('core', 'successKillProcess', array('{id}' => $id)), null, $sql);
         } catch (CDbException $ex) {
             $ex = new DbException($cmd);
             $response->addNotification('error', Yii::t('core', 'errorKillProcess', array('{id}' => $id)), $ex->getText(), $sql);
         }
     }
     $this->sendJSON($response);
 }
Example #3
0
 /**
  * Constructor.
  *
  * @param \PDOException $e
  * @param string        $sql
  * @param array         $parameters
  */
 public function __construct(\PDOException $e, $sql = '', array $parameters = [])
 {
     $this->sql = $sql;
     $this->parameters = $parameters;
     $extraMessage = '';
     if (!empty($this->sql)) {
         $extraMessage .= " [SQL: {$this->sql}]";
     }
     if (!empty($this->parameters)) {
         $extraMessage .= " [Parameters: " . implode(', ', $this->parameters) . "]";
     }
     parent::__construct($e, $extraMessage);
 }
Example #4
0
 public function __construct(\PDOException $exception, array $config, $sql, $code = 10501)
 {
     $error = $exception->errorInfo;
     $this->setData('PDO Error Info', array('SQLSTATE' => $error[0], 'Driver Error Code' => $error[1], 'Driver Error Message' => isset($error[2]) ? $error[2] : ''));
     parent::__construct($exception->getMessage(), $config, $sql, $code);
 }
Example #5
0
 /**
  * Check if $e is PEAR error, if so, throw as DbException
  *
  * @param $e PEAR_Error|array|object|int
  */
 private function assertError($e, $depth = 2)
 {
     if (!Misc::isError($e)) {
         return;
     }
     list($file, $line) = self::getTrace($depth);
     Error_Handler::logError(array($e->getMessage(), $e->getDebugInfo()), $file, $line);
     $de = new DbException($e->getMessage(), $e->getCode());
     $de->setExceptionLocation($file, $line);
     error_log($de->getMessage());
     error_log($de->getTraceAsString());
     throw $de;
 }
Example #6
0
    public function run()
    {
        $response = new AjaxResponse();
        $profiling = Yii::app()->user->settings->get('profiling');
        try {
            $sqlQuery = new SqlQuery($this->query);
        } catch (SQPException $ex) {
            $response->addNotification('error', Yii::t('core', 'errorExecuteQuery'), $ex->getMessage());
            $this->response = $response;
            return;
        }
        if (!$this->query) {
            $this->query = $this->getDefaultQuery();
            $queries = (array) $this->query;
        } else {
            if ($profiling) {
                $cmd = $this->db->createCommand('FLUSH STATUS');
                $cmd->execute();
                $cmd = $this->db->createCommand('SET PROFILING = 1');
                $cmd->execute();
            }
            $splitter = new SqlSplitter($this->query);
            $queries = $splitter->getQueries();
        }
        if ($this->execute) {
            $queryCount = count($queries);
            $i = 1;
            foreach ($queries as $query) {
                try {
                    $sqlQuery = new SqlQuery($query);
                } catch (SQPException $ex) {
                    $response->addNotification('error', Yii::t('core', 'errorExecuteQuery'), $ex->getMessage());
                    break;
                }
                $type = $sqlQuery->getType();
                $this->table = $sqlQuery->getTable();
                $this->tables = $sqlQuery->getTables();
                $this->singleTableSelect = count($this->tables) == 1;
                // SELECT
                if ($type == "select") {
                    // Pagination
                    $pages = new Pagination();
                    $pages->route = $this->route;
                    $pageSize = $pages->setupPageSize('pageSize', 'schema.table.browse');
                    // Sorting
                    $sort = new Sort($this->db);
                    $sort->multiSort = false;
                    $sort->route = $this->route;
                    $sqlQuery->applyCalculateFoundRows();
                    $limit = $sqlQuery->getLimit();
                    $order = $sqlQuery->getOrder();
                    // Apply sort
                    if ($sort->getOrder()) {
                        $sqlQuery->applySort($sort->getOrder(), true);
                    }
                    if (isset($_REQUEST['page'])) {
                        $offset = $_REQUEST['page'] * $pageSize - $pageSize;
                        $sqlQuery->applyLimit($pageSize, $offset, true);
                    }
                    // Set pagesize from query limit
                    if ($limit && !isset($_REQUEST[$pages->pageSizeVar])) {
                        $_REQUEST[$pages->pageSizeVar] = $limit['length'];
                        $pageSize = $pages->setupPageSize('pageSize', 'schema.table.browse');
                        $offset = $limit['start'];
                    } elseif (!$limit) {
                        $offset = 0;
                        $sqlQuery->applyLimit($pageSize, $offset, true);
                    } elseif (isset($_REQUEST[$pages->pageSizeVar])) {
                        $pageSize = $pages->setupPageSize('pageSize', 'schema.table.browse');
                        $offset = 0;
                        $sqlQuery->applyLimit($pageSize, $offset, true);
                    }
                    $this->start = (int) $offset;
                } elseif ($type == "insert" || $type == "update" || $type == "delete") {
                    #predie("insert / update / delete statement");
                    $response->refresh = true;
                } elseif ($type == "show") {
                    // show create table etc.
                } elseif ($type == "explain") {
                } elseif ($type == "analyze" || $type == "optimize" || $type == "repair" || $type == "check") {
                    // Table functions
                } elseif ($type == "use") {
                    $name = $sqlQuery->getDatabase();
                    if ($queryCount == 1 && $name && $this->schema != $name) {
                        $response->redirectUrl = Yii::app()->baseUrl . '/schema/' . $name . '#sql';
                        $response->addNotification('success', Yii::t('core', 'successChangeDatabase', array('{name}' => $name)));
                    }
                } elseif ($type == "create") {
                    $response->reload = true;
                } elseif ($type == "drop") {
                    $response->reload = true;
                }
                $this->executedQueries[] = $sqlQuery->getQuery();
                $this->originalQueries[] = $sqlQuery->getOriginalQuery();
                if ($type == "select") {
                    $pages->postVars = $sort->postVars = array('query' => $sqlQuery->getOriginalQuery());
                }
                // Prepare query for execution
                $cmd = $this->db->createCommand($sqlQuery->getQuery());
                $cmd->prepare();
                if ($this->hasResultSet = $sqlQuery->returnsResultSet() !== false) {
                    try {
                        // Fetch data
                        $start = microtime(true);
                        $data = $cmd->queryAll();
                        $time = round(microtime(true) - $start, 6);
                        SqlUtil::FixTable($data);
                        if ($type == 'select') {
                            $total = (int) $this->db->createCommand('SELECT FOUND_ROWS()')->queryScalar();
                            $pages->setItemCount($total);
                            $this->total = $total;
                            $keyData = array();
                        }
                        $columns = array();
                        // Fetch column headers
                        if (isset($data[0])) {
                            $columns = array_keys($data[0]);
                        }
                        $isSent = true;
                        $this->lastResultSetQuery = $sqlQuery->getOriginalQuery();
                    } catch (CDbException $ex) {
                        $ex = new DbException($cmd);
                        $response->addNotification('error', Yii::t('core', 'errorExecuteQuery'), $ex->getText(), $ex->getSql());
                    }
                } else {
                    try {
                        // Measure time
                        $start = microtime(true);
                        $result = $cmd->execute();
                        $time = round(microtime(true) - $start, 6);
                        $response->addNotification('success', Yii::t('core', 'successExecuteQuery'), Yii::t('core', 'affectedRowsQueryTime', array($result, '{rows}' => $result, '{time}' => $time)), $sqlQuery->getQuery());
                    } catch (CDbException $ex) {
                        $dbException = new DbException($cmd);
                        $response->addNotification('error', Yii::t('core', 'errorExecuteQuery'), Yii::t('core', 'sqlErrorOccured', array('{errno}' => $dbException->getNumber(), '{errmsg}' => $dbException->getText())));
                    }
                }
                $i++;
            }
            if ($profiling) {
                $cmd = $this->db->createCommand('select
						state,
						SUM(duration) as total,
						COUNT(*) AS count
					FROM information_schema.profiling
					GROUP BY state
					ORDER by total desc');
                $cmd->prepare();
                $profileData = $cmd->queryAll();
                if (count($profileData)) {
                    $results = '<table class="profiling">';
                    foreach ($profileData as $item) {
                        $results .= '<tr>';
                        $results .= '<td class="state">' . ucfirst($item['state']) . '</td>';
                        $results .= '<td class="time">' . $item['total'] . '</td>';
                        $results .= '<td class="count">(' . $item['count'] . ')</td>';
                        $results .= '</tr>';
                    }
                    $results .= '</table>';
                    $response->addNotification('info', Yii::t('core', 'profilingResultsSortedByExecutionTime'), $results, null);
                }
            } else {
                if (isset($total) && isset($time)) {
                    $response->addNotification('success', Yii::t('core', 'successExecuteQuery'), Yii::t('core', 'foundRowsQueryTime', array(null, '{rows}' => $total, '{time}' => $time)), $sqlQuery->getQuery());
                }
            }
        }
        // Assign local variables to class properties
        if (isset($pages)) {
            $this->pagination = $pages;
        }
        if (isset($sort)) {
            $this->sort = $sort;
        }
        if (isset($type)) {
            $this->queryType = $type;
        }
        if (isset($columns)) {
            $this->columns = $columns;
            foreach ($this->columns as $column) {
                if ($this->getColumn($column) == null) {
                    $this->singleTableSelect = false;
                    break;
                }
            }
        }
        if (isset($data)) {
            $this->data = $data;
        }
        if (isset($response)) {
            $this->response = $response;
        }
    }
 public function __construct($message, $dbCode)
 {
     parent::__construct($message, $dbCode);
 }
Example #8
0
 /**
  * @param string $message Application message.
  * @param string $databaseMessage Database reason.
  * @param \Exception $previous The previous exception used for the exception chaining.
  */
 public function __construct($message = "", $databaseMessage = "", \Exception $previous = null)
 {
     parent::__construct($message, $databaseMessage, $previous);
 }
 public function __construct($message, $config, $sql, $bind, $code = 10502)
 {
     $this->setData('Bind Param', $bind);
     parent::__construct($message, $config, $sql, $code);
 }
Example #10
0
 /**
  * Check if $e is PEAR error, if so, throw as DbException
  *
  * @param $e PEAR_Error|array|object|int
  */
 private function assertError($e)
 {
     if (!Misc::isError($e)) {
         return;
     }
     $context = array('debuginfo' => $e->getDebugInfo());
     // walk up in $e->backtrace until we find ourself
     // and from it we can get method name and it's arguments
     foreach ($e->backtrace as $i => $stack) {
         if (!isset($stack['object'])) {
             continue;
         }
         if (!$stack['object'] instanceof self) {
             continue;
         }
         $context['method'] = $stack['function'];
         $context['arguments'] = $stack['args'];
         // add these last, they are least interesting ones
         $context['code'] = $e->getCode();
         $context['file'] = $stack['file'];
         $context['line'] = $stack['line'];
         break;
     }
     Logger::db()->error($e->getMessage(), $context);
     $de = new DbException($e->getMessage(), $e->getCode());
     if (isset($context['file'])) {
         $de->setExceptionLocation($context['file'], $context['line']);
     }
     throw $de;
 }
Example #11
0
 public function __toString()
 {
     return parent::__toString() . " key:[{$this->key}";
 }
Example #12
0
 public function runImport()
 {
     $response = new AjaxResponse();
     $response->refresh = true;
     $response->executeJavaScript('sideBar.loadTables("' . $this->schema . '")');
     $this->mimeType = CFileHelper::getMimeType($this->file);
     $filesize = filesize($this->file);
     // Open file and set position to last position
     switch ($this->mimeType) {
         // GZip - Files
         case 'application/x-gzip':
             $handle = gzopen($this->file, 'r');
             $content = gzread($handle, $filesize);
             gzclose($handle);
             break;
             // BZip - Files
         // BZip - Files
         case 'application/x-bzip2':
             $handle = bzopen($this->file, 'r');
             $content = bzread($handle, $filesize);
             bzclose($handle);
             break;
             // All other files (plain text)
         // All other files (plain text)
         default:
             $content = file_get_contents($this->file);
             break;
     }
     $sqlSplitter = new SqlSplitter($content);
     $queries = $sqlSplitter->getQueries();
     foreach ($queries as $query) {
         try {
             $cmd = $this->db->createCommand($query);
             # Do NOT prepare the statement, because of double quoting
             $cmd->execute();
         } catch (CDbException $ex) {
             $dbException = new DbException($cmd);
             if (!in_array(@$dbException->getNumber(), $this->ignoreErrorNumbers)) {
                 $dbException = new DbException($cmd);
                 $response->addNotification('error', Yii::t('core', 'errorExecuteQuery'), $dbException->getText() . '  ' . $dbException->getNumber(), StringUtil::cutText($dbException->getSql(), 100));
                 $response->addData('error', true);
                 $response->refresh = true;
                 @unlink($this->file);
                 return $response;
             }
         }
     }
     $response->addNotification('success', Yii::t('core', 'successImportFile'), Yii::t('core', 'executedQueries') . ":" . count($queries));
     // We cannot output json here, see: http://jquery.malsup.com/form/#file-upload
     Yii::app()->end($response);
 }