diff --git a/ChangeLog b/ChangeLog index 5980e0b2cc..2aa0e0ba5e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -11,8 +11,18 @@ phpMyAdmin - ChangeLog - issue #11480 Notice Undefined index: drop_database - issue #11486 Server variable edition in ANSI_QUOTES sql_mode: losing current value - issue #11491 Propose table structure broken +- issue #11464 phpMyAdmin suggests upgrading to newer version not usable on that system +- issue #11495 'PMA_Microhistory' is undefined +- issue #11496 Incorrect definition for getTablesWhenOpen() +- issue #11500 Error when creating new user on MariaDB 10.0.21 -4.5.0.0 (not yet released) +4.5.0.2 (2015-09-25) +- issue #11497 Incorrect indexes when exporting + +4.5.0.1 (2015-09-24) +- issue #11492 AUTO_INCREMENT statements are partly missing from exports + +4.5.0.0 (2015-09-23) + rfe Pagination for GIS visualization + issue #6207 Usability improvements for console + issue #6310 Access to Add columns text-box and Go button when creating table @@ -112,7 +122,7 @@ phpMyAdmin - ChangeLog - issue #11448 Clarify doc about the MemoryLimit directive - issue #11489 Cannot copy a database under certain conditions -4.4.15.0 (not yet released) +4.4.15.0 (2015-09-20) - issue #11411 Undefined "replace" function on numeric scalar - issue #11421 Stored-proc / routine - broken parameter parsing - issue Missing name for configuration read_as_multibytes diff --git a/doc/require.rst b/doc/require.rst index db5730f12a..61ab4bc179 100644 --- a/doc/require.rst +++ b/doc/require.rst @@ -20,8 +20,8 @@ PHP * You need GD2 support in PHP to display inline thumbnails of JPEGs ("image/jpeg: inline") with their original aspect ratio. -* When using the cookie authentication (the default), the `mcrypt - `_ extension is strongly suggested. +* When using the cookie authentication (the default), the `openssl + `_ extension is strongly suggested. * To support upload progress bars, see :ref:`faq2_9`. diff --git a/export.php b/export.php index 89e1acd3d9..2b499a273e 100644 --- a/export.php +++ b/export.php @@ -410,7 +410,7 @@ if (!defined('TESTSUITE')) { // Will we need relation & co. setup? $do_relation = isset($GLOBALS[$what . '_relation']); $do_comments = isset($GLOBALS[$what . '_include_comments']) - || isset($GLOBALS[$what . '_comments']) ; + || isset($GLOBALS[$what . '_comments']); $do_mime = isset($GLOBALS[$what . '_mime']); if ($do_relation || $do_comments || $do_mime) { $cfgRelation = PMA_getRelationsParam(); diff --git a/js/functions.js b/js/functions.js index ca155cf049..44a6ceb71e 100644 --- a/js/functions.js +++ b/js/functions.js @@ -2837,7 +2837,7 @@ AJAX.registerOnload('functions.js', function () { // Redirect to table structure page on creation of new table var params_12 = 'ajax_request=true&ajax_page_request=true'; if (! (history && history.pushState)) { - params_12 += PMA_Microhistory.menus.getRequestParam(); + params_12 += PMA_MicroHistory.menus.getRequestParam(); } tblStruct_url = 'tbl_structure.php?server=' + data._params.server + '&db='+ data._params.db + '&token=' + data._params.token + @@ -3971,7 +3971,7 @@ AJAX.registerOnload('functions.js', function () { * Load version information asynchronously. */ if ($('li.jsversioncheck').length > 0) { - $.getJSON('version_check.php', {}, PMA_current_version); + $.getJSON('version_check.php', {'server' : PMA_commonParams.get('server')}, PMA_current_version); } if ($('#is_git_revision').length > 0) { diff --git a/js/server_databases.js b/js/server_databases.js index 42cb7868b6..50506a5724 100644 --- a/js/server_databases.js +++ b/js/server_databases.js @@ -128,7 +128,7 @@ AJAX.registerOnload('server_databases.js', function () { dbStruct_url = dbStruct_url.replace(/amp;/ig, ''); var params = 'ajax_request=true&ajax_page_request=true'; if (! (history && history.pushState)) { - params += PMA_Microhistory.menus.getRequestParam(); + params += PMA_MicroHistory.menus.getRequestParam(); } $.get(dbStruct_url, params, AJAX.responseHandler); } else { diff --git a/js/sql.js b/js/sql.js index 7b858f1d1f..08b95a2e5d 100644 --- a/js/sql.js +++ b/js/sql.js @@ -396,12 +396,12 @@ AJAX.registerOnload('sql.js', function () { ); AJAX.handleMenu.replace(data._menu); } else { - PMA_Microhistory.menus.replace(data._menu); - PMA_Microhistory.menus.add(data._menuHash, data._menu); + PMA_MicroHistory.menus.replace(data._menu); + PMA_MicroHistory.menus.add(data._menuHash, data._menu); } } else if (data._menuHash) { if (! (history && history.pushState)) { - PMA_Microhistory.menus.replace(PMA_Microhistory.menus.get(data._menuHash)); + PMA_MicroHistory.menus.replace(PMA_MicroHistory.menus.get(data._menuHash)); } } diff --git a/libraries/DisplayResults.php b/libraries/DisplayResults.php index e754ab8b04..8da30c2e04 100644 --- a/libraries/DisplayResults.php +++ b/libraries/DisplayResults.php @@ -1190,10 +1190,9 @@ class DisplayResults // See if this column should get highlight because it's used in the // where-query. - $condition_field = (isset($highlight_columns[$fields_meta[$i]->name]) - || isset( - $highlight_columns[Util::backquote($fields_meta[$i]->name)]) - ) + $name = $fields_meta[$i]->name; + $condition_field = (isset($highlight_columns[$name]) + || isset($highlight_columns[Util::backquote($name)])) ? true : false; diff --git a/libraries/Footer.php b/libraries/Footer.php index 935aad4736..aaf8aeee22 100644 --- a/libraries/Footer.php +++ b/libraries/Footer.php @@ -321,7 +321,7 @@ class Footer $this->_scripts->addCode( sprintf( 'if (! (history && history.pushState)) ' - . 'PMA_Microhistory.primer = {' + . 'PMA_MicroHistory.primer = {' . ' url: "%s",' . ' scripts: %s,' . ' menuHash: "%s"' diff --git a/libraries/StorageEngine.php b/libraries/StorageEngine.php index 8ba763eebc..c6b33841d6 100644 --- a/libraries/StorageEngine.php +++ b/libraries/StorageEngine.php @@ -110,7 +110,7 @@ class StorageEngine if (PMA_MYSQL_INT_VERSION >= 50708) { $disabled = Util::cacheGet( 'disabled_storage_engines', - function() { + function () { return $GLOBALS['dbi']->fetchValue( 'SELECT @@disabled_storage_engines' ); diff --git a/libraries/Util.php b/libraries/Util.php index bad171d9d3..7397bcf1bf 100644 --- a/libraries/Util.php +++ b/libraries/Util.php @@ -4424,161 +4424,6 @@ class Util curl_setopt($curl_handle, CURLOPT_USERAGENT, 'phpMyAdmin/' . PMA_VERSION); return $curl_handle; } - /** - * Returns information with latest version from phpmyadmin.net - * - * @return object JSON decoded object with the data - */ - public static function getLatestVersion() - { - if (!$GLOBALS['cfg']['VersionCheck']) { - return new stdClass(); - } - - // wait 3s at most for server response, it's enough to get information - // from a working server - $connection_timeout = 3; - - $response = '{}'; - // Get response text from phpmyadmin.net or from the session - // Update cache every 6 hours - if (isset($_SESSION['cache']['version_check']) - && time() < $_SESSION['cache']['version_check']['timestamp'] + 3600 * 6 - ) { - $save = false; - $response = $_SESSION['cache']['version_check']['response']; - } else { - $save = true; - $file = 'https://www.phpmyadmin.net/home_page/version.json'; - if (ini_get('allow_url_fopen')) { - $context = array( - 'http' => array( - 'request_fulluri' => true, - 'timeout' => $connection_timeout, - ) - ); - $context = Util::handleContext($context); - if (! defined('TESTSUITE')) { - session_write_close(); - } - $response = file_get_contents( - $file, - false, - stream_context_create($context) - ); - } else if (function_exists('curl_init')) { - $curl_handle = curl_init($file); - if ($curl_handle === false) { - return null; - } - $curl_handle = Util::configureCurl($curl_handle); - curl_setopt( - $curl_handle, - CURLOPT_HEADER, - false - ); - curl_setopt( - $curl_handle, - CURLOPT_RETURNTRANSFER, - true - ); - curl_setopt( - $curl_handle, - CURLOPT_TIMEOUT, - $connection_timeout - ); - if (! defined('TESTSUITE')) { - session_write_close(); - } - $response = curl_exec($curl_handle); - } - } - - $data = json_decode($response); - if (is_object($data) - && ! empty($data->version) - && ! empty($data->date) - && $save - ) { - if (! isset($_SESSION) && ! defined('TESTSUITE')) { - ini_set('session.use_only_cookies', 'false'); - ini_set('session.use_cookies', 'false'); - ini_set('session.use_trans_sid', 'false'); - ini_set('session.cache_limiter', 'nocache'); - session_start(); - } - $_SESSION['cache']['version_check'] = array( - 'response' => $response, - 'timestamp' => time() - ); - } - return $data; - } - - /** - * Calculates numerical equivalent of phpMyAdmin version string - * - * @param string $version version - * - * @return mixed false on failure, integer on success - */ - public static function versionToInt($version) - { - $parts = explode('-', $version); - if (count($parts) > 1) { - $suffix = $parts[1]; - } else { - $suffix = ''; - } - $parts = explode('.', $parts[0]); - - $result = 0; - - if (count($parts) >= 1 && is_numeric($parts[0])) { - $result += 1000000 * $parts[0]; - } - - if (count($parts) >= 2 && is_numeric($parts[1])) { - $result += 10000 * $parts[1]; - } - - if (count($parts) >= 3 && is_numeric($parts[2])) { - $result += 100 * $parts[2]; - } - - if (count($parts) >= 4 && is_numeric($parts[3])) { - $result += 1 * $parts[3]; - } - - if (!empty($suffix)) { - $matches = array(); - if (preg_match('/^(\D+)(\d+)$/', $suffix, $matches)) { - $suffix = $matches[1]; - $result += intval($matches[2]); - } - switch ($suffix) { - case 'pl': - $result += 60; - break; - case 'rc': - $result += 30; - break; - case 'beta': - $result += 20; - break; - case 'alpha': - $result += 10; - break; - case 'dev': - $result += 0; - break; - } - } else { - $result += 50; // for final - } - - return $result; - } /** * Add fractional seconds to time, datetime and timestamp strings. @@ -5035,7 +4880,7 @@ class Util * @return array $tables list of tables * */ - public function getTablesWhenOpen($db, $db_info_result) + public static function getTablesWhenOpen($db, $db_info_result) { $sot_cache = $tables = array(); diff --git a/libraries/VersionInformation.php b/libraries/VersionInformation.php new file mode 100644 index 0000000000..e188ff17ee --- /dev/null +++ b/libraries/VersionInformation.php @@ -0,0 +1,272 @@ + array( + 'request_fulluri' => true, + 'timeout' => $connection_timeout, + ) + ); + $context = Util::handleContext($context); + if (! defined('TESTSUITE')) { + session_write_close(); + } + $response = file_get_contents( + $file, + false, + stream_context_create($context) + ); + } else if (function_exists('curl_init')) { + $curl_handle = curl_init($file); + if ($curl_handle === false) { + return null; + } + $curl_handle = Util::configureCurl($curl_handle); + curl_setopt( + $curl_handle, + CURLOPT_HEADER, + false + ); + curl_setopt( + $curl_handle, + CURLOPT_RETURNTRANSFER, + true + ); + curl_setopt( + $curl_handle, + CURLOPT_TIMEOUT, + $connection_timeout + ); + if (! defined('TESTSUITE')) { + session_write_close(); + } + $response = curl_exec($curl_handle); + } + } + + $data = json_decode($response); + if (is_object($data) + && ! empty($data->version) + && ! empty($data->date) + && $save + ) { + if (! isset($_SESSION) && ! defined('TESTSUITE')) { + ini_set('session.use_only_cookies', 'false'); + ini_set('session.use_cookies', 'false'); + ini_set('session.use_trans_sid', 'false'); + ini_set('session.cache_limiter', 'nocache'); + session_start(); + } + $_SESSION['cache']['version_check'] = array( + 'response' => $response, + 'timestamp' => time() + ); + } + return $data; + } + + /** + * Calculates numerical equivalent of phpMyAdmin version string + * + * @param string $version version + * + * @return mixed false on failure, integer on success + */ + public function versionToInt($version) + { + $parts = explode('-', $version); + if (count($parts) > 1) { + $suffix = $parts[1]; + } else { + $suffix = ''; + } + $parts = explode('.', $parts[0]); + + $result = 0; + + if (count($parts) >= 1 && is_numeric($parts[0])) { + $result += 1000000 * $parts[0]; + } + + if (count($parts) >= 2 && is_numeric($parts[1])) { + $result += 10000 * $parts[1]; + } + + if (count($parts) >= 3 && is_numeric($parts[2])) { + $result += 100 * $parts[2]; + } + + if (count($parts) >= 4 && is_numeric($parts[3])) { + $result += 1 * $parts[3]; + } + + if (!empty($suffix)) { + $matches = array(); + if (preg_match('/^(\D+)(\d+)$/', $suffix, $matches)) { + $suffix = $matches[1]; + $result += intval($matches[2]); + } + switch ($suffix) { + case 'pl': + $result += 60; + break; + case 'rc': + $result += 30; + break; + case 'beta': + $result += 20; + break; + case 'alpha': + $result += 10; + break; + case 'dev': + $result += 0; + break; + } + } else { + $result += 50; // for final + } + + return $result; + } + + /** + * Returns the version and date of the latest phpMyAdmin version compatible + * with the available PHP and MySQL versions + * + * @param array $releases array of information related to each version + * + * @return array containing the version and date of latest compatible version + */ + public function getLatestCompatibleVersion($releases) + { + foreach ($releases as $release) { + $phpVersions = $release->php_versions; + $phpConditions = explode(",", $phpVersions); + foreach ($phpConditions as $phpCondition) { + if (! $this->evaluateVersionCondition("PHP", $phpCondition)) { + continue 2; + } + } + + // We evalute MySQL version constraint if there are only + // one server configured. + if (count($GLOBALS['cfg']['Servers']) == 1) { + $mysqlVersions = $release->mysql_versions; + $mysqlConditions = explode(",", $mysqlVersions); + foreach ($mysqlConditions as $mysqlCondition) { + if (! $this->evaluateVersionCondition('MySQL', $mysqlCondition)) { + continue 2; + } + } + } + + return array( + 'version' => $release->version, + 'date' => $release->date, + ); + } + + // no compatible version + return null; + } + + /** + * Checks whether PHP or MySQL version meets supplied version condition + * + * @param string $type PHP or MySQL + * @param string $condition version condition + * + * @return boolean whether the condition is met + */ + public function evaluateVersionCondition($type, $condition) + { + $operator = null; + $operators = array("<=", ">=", "!=", "<>", "<", ">", "="); // preserve order + foreach ($operators as $oneOperator) { + if (strpos($condition, $oneOperator) === 0) { + $operator = $oneOperator; + $version = substr($condition, strlen($oneOperator)); + break; + } + } + + $myVersion = null; + if ($type == 'PHP') { + $myVersion = $this->getPHPVersion(); + } elseif ($type == 'MySQL') { + $myVersion = $this->getMySQLVersion(); + } + + if ($myVersion != null && $operator != null) { + return version_compare($myVersion, $version, $operator); + } + return false; + } + + /** + * Returns the PHP version + * + * @return string PHP version + */ + protected function getPHPVersion() + { + return PHP_VERSION; + } + + /** + * Returns the MySQL version + * + * @return string MySQL version + */ + protected function getMySQLVersion() + { + return Util::cacheGet('PMA_MYSQL_STR_VERSION'); + } +} +?> diff --git a/libraries/common.inc.php b/libraries/common.inc.php index 9af00a3369..8fdc3e545f 100644 --- a/libraries/common.inc.php +++ b/libraries/common.inc.php @@ -1020,7 +1020,7 @@ if (! defined('PMA_MINIMUM_COMMON')) { /** * Charset information */ - require_once './libraries/mysql_charsets.inc.php'; + include_once './libraries/mysql_charsets.inc.php'; if (!isset($mysql_charsets)) { $mysql_charsets = array(); diff --git a/libraries/controllers/DatabaseStructureController.php b/libraries/controllers/DatabaseStructureController.php index 695ca01784..ad587a7942 100644 --- a/libraries/controllers/DatabaseStructureController.php +++ b/libraries/controllers/DatabaseStructureController.php @@ -161,7 +161,7 @@ class DatabaseStructureController extends DatabaseController return; } - require_once 'libraries/replication.inc.php'; + include_once 'libraries/replication.inc.php'; PageSettings::showGroup('DbStructure'); diff --git a/libraries/dbi/DBIDummy.php b/libraries/dbi/DBIDummy.php index ff104e3826..21625c4741 100644 --- a/libraries/dbi/DBIDummy.php +++ b/libraries/dbi/DBIDummy.php @@ -629,7 +629,7 @@ $GLOBALS['dummy_queries'] = array( . "`CREATE_OPTIONS` AS `Create_options`, " . "`TABLE_COMMENT` AS `Comment` " . "FROM `information_schema`.`TABLES` t " - . "WHERE BINARY `TABLE_SCHEMA` IN ('db') " + . "WHERE `TABLE_SCHEMA` IN ('db') " . "AND t.`TABLE_NAME` = 'table' ORDER BY Name ASC", 'result' => array() ), @@ -640,6 +640,10 @@ $GLOBALS['dummy_queries'] = array( array( 'query' => "SELECT @@have_partitioning;", 'result' => array() + ), + array( + 'query' => "SELECT @@lower_case_table_names", + 'result' => array() ) ); /** diff --git a/libraries/plugins/auth/AuthenticationCookie.php b/libraries/plugins/auth/AuthenticationCookie.php index 1e93c39c56..5a3d5ffca9 100644 --- a/libraries/plugins/auth/AuthenticationCookie.php +++ b/libraries/plugins/auth/AuthenticationCookie.php @@ -38,10 +38,10 @@ if (! function_exists('openssl_encrypt') || ! function_exists('openssl_random_pseudo_bytes') || PHP_VERSION_ID < 50304 ) { - require PHPSECLIB_INC_DIR . '/Crypt/Base.php'; - require PHPSECLIB_INC_DIR . '/Crypt/Rijndael.php'; - require PHPSECLIB_INC_DIR . '/Crypt/AES.php'; - require PHPSECLIB_INC_DIR . '/Crypt/Random.php'; + include PHPSECLIB_INC_DIR . '/Crypt/Base.php'; + include PHPSECLIB_INC_DIR . '/Crypt/Rijndael.php'; + include PHPSECLIB_INC_DIR . '/Crypt/AES.php'; + include PHPSECLIB_INC_DIR . '/Crypt/Random.php'; } /** diff --git a/libraries/plugins/export/ExportSql.php b/libraries/plugins/export/ExportSql.php index fcefd977cb..86bd1a32b3 100644 --- a/libraries/plugins/export/ExportSql.php +++ b/libraries/plugins/export/ExportSql.php @@ -1742,13 +1742,12 @@ class ExportSql extends ExportPlugin } // Generating auto-increment-related query. - if ((!empty($auto_increment)) - && ($update_indexes_increments) - && ($statement->entityOptions->has('AUTO_INCREMENT') !== false) - ) { + if ((! empty($auto_increment)) && ($update_indexes_increments)) { $sql_auto_increments_query = $alter_header . $crlf . ' MODIFY ' . implode(',' . $crlf . ' MODIFY ', $auto_increment); - if (isset($GLOBALS['sql_auto_increment'])) { + if (isset($GLOBALS['sql_auto_increment']) + && ($statement->entityOptions->has('AUTO_INCREMENT') !== false) + ) { $sql_auto_increments_query .= ', AUTO_INCREMENT=' . $statement->entityOptions->has('AUTO_INCREMENT'); } @@ -2712,9 +2711,9 @@ class ExportSql extends ExportPlugin // Key's columns. if (!empty($field->key)) { foreach ($field->key->columns as $key => $column) { - if (!empty($aliases[$old_database]['tables'][$old_table]['columns'][$column])) { - $field->key->columns[$key] = $aliases[$old_database] - ['tables'][$old_table]['columns'][$column]; + if (!empty($aliases[$old_database]['tables'][$old_table]['columns'][$column['name']])) { + $field->key->columns[$key]['name'] = $aliases[$old_database] + ['tables'][$old_table]['columns'][$column['name']]; $flag = true; } } diff --git a/libraries/server_privileges.lib.php b/libraries/server_privileges.lib.php index 271bff8eb2..64cc599eca 100644 --- a/libraries/server_privileges.lib.php +++ b/libraries/server_privileges.lib.php @@ -4962,6 +4962,7 @@ function PMA_getSqlQueriesForDisplayAndAddUser($username, $hostname, $password) $slashedUsername = Util::sqlAddSlashes($username); $slashedHostname = Util::sqlAddSlashes($hostname); $slashedPassword = Util::sqlAddSlashes($password); + $serverType = Util::getServerType(); $create_user_stmt = sprintf( 'CREATE USER \'%s\'@\'%s\'', @@ -4970,12 +4971,14 @@ function PMA_getSqlQueriesForDisplayAndAddUser($username, $hostname, $password) ); if (PMA_MYSQL_INT_VERSION >= 50507 + && $serverType == 'MySQL' && isset($_REQUEST['authentication_plugin']) ) { $create_user_stmt .= ' IDENTIFIED WITH ' . $_REQUEST['authentication_plugin']; } if (PMA_MYSQL_INT_VERSION >= 50707 + && $serverType == 'MySQL' && strpos($create_user_stmt, '%') !== false ) { $create_user_stmt = str_replace( @@ -5000,7 +5003,9 @@ function PMA_getSqlQueriesForDisplayAndAddUser($username, $hostname, $password) ); $real_sql_query = $sql_query = $sql_query_stmt; - if (PMA_MYSQL_INT_VERSION < 50707) { + if (PMA_MYSQL_INT_VERSION < 50707 + || $serverType != 'MySQL' + ) { if ($_POST['pred_password'] == 'keep') { $password_set_real = sprintf( $password_set_stmt, @@ -5083,7 +5088,7 @@ function PMA_getSqlQueriesForDisplayAndAddUser($username, $hostname, $password) $sql_query = ''; } - if (Util::getServerType() == 'MySQL' + if ($serverType == 'MySQL' && PMA_MYSQL_INT_VERSION >= 50700 ) { $password_set_real = null; @@ -5114,7 +5119,6 @@ function PMA_getRoutineType($dbname, $routineName) { $routineData = $GLOBALS['dbi']->getRoutines($dbname); - $routines = array(); foreach ($routineData as $routine) { if ($routine['name'] === $routineName) { return $routine['type']; diff --git a/libraries/sql-parser/src/Components/Key.php b/libraries/sql-parser/src/Components/Key.php index 89371fa9f5..70b2b937e3 100644 --- a/libraries/sql-parser/src/Components/Key.php +++ b/libraries/sql-parser/src/Components/Key.php @@ -95,6 +95,13 @@ class Key extends Component { $ret = new Key(); + /** + * Last parsed column. + * + * @var array + */ + $lastColumn = array(); + /** * The state of the parser. * @@ -135,12 +142,31 @@ class Key extends Component $state = 1; } elseif ($state === 1) { if (($token->type === Token::TYPE_OPERATOR) && ($token->value === '(')) { - $ret->columns = ArrayObj::parse($parser, $list)->values; $state = 2; } else { $ret->name = $token->value; } } elseif ($state === 2) { + if ($token->type === Token::TYPE_OPERATOR) { + if ($token->value === '(') { + $state = 3; + } elseif (($token->value === ',') || ($token->value === ')')) { + $state = ($token->value === ',') ? 2 : 4; + if (!empty($lastColumn)) { + $ret->columns[] = $lastColumn; + $lastColumn = array(); + } + } + } else { + $lastColumn['name'] = $token->value; + } + } elseif ($state === 3) { + if (($token->type === Token::TYPE_OPERATOR) && ($token->value === ')')) { + $state = 2; + } else { + $lastColumn['length'] = $token->value; + } + } elseif ($state === 4) { $ret->options = OptionsArray::parse($parser, $list, static::$KEY_OPTIONS); ++$list->idx; break; @@ -163,8 +189,17 @@ class Key extends Component if (!empty($component->name)) { $ret .= Context::escape($component->name) . ' '; } - $ret .= '(' . implode(',', Context::escape($component->columns)) . ') ' - . $component->options; + + $columns = array(); + foreach ($component->columns as $column) { + $tmp = Context::escape($column['name']); + if (isset($column['length'])) { + $tmp .= '(' . $column['length'] . ')'; + } + $columns[] = $tmp; + } + + $ret .= '(' . implode(',', $columns) . ') ' . $component->options; return trim($ret); } } diff --git a/libraries/sql-parser/src/Utils/Table.php b/libraries/sql-parser/src/Utils/Table.php index 81699ad6d0..5f0858d4a3 100644 --- a/libraries/sql-parser/src/Utils/Table.php +++ b/libraries/sql-parser/src/Utils/Table.php @@ -45,9 +45,14 @@ class Table continue; } + $columns = array(); + foreach ($field->key->columns as $column) { + $columns[] = $column['name']; + } + $tmp = array( 'constraint' => $field->name, - 'index_list' => $field->key->columns, + 'index_list' => $columns, ); if (!empty($field->references)) { diff --git a/normalization.php b/normalization.php index 41bc011ec2..f98b8cce0a 100644 --- a/normalization.php +++ b/normalization.php @@ -105,7 +105,7 @@ if (isset($_REQUEST['step1'])) { } else if (isset($_REQUEST['step3'])) { $res = PMA_getHtmlContentsFor1NFStep3($db, $table); $response->addJSON($res); -} else if (isset ($_REQUEST['step4'])) { +} else if (isset($_REQUEST['step4'])) { $res = PMA_getHtmlContentsFor1NFStep4($db, $table); $response->addJSON($res); } else if (isset($_REQUEST['step']) && $_REQUEST['step'] == 2.1) { diff --git a/po/ca.po b/po/ca.po index f683b31d99..d6a4758301 100644 --- a/po/ca.po +++ b/po/ca.po @@ -4,16 +4,16 @@ msgstr "" "Project-Id-Version: phpMyAdmin 4.6.0-dev\n" "Report-Msgid-Bugs-To: translators@phpmyadmin.net\n" "POT-Creation-Date: 2015-09-06 07:31-0400\n" -"PO-Revision-Date: 2015-08-27 13:57+0200\n" +"PO-Revision-Date: 2015-09-24 18:03+0200\n" "Last-Translator: Xavier Navarro \n" -"Language-Team: Catalan \n" +"Language-Team: Catalan " +"\n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.4-dev\n" +"X-Generator: Weblate 2.5\n" #: changelog.php:37 license.php:30 #, php-format @@ -652,10 +652,9 @@ msgstr "" "informació disponible a %s." #: index.php:163 -#, fuzzy #| msgid "General Settings" msgid "General settings" -msgstr "Paràmetres Generals" +msgstr "Paràmetres generals" #: index.php:191 js/messages.php:525 #: libraries/display_change_password.lib.php:50 @@ -668,7 +667,6 @@ msgid "Server connection collation" msgstr "Ordenació de la connexió del servidor" #: index.php:229 -#, fuzzy #| msgid "Appearance Settings" msgid "Appearance settings" msgstr "Paràmetres d'aparença" @@ -974,14 +972,19 @@ msgid "" "collation; in this case we suggest you revert to the original collation and " "refer to the tips at " msgstr "" +"Aquesta operació intentarà convertir les seves dades al nou joc de " +"caràcters. En casos estranys, especialment on un caràcter no existeix en el " +"nou joc, aquest procés podria causar que les dades apareguin incorrectament; " +"en aquest cas us suggerim tornar al joc de caràcters original i indicar un " +"consell " #: js/messages.php:73 msgid "Garbled Data" -msgstr "" +msgstr "Dades confuses" #: js/messages.php:75 msgid "Are you sure you wish to change the collation and convert the data?" -msgstr "" +msgstr "Estàs segur de voler canviar el joc de caràcters i convertir les dades?" #: js/messages.php:77 msgid "" @@ -992,15 +995,23 @@ msgid "" "column(s) editing feature (the \"Change\" Link) on the table structure page. " "" msgstr "" +"Mitjançant aquesta operació, MySQL intenta assignar els valors de dades " +"entre jocs de caràcters. Si els conjunts de caràcters són incompatibles, hi " +"pot haver pèrdua de dades i aquesta pèrdua no es pot recuperar " +"simplement canviant altra vegada el(s) joc(s) de caràcters de la columna. " +"Per convertir les dades existents, se suggereix utilitzar la característica " +"d'edició de columnes (l'enllaç de \"Canvi\") a la pàgina de l'estructura de " +"taula." #: js/messages.php:85 msgid "" "Are you sure you wish to change all the column collations and convert the " "data?" msgstr "" +"Estàs segur de voler canviar tots els jocs de caràcters de columna i " +"convertir les dades?" #: js/messages.php:88 -#, fuzzy #| msgid "Save & Close" msgid "Save & close" msgstr "Desa i tanca" @@ -1012,10 +1023,9 @@ msgid "Reset" msgstr "Reinicia" #: js/messages.php:90 -#, fuzzy #| msgid "Reset All" msgid "Reset all" -msgstr "Reinicia Tot" +msgstr "Reinicia tot" #: js/messages.php:93 msgid "Missing value in the form!" @@ -1038,7 +1048,6 @@ msgid "Add index" msgstr "Afegir índex" #: js/messages.php:98 -#, fuzzy #| msgid "Edit Index" msgid "Edit index" msgstr "Editar índex" @@ -1089,7 +1098,6 @@ msgstr "Consulta SQL:" #. l10n: Default label for the y-Axis of Charts #: js/messages.php:118 -#, fuzzy #| msgid "Y Values" msgid "Y values" msgstr "Valors Y" @@ -1127,7 +1135,7 @@ msgstr "S'ha creat la plantilla." #: js/messages.php:130 msgid "Template was loaded." -msgstr "" +msgstr "Plantilla carregada." #: js/messages.php:131 msgid "Template was updated." @@ -1187,7 +1195,6 @@ msgid "Query cache used" msgstr "Memòria cau de consultes utilitzada" #: js/messages.php:151 -#, fuzzy #| msgid "System CPU Usage" msgid "System CPU usage" msgstr "Ús de la CPU del sistema" @@ -1225,25 +1232,21 @@ msgid "Used memory" msgstr "Memòria utilitzada" #: js/messages.php:162 -#, fuzzy #| msgid "Total Swap" msgid "Total swap" -msgstr "Intercanvi Total" +msgstr "Intercanvi total" #: js/messages.php:163 -#, fuzzy #| msgid "Cached Swap" msgid "Cached swap" msgstr "Intercanvi en cau" #: js/messages.php:164 -#, fuzzy #| msgid "Used Swap" msgid "Used swap" msgstr "Intercanvi utilitzat" #: js/messages.php:165 -#, fuzzy #| msgid "Free Swap" msgid "Free swap" msgstr "Intercanvi lliure" @@ -1662,7 +1665,6 @@ msgid "No files available on server for import!" msgstr "No hi ha arxius disponibles al servidor per importar!" #: js/messages.php:275 -#, fuzzy #| msgid "Analyse Query" msgid "Analyse query" msgstr "Analitzar consulta" @@ -1728,28 +1730,24 @@ msgid "Loading…" msgstr "Carregar…" #: js/messages.php:301 -#, fuzzy #| msgid "Request Aborted!!" msgid "Request aborted!!" -msgstr "Petició abortada!!" +msgstr "Petició avortada!!" #: js/messages.php:302 -#, fuzzy #| msgid "Processing Request" msgid "Processing request" -msgstr "Petició de procés" +msgstr "Processant petició" #: js/messages.php:303 -#, fuzzy #| msgid "Request Failed!!" msgid "Request failed!!" -msgstr "Petició Fallida!!" +msgstr "Petició fallida!!" #: js/messages.php:304 -#, fuzzy #| msgid "Error in processing request:" msgid "Error in processing request" -msgstr "Error processant a la petició:" +msgstr "Error processant a la petició" #: js/messages.php:305 #, php-format @@ -1767,16 +1765,14 @@ msgid "No databases selected." msgstr "No s'han triat bases de dades." #: js/messages.php:308 -#, fuzzy #| msgid "Dropping Column" msgid "Dropping column" -msgstr "Eliminació de columna" +msgstr "Eliminant columna" #: js/messages.php:309 -#, fuzzy #| msgid "Add primary key" msgid "Adding primary key" -msgstr "Afegir clau principal" +msgstr "Afegint clau principal" #: js/messages.php:310 #: templates/database/designer/aggregate_query_panel.phtml:59 @@ -1793,22 +1789,19 @@ msgid "Click to dismiss this notification" msgstr "Prem per rebutjar aquest avís" #: js/messages.php:314 -#, fuzzy #| msgid "Renaming Databases" msgid "Renaming databases" -msgstr "Reanomenar bases de dades" +msgstr "Reanomenant bases de dades" #: js/messages.php:315 -#, fuzzy #| msgid "Copying Database" msgid "Copying database" msgstr "Copiant base de dades" #: js/messages.php:316 -#, fuzzy #| msgid "Changing Charset" msgid "Changing charset" -msgstr "Canvi de Joc de Caràcters" +msgstr "Canviant de joc de caràcters" #: js/messages.php:320 libraries/Util.class.php:3232 msgid "Enable foreign key checks" @@ -2198,16 +2191,14 @@ msgid "Geometry" msgstr "Geometria" #: js/messages.php:440 -#, fuzzy #| msgid "Inner Ring" msgid "Inner ring" msgstr "Cercle interior" #: js/messages.php:441 -#, fuzzy #| msgid "Outer ring:" msgid "Outer ring" -msgstr "Cercle exterior:" +msgstr "Cercle exterior" #: js/messages.php:445 msgid "Do you want to copy encryption key?" @@ -2455,13 +2446,11 @@ msgid "More" msgstr "Més" #: js/messages.php:531 -#, fuzzy #| msgid "Show Panel" msgid "Show panel" msgstr "Mostra el panell" #: js/messages.php:532 -#, fuzzy #| msgid "Hide Panel" msgid "Hide panel" msgstr "Amagar el panell" @@ -2539,16 +2528,14 @@ msgid "Create view" msgstr "Crea una vista" #: js/messages.php:556 -#, fuzzy #| msgid "Send error reports" msgid "Send error report" -msgstr "Enviar informes d'error" +msgstr "Enviar informe d'error" #: js/messages.php:557 -#, fuzzy #| msgid "Submit Error Report" msgid "Submit error report" -msgstr "Introduir informe d'error" +msgstr "Presentar informe d'error" #: js/messages.php:559 msgid "" @@ -2558,16 +2545,14 @@ msgstr "" "S'ha produït un error fatal de JavaScript. Vols enviar un informe d'errors?" #: js/messages.php:561 -#, fuzzy #| msgid "Change Report Settings" msgid "Change report settings" -msgstr "Canviar les configuracions d'informes" +msgstr "Canviar les configuracions de l'informe" #: js/messages.php:562 -#, fuzzy #| msgid "Show Report Details" msgid "Show report details" -msgstr "Mostra el detall dels informes" +msgstr "Mostra el detall de l'informe" #: js/messages.php:565 msgid "" @@ -2614,7 +2599,7 @@ msgstr "Realment vols esborrar aquesta marca?" #: js/messages.php:600 msgid "Some error occurred while getting SQL debug info." -msgstr "" +msgstr "S'ha produït algun error en obtenir informació de depuració SQL." #: js/messages.php:601 #, php-format @@ -2624,7 +2609,7 @@ msgstr "%s consultes executades %s vegades en %s segons." #: js/messages.php:602 #, php-format msgid "%s argument(s) passed" -msgstr "" +msgstr "%s argument(s) correctes" #: js/messages.php:603 msgid "Show arguments" @@ -2636,7 +2621,7 @@ msgstr "Amaga els arguments" #: js/messages.php:605 libraries/Console.class.php:321 msgid "Time taken:" -msgstr "" +msgstr "Temps dedicat:" #: js/messages.php:606 msgid "" @@ -3231,7 +3216,7 @@ msgstr "Ordre d'execució" #: libraries/Console.class.php:295 msgid "Time taken" -msgstr "" +msgstr "Temps dedicat" #: libraries/Console.class.php:298 msgid "Order by:" @@ -3343,7 +3328,7 @@ msgstr "Columna:" #: libraries/DBQbe.class.php:513 msgid "Alias:" -msgstr "" +msgstr "Àlies:" #: libraries/DBQbe.class.php:566 msgid "Sort:" @@ -3533,7 +3518,6 @@ msgstr "Dins les taules:" #: libraries/DbSearch.class.php:450 libraries/display_export.lib.php:50 #: libraries/replication_gui.lib.php:380 -#, fuzzy #| msgid "Unselect All" msgid "Unselect all" msgstr "Desmarca tot" @@ -3706,7 +3690,6 @@ msgstr "Amb marca:" #: libraries/server_user_groups.lib.php:231 #: templates/database/structure/check_all_tables.phtml:3 #: templates/database/structure/check_all_tables.phtml:4 -#, fuzzy #| msgid "Check All" msgid "Check all" msgstr "Marcar-ho tot" @@ -3925,11 +3908,13 @@ msgstr "" msgid "" "Linting is disabled for this query because it exceeds the maximum length." msgstr "" +"L'anàlisi d'errors està desactivat per a aquesta consulta perquè supera la " +"longitud màxima." #: libraries/Linter.class.php:162 #, php-format msgid "%1$s (near %2$s)" -msgstr "" +msgstr "%1$s (prop de %2$s)" #: libraries/Menu.class.php:200 libraries/ServerStatusData.class.php:442 #: libraries/config/messages.inc.php:933 @@ -4791,7 +4776,7 @@ msgstr "Anàlisi estàtica:" #: libraries/Util.class.php:668 #, php-format msgid "%d errors were found during analysis." -msgstr "" +msgstr "s'han trobat %d errors durant l'anàlisi." #: libraries/Util.class.php:730 libraries/rte/rte_events.lib.php:110 #: libraries/rte/rte_events.lib.php:119 libraries/rte/rte_events.lib.php:150 @@ -4815,14 +4800,13 @@ msgstr "Salta l'explicació de l'SQL" #: libraries/Util.class.php:1189 #, php-format msgid "Analyze Explain at %s" -msgstr "" +msgstr "Analitzar Explain a %s" #: libraries/Util.class.php:1220 msgid "Without PHP Code" msgstr "Sense codi PHP" #: libraries/Util.class.php:1223 libraries/config/messages.inc.php:898 -#, fuzzy #| msgid "Create PHP Code" msgid "Create PHP code" msgstr "Crea codi PHP" @@ -4953,7 +4937,6 @@ msgid "Check privileges for database \"%s\"." msgstr "Comprova els permisos per la base de dades \"%s\"." #: libraries/build_html_for_db.lib.php:181 -#, fuzzy #| msgid "Check Privileges" msgid "Check privileges" msgstr "Comprova els permisos" @@ -5669,6 +5652,8 @@ msgid "" "Find any errors in the query before executing it. Requires CodeMirror to be " "enabled." msgstr "" +"Troba errors a la consulta abans d'executar-la. Requereix que CodeMirror " +"estigui habilitat." #: libraries/config/messages.inc.php:67 msgid "Enable linter" @@ -5750,6 +5735,8 @@ msgstr "Confirma les consultes de DROP" msgid "" "Log SQL queries and their execution time, to be displayed in the console" msgstr "" +"Registre de consultes SQL i el seu temps d'execució, que es mostrarà a la " +"consola" #: libraries/config/messages.inc.php:101 msgid "Tab that is displayed when entering a database." @@ -6030,6 +6017,8 @@ msgid "" "Add IF NOT EXISTS (less efficient as indexes will be generated during table " "creation)" msgstr "" +"Afegir IF NOT EXISTS (menys eficient perquè els índexs es generaran durant " +"la creació de la taula)" #: libraries/config/messages.inc.php:211 msgid "Use ignore inserts" @@ -6089,6 +6078,8 @@ msgstr "Límit de claus externes" #: libraries/config/messages.inc.php:241 msgid "Default value for foreign key checks checkbox for some queries." msgstr "" +"El valor per defecte per a la clau externa activa el checkbox per a algunes " +"consultes." #: libraries/config/messages.inc.php:243 msgid "Foreign key checks" @@ -6665,7 +6656,6 @@ msgid "Maximum tables" msgstr "Màxim de taules" #: libraries/config/messages.inc.php:465 -#, fuzzy #| msgid "" #| "The number of bytes a script is allowed to allocate, eg. [kbd]32M[/kbd] " #| "([kbd]0[/kbd] for no limit)." @@ -6673,8 +6663,9 @@ msgid "" "The number of bytes a script is allowed to allocate, eg. [kbd]32M[/kbd] " "([kbd]-1[/kbd] for no limit and [kbd]0[/kbd] for no change)." msgstr "" -"El nombre d'octets que una ordre està autoritzada a reservar, ex. [kbd]32M[/" -"kbd] ([kbd]0[/kbd] per no posar límit)." +"El nombre d'octets que una ordre està autoritzada a reservar, ex. " +"[kbd]32M[/kbd] ([kbd]-1[/kbd] per no posar límit i [kbd]0[/kbd] per a no " +"canviar)." #: libraries/config/messages.inc.php:468 msgid "Memory limit" @@ -6827,6 +6818,7 @@ msgstr "Mostrar funcions en arbre" #: libraries/config/messages.inc.php:532 msgid "Whether to show functions under database in the navigation tree" msgstr "" +"Si vols mostrar les funcions sota la base de dades a l'arbre de navegació" #: libraries/config/messages.inc.php:533 msgid "Show procedures in tree" @@ -6835,6 +6827,7 @@ msgstr "Mostrar procediments en arbre" #: libraries/config/messages.inc.php:535 msgid "Whether to show procedures under database in the navigation tree" msgstr "" +"Si es mostren els procediments sota la base de dades a l'arbre de navegació" #: libraries/config/messages.inc.php:536 msgid "Show events in tree" @@ -6867,10 +6860,11 @@ msgstr "Ón de mostrar els vincles de fila de taula" #: libraries/config/messages.inc.php:548 msgid "Whether to show row links even in the absence of a unique key." msgstr "" +"Si es mostren els enllaços de fila fins i tot en absència d'una clau única." #: libraries/config/messages.inc.php:550 msgid "Show row links anyway" -msgstr "" +msgstr "Mostrar els enllaços de fila sempre" #: libraries/config/messages.inc.php:552 msgid "Use natural order for sorting table and database names." @@ -7653,7 +7647,6 @@ msgstr "" "taules." #: libraries/config/messages.inc.php:853 -#, fuzzy #| msgid "Show Creation timestamp" msgid "Show creation timestamp" msgstr "Mostra el temps de creació" @@ -7666,7 +7659,6 @@ msgstr "" "actualització per a totes les taules." #: libraries/config/messages.inc.php:857 -#, fuzzy #| msgid "Show Last update timestamp" msgid "Show last update timestamp" msgstr "Mostra data i hora de la darrera actualització" @@ -7679,7 +7671,6 @@ msgstr "" "comprovació per a totes les taules." #: libraries/config/messages.inc.php:861 -#, fuzzy #| msgid "Show Last check timestamp" msgid "Show last check timestamp" msgstr "Mostra el temps de la darrera comprovació" @@ -8274,6 +8265,9 @@ msgid "" "connection that encrypts the password using RSA'; while connecting to " "the server." msgstr "" +"Aquest mètode requereix l'ús d'una \"connexió SSL\" o una \"" +"connexió sense xifrar que xifra la contrasenya utilitzant RSA\"; mentre " +"es connecta al servidor." #: libraries/display_create_database.lib.php:23 msgid "Create database" @@ -8353,10 +8347,9 @@ msgid "Custom - display all possible options" msgstr "Usuari - mostra totes les opcions possibles" #: libraries/display_export.lib.php:335 -#, fuzzy #| msgid "Databases" msgid "Databases:" -msgstr "Bases de dades" +msgstr "Bases de dades:" #: libraries/display_export.lib.php:337 #: libraries/navigation/Navigation.class.php:196 @@ -8565,7 +8558,6 @@ msgstr "" ".sql.zip" #: libraries/display_import.lib.php:224 -#, fuzzy #| msgid "File to Import:" msgid "File to import:" msgstr "Arxiu a importar:" @@ -8579,7 +8571,6 @@ msgid "File uploads are not allowed on this server." msgstr "No es permet pujar arxius en aquest servidor." #: libraries/display_import.lib.php:278 -#, fuzzy #| msgid "Partial Import:" msgid "Partial import:" msgstr "Importació parcial:" @@ -8611,7 +8602,6 @@ msgstr "" "formats), contant des de la primera:" #: libraries/display_import.lib.php:340 -#, fuzzy #| msgid "Other Options:" msgid "Other options:" msgstr "Altres opcions:" @@ -9354,7 +9344,7 @@ msgstr "Romanés" #: libraries/mysql_charsets.lib.php:239 msgid "Sinhalese" -msgstr "" +msgstr "Singalès" #: libraries/mysql_charsets.lib.php:242 msgid "Slovak" @@ -9955,7 +9945,6 @@ msgstr "" #: libraries/operations.lib.php:879 libraries/operations.lib.php:973 #: libraries/operations.lib.php:1327 libraries/rte/rte_routines.lib.php:998 #: templates/columns_definitions/table_fields_definitions.phtml:47 -#, fuzzy #| msgid "Adjust Privileges" msgid "Adjust privileges" msgstr "Ajusta els permisos" @@ -10130,7 +10119,7 @@ msgstr "Repara" #: libraries/operations.lib.php:1609 #: templates/table/structure/display_structure.phtml:186 msgid "Truncate" -msgstr "" +msgstr "Truncar" #: libraries/operations.lib.php:1619 msgid "Coalesce" @@ -10568,6 +10557,7 @@ msgstr "Afegir instrucció %s" #: libraries/plugins/export/ExportSql.class.php:279 msgid "(less efficient as indexes will be generated during table creation)" msgstr "" +"(menys eficient perquè els índexs es generaran durant la creació de la taula)" #: libraries/plugins/export/ExportSql.class.php:288 #, php-format @@ -10948,10 +10938,9 @@ msgstr "Mostra graella" #: libraries/plugins/schema/SchemaPdf.class.php:94 #: templates/database/structure/print_view_data_dictionary_link.phtml:6 -#, fuzzy #| msgid "Data Dictionary" msgid "Data dictionary" -msgstr "Diccionari de Dades" +msgstr "Diccionari de dades" #: libraries/plugins/schema/SchemaPdf.class.php:99 msgid "Order of the tables" @@ -11191,6 +11180,7 @@ msgstr "" #: libraries/plugins/transformations/input/Text_Plain_Iptobinary.class.php:32 msgid "Converts an Internet network address in (IPv4/IPv6) format to binary" msgstr "" +"Converteix una adreça de xarxa d'Internet en format (IPv4/IPv6) a binari" #: libraries/plugins/transformations/input/Text_Plain_JsonEditor.class.php:33 msgid "Syntax highlighted CodeMirror editor for JSON." @@ -11700,10 +11690,9 @@ msgid "Re-type" msgstr "Reescriu" #: libraries/replication_gui.lib.php:895 -#, fuzzy #| msgid "Generate password" msgid "Generate password:" -msgstr "Genera una contrasenya" +msgstr "Genera una contrasenya:" #: libraries/replication_gui.lib.php:933 msgid "Replication started successfully." @@ -11977,6 +11966,8 @@ msgid "" "You do not have sufficient privileges to perform this operation; Please " "refer to the documentation for more details" msgstr "" +"No tens prou permisos per realitzar aquesta operació; si us plau, consulta " +"la documentació per a mes detalls" #: libraries/rte/rte_routines.lib.php:1026 msgid "Security type" @@ -12169,10 +12160,9 @@ msgid "Ignoring unsupported language code." msgstr "Ignorant codi d'idioma no suportat." #: libraries/select_server.lib.php:43 libraries/select_server.lib.php:48 -#, fuzzy #| msgid "Current server" msgid "Current server:" -msgstr "Servidor actual" +msgstr "Servidor actual:" #: libraries/server_bin_log.lib.php:30 msgid "Select binary log to view" @@ -12231,10 +12221,9 @@ msgstr "" #: libraries/server_databases.lib.php:366 #: libraries/server_databases.lib.php:371 -#, fuzzy #| msgid "Enable Statistics" msgid "Enable statistics" -msgstr "Activa Estadístiques" +msgstr "Activa estadístiques" #: libraries/server_databases.lib.php:492 #, php-format @@ -12677,10 +12666,9 @@ msgid "table-specific" msgstr "específic de la taula" #: libraries/server_privileges.lib.php:2628 -#, fuzzy #| msgid "Edit privileges:" msgid "Edit privileges" -msgstr "Edita permisos:" +msgstr "Edita permisos" #: libraries/server_privileges.lib.php:2631 msgid "Revoke" @@ -12823,6 +12811,9 @@ msgid "" "will prevent other users from connecting if the host part of their account " "allows a connection from any (%) host." msgstr "" +"Existeix un compte d'usuari que permet a qualsevol usuari de localhost " +"connectar-se. Això evita que altres usuaris es connectin si la part del host " +"del seu compte permet una connexió des de qualsevol host (%)." #: libraries/server_privileges.lib.php:4528 #, php-format @@ -13103,7 +13094,6 @@ msgid "Clear series" msgstr "Buidar sèrie" #: libraries/server_status_monitor.lib.php:233 -#, fuzzy #| msgid "Series in Chart:" msgid "Series in chart:" msgstr "Series al gràfic:" @@ -13167,7 +13157,7 @@ msgstr "Ordre" #: libraries/server_status_processes.lib.php:96 msgid "Progress" -msgstr "" +msgstr "Progrés" #: libraries/server_status_processes.lib.php:252 #: libraries/server_status_variables.lib.php:39 @@ -13999,12 +13989,12 @@ msgstr "Valor global" #: libraries/server_variables.lib.php:243 msgid "This is a read-only variable and can not be edited" -msgstr "" +msgstr "Això és una variable de només lectura i no es pot editar" #: libraries/sql-parser/src/Component.php:63 #: libraries/sql-parser/src/Component.php:83 msgid "Not implemented yet." -msgstr "" +msgstr "Encara no implementat." #: libraries/sql-parser/src/Components/AlterOperation.php:202 msgid "Unrecognized alter operation." @@ -14013,20 +14003,20 @@ msgstr "Operació de modificació no reconeguda." #: libraries/sql-parser/src/Components/Array2d.php:93 #, php-format msgid "%1$d values were expected, but found %2$d." -msgstr "" +msgstr "S'esperaven %1$d valors, però s'han trobat %2$d." #: libraries/sql-parser/src/Components/Array2d.php:116 msgid "An opening bracket followed by a set of values was expected." -msgstr "" +msgstr "S'esperava un claudàtor d'obertura seguit per un conjunt de valors." #: libraries/sql-parser/src/Components/ArrayObj.php:103 #: libraries/sql-parser/src/Components/CreateDefinition.php:204 msgid "An opening bracket was expected." -msgstr "" +msgstr "S'esperava un claudàtor d'obertura." #: libraries/sql-parser/src/Components/ArrayObj.php:128 msgid "A comma or a closing bracket was expected" -msgstr "" +msgstr "S'esperava una coma o un claudàtor de tancament" #: libraries/sql-parser/src/Components/CreateDefinition.php:248 msgid "A comma or a closing bracket was expected." @@ -14034,25 +14024,25 @@ msgstr "S'esperava una coma o un claudàtor de tancament." #: libraries/sql-parser/src/Components/CreateDefinition.php:264 msgid "A closing bracket was expected." -msgstr "" +msgstr "S'esperava un claudàtor de tancament." #: libraries/sql-parser/src/Components/DataType.php:127 msgid "Unrecognized data type." -msgstr "" +msgstr "Tipus de dades desconegut." #: libraries/sql-parser/src/Components/Expression.php:234 msgid "Unexpected closing bracket." -msgstr "" +msgstr "Claudàtor de tancament inesperat." #: libraries/sql-parser/src/Components/Expression.php:255 #: libraries/sql-parser/src/Components/Expression.php:292 #: libraries/sql-parser/src/Components/Expression.php:312 msgid "An alias was previously found." -msgstr "" +msgstr "S'ha trobat un àlies anteriorment." #: libraries/sql-parser/src/Components/Expression.php:266 msgid "Unexpected dot." -msgstr "" +msgstr "Punt inesperat." #: libraries/sql-parser/src/Components/Expression.php:336 msgid "An alias was expected." @@ -14065,12 +14055,12 @@ msgstr "S'esperava una expressió." #: libraries/sql-parser/src/Components/Limit.php:92 #: libraries/sql-parser/src/Components/Limit.php:114 msgid "An offset was expected." -msgstr "" +msgstr "S'esperava un desplaçament." #: libraries/sql-parser/src/Components/OptionsArray.php:148 #, php-format msgid "This option conflicts with \"%1$s\"." -msgstr "" +msgstr "Aquesta opció està en conflicte amb \"%1$s\"." #: libraries/sql-parser/src/Components/RenameOperation.php:104 msgid "The old name of the table was expected." @@ -14078,7 +14068,7 @@ msgstr "S'esperava el nom antic de la taula." #: libraries/sql-parser/src/Components/RenameOperation.php:114 msgid "Keyword \"TO\" was expected." -msgstr "" +msgstr "S'esperava la paraula clau \"TO\"." #: libraries/sql-parser/src/Components/RenameOperation.php:131 msgid "The new name of the table was expected." @@ -14094,12 +14084,12 @@ msgstr "Caràcter no esperat." #: libraries/sql-parser/src/Lexer.php:307 msgid "Expected whitespace(s) before delimiter." -msgstr "" +msgstr "S'esperava(en) espai(s) en blanc abans del delimitador." #: libraries/sql-parser/src/Lexer.php:325 #: libraries/sql-parser/src/Lexer.php:341 msgid "Expected delimiter." -msgstr "" +msgstr "S'esperava delimitador ." #: libraries/sql-parser/src/Lexer.php:788 #, php-format @@ -14116,11 +14106,11 @@ msgstr "Inici no esperat de declaració." #: libraries/sql-parser/src/Parser.php:421 msgid "Unrecognized statement type." -msgstr "" +msgstr "Tipus de declaració no reconegut." #: libraries/sql-parser/src/Parser.php:505 msgid "No transaction was previously started." -msgstr "" +msgstr "No s'ha iniciat cap transacció anteriorment." #: libraries/sql-parser/src/Statement.php:212 msgid "Unexpected token." @@ -14128,16 +14118,18 @@ msgstr "Símbol (token) no esperat." #: libraries/sql-parser/src/Statement.php:250 msgid "This type of clause was previously parsed." -msgstr "" +msgstr "Aquest tipus de clàusula s'ha analitzat anteriorment." #: libraries/sql-parser/src/Statement.php:277 msgid "" "A new statement was found, but no delimiter between it and the previous one." msgstr "" +"S'ha trobat una nova declaració, però no hi ha cap delimitador entre aquesta " +"i la anterior." #: libraries/sql-parser/src/Statement.php:297 msgid "Unrecognized keyword." -msgstr "" +msgstr "Paraula clau no reconeguda." #: libraries/sql-parser/src/Statements/CreateStatement.php:348 msgid "The name of the entity was expected." @@ -14149,7 +14141,7 @@ msgstr "S'esperava al menys la definició d'una columna." #: libraries/sql-parser/src/Statements/CreateStatement.php:478 msgid "A \"RETURNS\" keyword was expected." -msgstr "" +msgstr "S'esperava una paraula clau \"RETURNS\"." #: libraries/sql.lib.php:224 msgid "Detailed profile" @@ -14609,16 +14601,14 @@ msgid "Username and hostname didn't change." msgstr "El nom d'usuari i de servidor no s'han canviat." #: server_status.php:39 -#, fuzzy #| msgid "Not enough privilege to view users." msgid "Not enough privilege to view server status." -msgstr "Permisos insuficients per veure usuaris." +msgstr "Permisos insuficients per veure l'estat del servidor." #: server_status_advisor.php:39 -#, fuzzy #| msgid "Not enough privilege to view users." msgid "Not enough privilege to view the advisor." -msgstr "Permisos insuficients per veure usuaris." +msgstr "Permisos insuficients per veure l'assessor." #: server_status_processes.php:36 #, php-format @@ -14632,22 +14622,21 @@ msgid "" msgstr "phpMyAdmin no pot cancel.lar el fil %s. Probablement, ja és tancat." #: server_status_queries.php:55 -#, fuzzy #| msgid "Not enough privilege to view users." msgid "Not enough privilege to view query statistics." -msgstr "Permisos insuficients per veure usuaris." +msgstr "Permisos insuficients per veure estadístiques de consultes." #: server_status_variables.php:57 -#, fuzzy #| msgid "Not enough privilege to view users." msgid "Not enough privilege to view status variables." -msgstr "Permisos insuficients per veure usuaris." +msgstr "Permisos insuficients per veure variables d'estat." #: server_variables.php:83 -#, fuzzy, php-format +#, php-format #| msgid "Not enough privilege to view users." msgid "Not enough privilege to view server variables and settings. %s" -msgstr "Permisos insuficients per veure usuaris." +msgstr "" +"Permisos insuficients per veure variables del servidor i configuracions. %s" #: setup/frames/config.inc.php:41 setup/frames/index.inc.php:277 msgid "Download" @@ -14953,7 +14942,7 @@ msgstr "" #: templates/columns_definitions/table_fields_definitions.phtml:70 msgid "Virtuality" -msgstr "" +msgstr "Virtualitat" #: templates/columns_definitions/table_fields_definitions.phtml:76 msgid "Move column" @@ -15021,10 +15010,9 @@ msgid "Operator" msgstr "Operador" #: templates/database/designer/database_tables.phtml:29 -#, fuzzy #| msgid "Move columns" msgid "Show/hide columns" -msgstr "Moure columnes" +msgstr "Mostrar/amagar columnes" #: templates/database/designer/database_tables.phtml:40 msgid "See table structure" @@ -16004,6 +15992,9 @@ msgid "" "Percona documentation is at http://www.percona.com/software/documentation/" msgstr "" +"La documentació de Percona és a " +"http://www.percona.com/software/documentation/" #: libraries/advisory_rules.txt:133 msgid "'percona' found in version_comment" @@ -16015,6 +16006,9 @@ msgid "" "Drizzle documentation is at http://www.drizzle.org/content/documentation/" msgstr "" +"La documentació de Drizzle és a " +"http://www.drizzle.org/content/documentation/" #: libraries/advisory_rules.txt:140 #, php-format diff --git a/po/de.po b/po/de.po index e2fbfc64b1..93905e1c95 100644 --- a/po/de.po +++ b/po/de.po @@ -4,16 +4,16 @@ msgstr "" "Project-Id-Version: phpMyAdmin-docs 4.0.0-dev\n" "Report-Msgid-Bugs-To: translators@phpmyadmin.net\n" "POT-Creation-Date: 2015-09-06 07:31-0400\n" -"PO-Revision-Date: 2015-09-01 02:22+0200\n" +"PO-Revision-Date: 2015-09-23 03:11+0200\n" "Last-Translator: Hauke Henningsen \n" -"Language-Team: German \n" +"Language-Team: German " +"\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.4-dev\n" +"X-Generator: Weblate 2.5\n" #: changelog.php:37 license.php:30 #, php-format @@ -15112,10 +15112,9 @@ msgid "Operator" msgstr "Operator" #: templates/database/designer/database_tables.phtml:29 -#, fuzzy #| msgid "Move columns" msgid "Show/hide columns" -msgstr "Spalten verschieben" +msgstr "Anzeigen/Verbergen von Spalten" #: templates/database/designer/database_tables.phtml:40 msgid "See table structure" diff --git a/po/pl.po b/po/pl.po index a7e6b77964..c886b04bec 100644 --- a/po/pl.po +++ b/po/pl.po @@ -4,17 +4,17 @@ msgstr "" "Project-Id-Version: phpMyAdmin 4.6.0-dev\n" "Report-Msgid-Bugs-To: translators@phpmyadmin.net\n" "POT-Creation-Date: 2015-09-06 07:31-0400\n" -"PO-Revision-Date: 2015-01-21 02:11+0200\n" -"Last-Translator: Krystian Biesaga \n" -"Language-Team: Polish \n" +"PO-Revision-Date: 2015-09-25 14:07+0200\n" +"Last-Translator: Andrzej \n" +"Language-Team: Polish " +"\n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 2.2-dev\n" +"X-Generator: Weblate 2.5\n" #: changelog.php:37 license.php:30 #, php-format @@ -346,10 +346,9 @@ msgid "" msgstr "Wersja %1$s stworzona, śledzenie dla %2$s jest aktywne." #: db_tracking.php:91 -#, fuzzy #| msgid "No databases selected." msgid "No tables selected." -msgstr "Żadna baza danych nie został wybrana." +msgstr "Nie wybrano tabeli." #: db_tracking.php:145 msgid "Database Log" @@ -1978,14 +1977,14 @@ msgid "No auto-saved query" msgstr "" #: js/messages.php:354 -#, fuzzy, php-format +#, php-format #| msgid "Variable" msgid "Variable %d:" -msgstr "Zmienna" +msgstr "Zmienna %d:" #: js/messages.php:357 libraries/normalization.lib.php:886 msgid "Pick" -msgstr "" +msgstr "Wybierz" #: js/messages.php:358 msgid "Column selector" diff --git a/po/pt_BR.po b/po/pt_BR.po index e9166235db..6d90492c74 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -4,16 +4,16 @@ msgstr "" "Project-Id-Version: phpMyAdmin 4.6.0-dev\n" "Report-Msgid-Bugs-To: translators@phpmyadmin.net\n" "POT-Creation-Date: 2015-09-06 07:31-0400\n" -"PO-Revision-Date: 2015-08-03 23:39+0200\n" -"Last-Translator: Guilherme Seibt \n" -"Language-Team: Portuguese (Brazil) \n" +"PO-Revision-Date: 2015-09-23 17:13+0200\n" +"Last-Translator: Victor Laureano \n" +"Language-Team: Portuguese (Brazil) " +"\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.4-dev\n" +"X-Generator: Weblate 2.5\n" #: changelog.php:37 license.php:30 #, php-format @@ -653,7 +653,6 @@ msgstr "" "pma. Mais informações disponíveis em %s." #: index.php:163 -#, fuzzy #| msgid "General Settings" msgid "General settings" msgstr "Configurações gerais" @@ -669,10 +668,9 @@ msgid "Server connection collation" msgstr "Collation de conexão do servidor MySQL" #: index.php:229 -#, fuzzy #| msgid "Appearance Settings" msgid "Appearance settings" -msgstr "Configurações de aparência" +msgstr "Configurações do Tema" #: index.php:259 prefs_manage.php:285 msgid "More settings" @@ -961,12 +959,13 @@ msgid "" "Do you really want to DROP the selected partition(s)? This will also DELETE " "the data related to the selected partition(s)!" msgstr "" +"Você realmente quer APAGAR a(s) partição(ões) seleciona(s)? Isso também irá " +"DELETAR os dados relacionados com a(s) partição(ões) seleciona(s)!" #: js/messages.php:65 -#, fuzzy #| msgid "Do you really want to delete the search \"%s\"?" msgid "Do you really want to TRUNCATE the selected partition(s)?" -msgstr "Você realmente deseja excluir a busca \"%s\"?" +msgstr "Você realmente deseja LIMPAR a(s) partição(ões) seleciona(s)?" #: js/messages.php:67 msgid "" diff --git a/po/sk.po b/po/sk.po index 28a2917ec8..49193f600c 100644 --- a/po/sk.po +++ b/po/sk.po @@ -4,7 +4,7 @@ msgstr "" "Project-Id-Version: phpMyAdmin 4.6.0-dev\n" "Report-Msgid-Bugs-To: translators@phpmyadmin.net\n" "POT-Creation-Date: 2015-09-06 07:31-0400\n" -"PO-Revision-Date: 2015-09-15 10:38+0200\n" +"PO-Revision-Date: 2015-09-20 20:15+0200\n" "Last-Translator: Martin Lacina \n" "Language-Team: Slovak " "\n" @@ -13,7 +13,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 2.4-dev\n" +"X-Generator: Weblate 2.4\n" #: changelog.php:37 license.php:30 #, php-format @@ -12171,7 +12171,7 @@ msgstr "" #: libraries/server_privileges.lib.php:818 msgid "Requires a valid X509 certificate." -msgstr "" +msgstr "Vyžaduje platný X509 certifikát." #: libraries/server_privileges.lib.php:869 msgid "Resource limits" diff --git a/po/zh_CN.po b/po/zh_CN.po index 86bdeb844f..90f75943f1 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -4,16 +4,16 @@ msgstr "" "Project-Id-Version: phpMyAdmin 4.6.0-dev\n" "Report-Msgid-Bugs-To: translators@phpmyadmin.net\n" "POT-Creation-Date: 2015-09-06 07:31-0400\n" -"PO-Revision-Date: 2015-09-03 04:02+0200\n" -"Last-Translator: Vincent Lau <3092849@qq.com>\n" -"Language-Team: Chinese (China) \n" +"PO-Revision-Date: 2015-09-24 16:29+0200\n" +"Last-Translator: Zheng Dan \n" +"Language-Team: Chinese (China) " +"\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 2.4-dev\n" +"X-Generator: Weblate 2.5\n" #: changelog.php:37 license.php:30 #, php-format @@ -2453,32 +2453,31 @@ msgstr "忽略全部" #: js/messages.php:590 msgid "" "As per your settings, they are being submitted currently, please be patient." -msgstr "" +msgstr "正在提交您的设置,请耐心等待。" #: js/messages.php:598 msgid "Execute this query again?" msgstr "再次执行该查询?" #: js/messages.php:599 -#, fuzzy #| msgid "Do you really want to delete the search \"%s\"?" msgid "Do you really want to delete this bookmark?" -msgstr "您真的要删除搜索“%s”吗?" +msgstr "您真的要删除该书签吗?" #: js/messages.php:600 msgid "Some error occurred while getting SQL debug info." -msgstr "" +msgstr "获取SQL调试信息时出错。" #: js/messages.php:601 -#, fuzzy, php-format +#, php-format #| msgid "Executed queries" msgid "%s queries executed %s times in %s seconds." -msgstr "已执行的查询" +msgstr "%s条查询的执行时常:%s秒" #: js/messages.php:602 #, php-format msgid "%s argument(s) passed" -msgstr "" +msgstr "%s 个参数已传递" #: js/messages.php:603 #, fuzzy diff --git a/server_privileges.php b/server_privileges.php index ac887cab17..a98584fb66 100644 --- a/server_privileges.php +++ b/server_privileges.php @@ -414,10 +414,10 @@ if (isset($_REQUEST['adduser'])) { ); } else if (!empty($routinename)) { $response->addHTML( - PMA_getHtmlForRoutineSpecificPrivilges( - $username, $hostname, $dbname, $routinename, - (isset($url_dbname) ? $url_dbname : '') - ) + PMA_getHtmlForRoutineSpecificPrivilges( + $username, $hostname, $dbname, $routinename, + (isset($url_dbname) ? $url_dbname : '') + ) ); } else { // A user was selected -> display the user's properties diff --git a/setup/frames/index.inc.php b/setup/frames/index.inc.php index 275db6a5c5..7cc559e3b7 100644 --- a/setup/frames/index.inc.php +++ b/setup/frames/index.inc.php @@ -18,6 +18,7 @@ if (!defined('PHPMYADMIN')) { * Core libraries. */ require_once './libraries/display_select_lang.lib.php'; +require_once './libraries/VersionInformation.php'; require_once './setup/lib/index.lib.php'; require_once './libraries/config/FormDisplay.tpl.php'; diff --git a/setup/lib/index.lib.php b/setup/lib/index.lib.php index 995009f1d6..ac07d27db9 100644 --- a/setup/lib/index.lib.php +++ b/setup/lib/index.lib.php @@ -108,7 +108,8 @@ function PMA_versionCheck() $message_id = uniqid('version_check'); // Fetch data - $version_data = PMA\libraries\Util::getLatestVersion(); + $versionInformation = new VersionInformation(); + $version_data = $versionInformation->getLatestVersion(); if (empty($version_data)) { PMA_messagesSet( @@ -123,10 +124,16 @@ function PMA_versionCheck() return; } - $version = $version_data->version; - $date = $version_data->date; + $releases = $version_data->releases; + $latestCompatible = $versionInformation->getLatestCompatibleVersion($releases); + if ($latestCompatible != null) { + $version = $latestCompatible['version']; + $date = $latestCompatible['date']; + } else { + return; + } - $version_upstream = PMA\libraries\Util::versionToInt($version); + $version_upstream = $versionInformation->versionToInt($version); if ($version_upstream === false) { PMA_messagesSet( 'error', @@ -137,7 +144,7 @@ function PMA_versionCheck() return; } - $version_local = PMA\libraries\Util::versionToInt( + $version_local = $versionInformation->versionToInt( $GLOBALS['PMA_Config']->get('PMA_VERSION') ); if ($version_local === false) { diff --git a/test/classes/PMA_Util_test.php b/test/classes/PMA_Util_test.php index 979618ac6f..a60d84a35e 100644 --- a/test/classes/PMA_Util_test.php +++ b/test/classes/PMA_Util_test.php @@ -66,72 +66,6 @@ class PMA_Util_Test extends PHPUnit_Framework_TestCase ); } - /** - * Test version checking - * - * @return void - * - * @group large - */ - public function testGetLatestVersion() - { - $GLOBALS['cfg']['ProxyUrl'] = PROXY_URL; - $GLOBALS['cfg']['ProxyUser'] = PROXY_USER; - $GLOBALS['cfg']['ProxyPass'] = PROXY_PASS; - $GLOBALS['cfg']['VersionCheck'] = true; - $version = PMA\libraries\Util::getLatestVersion(); - $this->assertNotEmpty($version->version); - $this->assertNotEmpty($version->date); - } - - /** - * Test version to int conversion. - * - * @param string $version Version string - * @param int $numeric Integer matching version - * - * @return void - * - * @dataProvider dataVersions - */ - public function testVersionToInt($version, $numeric) - { - $this->assertEquals( - $numeric, - PMA\libraries\Util::versionToInt($version) - ); - } - - /** - * Data provider for version parsing - * - * @return array with test data - */ - public function dataVersions() - { - return array( - array('1.0.0', 1000050), - array('2.0.0.2-dev', 2000002), - array('3.4.2.1', 3040251), - array('3.4.2-dev3', 3040203), - array('3.4.2-dev', 3040200), - array('3.4.2-pl', 3040260), - array('3.4.2-pl3', 3040263), - array('4.4.2-rc22', 4040252), - array('4.4.2-rc', 4040230), - array('4.4.22-beta22', 4042242), - array('4.4.22-beta', 4042220), - array('4.4.21-alpha22', 4042132), - array('4.4.20-alpha', 4042010), - array('4.40.20-alpha-dev', 4402010), - array('4.4a', 4000050), - array('4.4.4-test', 4040400), - array('4.1.0', 4010050), - array('4.0.1.3', 4000153), - array('4.1-dev', 4010000), - ); - } - /** * Test for isForeignKeyCheck * diff --git a/test/classes/VersionInformation_test.php b/test/classes/VersionInformation_test.php new file mode 100644 index 0000000000..33c753bae6 --- /dev/null +++ b/test/classes/VersionInformation_test.php @@ -0,0 +1,259 @@ +_releases = array(); + + $release = new stdClass(); + $release->date = "2015-09-08"; + $release->php_versions = ">=5.3,<7.1"; + $release->version = "4.4.14.1"; + $release->mysql_versions = ">=5.5"; + $this->_releases[] = $release; + + $release = new stdClass(); + $release->date = "2015-09-09"; + $release->php_versions = ">=5.3,<7.0"; + $release->version = "4.4.13.3"; + $release->mysql_versions = ">=5.5"; + $this->_releases[] = $release; + + $release = new stdClass(); + $release->date = "2015-05-13"; + $release->php_versions = ">=5.2,<5.3"; + $release->version = "4.0.10.10"; + $release->mysql_versions = ">=5.0"; + $this->_releases[] = $release; + } + + /** + * Test version checking + * + * @return void + * + * @group large + */ + public function testGetLatestVersion() + { + $GLOBALS['cfg']['ProxyUrl'] = PROXY_URL; + $GLOBALS['cfg']['ProxyUser'] = PROXY_USER; + $GLOBALS['cfg']['ProxyPass'] = PROXY_PASS; + $GLOBALS['cfg']['VersionCheck'] = true; + $versionInformation = new VersionInformation(); + $version = $versionInformation->getLatestVersion(); + $this->assertNotEmpty($version->version); + $this->assertNotEmpty($version->date); + } + + /** + * Test version to int conversion. + * + * @param string $version Version string + * @param int $numeric Integer matching version + * + * @return void + * + * @dataProvider dataVersions + */ + public function testVersionToInt($version, $numeric) + { + $versionInformation = new VersionInformation(); + $this->assertEquals( + $numeric, + $versionInformation->versionToInt($version) + ); + } + + + /** + * Data provider for version parsing + * + * @return array with test data + */ + public function dataVersions() + { + return array( + array('1.0.0', 1000050), + array('2.0.0.2-dev', 2000002), + array('3.4.2.1', 3040251), + array('3.4.2-dev3', 3040203), + array('3.4.2-dev', 3040200), + array('3.4.2-pl', 3040260), + array('3.4.2-pl3', 3040263), + array('4.4.2-rc22', 4040252), + array('4.4.2-rc', 4040230), + array('4.4.22-beta22', 4042242), + array('4.4.22-beta', 4042220), + array('4.4.21-alpha22', 4042132), + array('4.4.20-alpha', 4042010), + array('4.40.20-alpha-dev', 4402010), + array('4.4a', 4000050), + array('4.4.4-test', 4040400), + array('4.1.0', 4010050), + array('4.0.1.3', 4000153), + array('4.1-dev', 4010000), + ); + } + + /** + * Tests getLatestCompatibleVersion() when there is only one server confgiured + * + * @return void + */ + public function testGetLatestCompatibleVersionWithSingleServer() + { + $GLOBALS['cfg']['Servers'] = array( + array() + ); + + $mockVersionInfo = $this->getMockBuilder('VersionInformation') + ->setMethods(array('evaluateVersionCondition')) + ->getMock(); + + $mockVersionInfo->expects($this->at(0)) + ->method('evaluateVersionCondition') + ->with('PHP', '>=5.3') + ->will($this->returnValue(true)); + + $mockVersionInfo->expects($this->at(1)) + ->method('evaluateVersionCondition') + ->with('PHP', '<7.1') + ->will($this->returnValue(true)); + + $mockVersionInfo->expects($this->at(2)) + ->method('evaluateVersionCondition') + ->with('MySQL', '>=5.5') + ->will($this->returnValue(true)); + + $compatible = $mockVersionInfo + ->getLatestCompatibleVersion($this->_releases); + $this->assertEquals('4.4.14.1', $compatible['version']); + + } + + /** + * Tests getLatestCompatibleVersion() when there are multiple servers configured + * + * @return void + */ + public function testGetLaestCompatibleVersionWithMultipleServers() + { + $GLOBALS['cfg']['Servers'] = array( + array(), + array() + ); + + $mockVersionInfo = $this->getMockBuilder('VersionInformation') + ->setMethods(array('evaluateVersionCondition')) + ->getMock(); + + $mockVersionInfo->expects($this->at(0)) + ->method('evaluateVersionCondition') + ->with('PHP', '>=5.3') + ->will($this->returnValue(true)); + + $mockVersionInfo->expects($this->at(1)) + ->method('evaluateVersionCondition') + ->with('PHP', '<7.1') + ->will($this->returnValue(true)); + + $compatible = $mockVersionInfo + ->getLatestCompatibleVersion($this->_releases); + $this->assertEquals('4.4.14.1', $compatible['version']); + } + + /** + * Tests getLatestCompatibleVersion() with an old PHP version + * + * @return void + */ + public function testGetLaestCompatibleVersionWithOldPHPVersion() + { + $GLOBALS['cfg']['Servers'] = array( + array(), + array() + ); + + $mockVersionInfo = $this->getMockBuilder('VersionInformation') + ->setMethods(array('evaluateVersionCondition')) + ->getMock(); + + $mockVersionInfo->expects($this->at(0)) + ->method('evaluateVersionCondition') + ->with('PHP', '>=5.3') + ->will($this->returnValue(false)); + + $mockVersionInfo->expects($this->at(1)) + ->method('evaluateVersionCondition') + ->with('PHP', '>=5.3') + ->will($this->returnValue(false)); + + $mockVersionInfo->expects($this->at(2)) + ->method('evaluateVersionCondition') + ->with('PHP', '>=5.2') + ->will($this->returnValue(true)); + + $mockVersionInfo->expects($this->at(3)) + ->method('evaluateVersionCondition') + ->with('PHP', '<5.3') + ->will($this->returnValue(true)); + + $compatible = $mockVersionInfo + ->getLatestCompatibleVersion($this->_releases); + $this->assertEquals('4.0.10.10', $compatible['version']); + } + + /** + * Tests evaluateVersionCondition() method + * + * @return void + */ + public function testEvaluateVersionCondition() + { + $mockVersionInfo = $this->getMockBuilder('VersionInformation') + ->setMethods(array('getPHPVersion')) + ->getMock(); + + $mockVersionInfo->expects($this->any()) + ->method('getPHPVersion') + ->will($this->returnValue('5.2.4')); + + $this->assertTrue($mockVersionInfo->evaluateVersionCondition('PHP', '<=5.3')); + $this->assertTrue($mockVersionInfo->evaluateVersionCondition('PHP', '<5.3')); + $this->assertTrue($mockVersionInfo->evaluateVersionCondition('PHP', '>=5.2')); + $this->assertTrue($mockVersionInfo->evaluateVersionCondition('PHP', '>5.2')); + $this->assertTrue($mockVersionInfo->evaluateVersionCondition('PHP', '!=5.3')); + + $this->assertFalse($mockVersionInfo->evaluateVersionCondition('PHP', '<=5.2')); + $this->assertFalse($mockVersionInfo->evaluateVersionCondition('PHP', '<5.2')); + $this->assertFalse($mockVersionInfo->evaluateVersionCondition('PHP', '>=7.0')); + $this->assertFalse($mockVersionInfo->evaluateVersionCondition('PHP', '>7.0')); + $this->assertTrue($mockVersionInfo->evaluateVersionCondition('PHP', '!=5.2')); + } +} \ No newline at end of file diff --git a/test/libraries/PMA_relation_cleanup_test.php b/test/libraries/PMA_relation_cleanup_test.php index 090751007d..49a25b2b95 100644 --- a/test/libraries/PMA_relation_cleanup_test.php +++ b/test/libraries/PMA_relation_cleanup_test.php @@ -389,7 +389,7 @@ class DBI_PMA_Relation_Cleanup extends DatabaseInterface } if (/*overload*/mb_stripos($sql, "table_info") !== false) { - unset ($this->values[$this->indexs['table_info']]); + unset($this->values[$this->indexs['table_info']]); } if (/*overload*/mb_stripos($sql, "table_coords") !== false) { diff --git a/test/libraries/PMA_server_privileges_test.php b/test/libraries/PMA_server_privileges_test.php index 5003e0f4fe..29f2668800 100644 --- a/test/libraries/PMA_server_privileges_test.php +++ b/test/libraries/PMA_server_privileges_test.php @@ -639,7 +639,7 @@ class PMA_ServerPrivileges_Test extends PHPUnit_Framework_TestCase list($create_user_real, $create_user_show, $real_sql_query, $sql_query) = PMA_getSqlQueriesForDisplayAndAddUser( $username, $hostname, - (isset ($password) ? $password : '') + (isset($password) ? $password : '') ); $this->assertEquals( "CREATE USER 'pma_username'@'pma_hostname' " diff --git a/version_check.php b/version_check.php index 9058994ab4..f90ddec523 100644 --- a/version_check.php +++ b/version_check.php @@ -9,19 +9,30 @@ // Sets up the session define('PMA_MINIMUM_COMMON', true); require_once 'libraries/common.inc.php'; +require_once 'libraries/VersionInformation.php'; // Always send the correct headers header('Content-type: application/json; charset=UTF-8'); -$version = PMA\libraries\Util::getLatestVersion(); +$versionInformation = new VersionInformation(); +$versionDetails = $versionInformation->getLatestVersion(); -if (empty($version)) { +if (empty($versionDetails)) { echo json_encode(array()); } else { + $latestCompatible = $versionInformation->getLatestCompatibleVersion( + $versionDetails->releases + ); + $version = ''; + $date = ''; + if ($latestCompatible != null) { + $version = $latestCompatible['version']; + $date = $latestCompatible['date']; + } echo json_encode( array( - 'version' => (! empty($version->version) ? $version->version : ''), - 'date' => (! empty($version->date) ? $version->date : ''), + 'version' => (! empty($version) ? $version : ''), + 'date' => (! empty($date) ? $date : ''), ) ); }