diff --git a/.travis.yml b/.travis.yml index fca229ca..0c89077a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,5 @@ language: php php: - - 5.4 - - 5.5 - - 5.6 - - 7.0 - 7.1 script: @@ -18,7 +14,7 @@ before_script: # Install Nette Tester & Code Checker - travis_retry composer install --no-interaction - travis_retry composer create-project nette/code-checker temp/code-checker ~2.5 --no-interaction - - if [ $TRAVIS_PHP_VERSION == "7.0" ]; then COVERAGE="-p phpdbg --coverage ./coverage.xml --coverage-src ./src"; fi + - if [ $TRAVIS_PHP_VERSION == "7.1" ]; then COVERAGE="-p phpdbg --coverage ./coverage.xml --coverage-src ./src"; fi # Create databases.ini - cp ./tests/databases.travis.ini ./tests/databases.ini diff --git a/appveyor.yml b/appveyor.yml index 436f74dd..22918598 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,5 @@ build: off cache: - - c:\php5 -> appveyor.yml - c:\php7 -> appveyor.yml - '%LOCALAPPDATA%\Composer\files -> appveyor.yml' @@ -12,34 +11,21 @@ services: - mysql init: - - SET PATH=c:\php5;%PATH% + - SET PATH=c:\php7;%PATH% - SET ANSICON=121x90 (121x90) install: - # Install PHP 5 - - IF EXIST c:\php5 (SET PHP=0) ELSE (SET PHP=1) - - IF %PHP%==1 mkdir c:\php5 - - IF %PHP%==1 cd c:\php5 - - IF %PHP%==1 appveyor DownloadFile http://windows.php.net/downloads/releases/archives/php-5.6.14-Win32-VC11-x86.zip - - IF %PHP%==1 7z x php-5.6.14-Win32-VC11-x86.zip >nul + # Install PHP 7.1 + - IF EXIST c:\php7 (SET PHP=0) ELSE (SET PHP=1) + - IF %PHP%==1 mkdir c:\php7 + - IF %PHP%==1 cd c:\php7 + - IF %PHP%==1 appveyor DownloadFile http://windows.php.net/downloads/releases/archives/php-7.1.5-Win32-VC14-x86.zip + - IF %PHP%==1 7z x php-7.1.5-Win32-VC14-x86.zip >nul - IF %PHP%==1 echo extension_dir=ext >> php.ini - IF %PHP%==1 echo extension=php_openssl.dll >> php.ini - IF %PHP%==1 appveyor DownloadFile https://files.nette.org/misc/php-sqlsrv.zip - IF %PHP%==1 7z x php-sqlsrv.zip >nul - - IF %PHP%==1 copy SQLSRV\php_sqlsrv_56_ts.dll ext\php_sqlsrv_ts.dll - - IF %PHP%==1 copy SQLSRV\php_pdo_sqlsrv_56_ts.dll ext\php_pdo_sqlsrv_ts.dll - - IF %PHP%==1 del /Q *.zip - - # Install PHP 7 - - IF EXIST c:\php7 (SET PHP=0) ELSE (SET PHP=1) - - IF %PHP%==1 mkdir c:\php7 - - IF %PHP%==1 cd c:\php7 - - IF %PHP%==1 appveyor DownloadFile http://windows.php.net/downloads/releases/archives/php-7.0.3-Win32-VC14-x86.zip - - IF %PHP%==1 7z x php-7.0.3-Win32-VC14-x86.zip >nul - - IF %PHP%==1 echo extension_dir=ext >> php.ini - - IF %PHP%==1 appveyor DownloadFile https://files.nette.org/misc/php-sqlsrv.zip - - IF %PHP%==1 7z x php-sqlsrv.zip >nul - - IF %PHP%==1 copy SQLSRV\php_sqlsrv_7_ts.dll ext\php_sqlsrv_ts.dll + - IF %PHP%==1 copy SQLSRV\php_sqlsrv_71_ts.dll ext\php_sqlsrv_71_ts.dll - IF %PHP%==1 del /Q *.zip # Install Nette Tester @@ -51,8 +37,7 @@ install: - copy tests\databases.appveyor.ini tests\databases.ini test_script: - - vendor\bin\tester tests -s -p c:\php5\php -c tests\php5-win.ini - - vendor\bin\tester tests -s -p c:\php7\php -c tests\php7-win.ini + - vendor\bin\tester tests -s -p c:\php7\php -c tests\php-win.ini on_failure: # Print *.actual content diff --git a/src/Dibi/Drivers/MySqlDriver.php b/src/Dibi/Drivers/MySqlDriver.php deleted file mode 100644 index f4d5f655..00000000 --- a/src/Dibi/Drivers/MySqlDriver.php +++ /dev/null @@ -1,495 +0,0 @@ - the MySQL server host name - * - port (int) => the port number to attempt to connect to the MySQL server - * - socket => the socket or named pipe - * - username (or user) - * - password (or pass) - * - database => the database name to select - * - flags (int) => driver specific constants (MYSQL_CLIENT_*) - * - charset => character encoding to set (default is utf8) - * - persistent (bool) => try to find a persistent link? - * - unbuffered (bool) => sends query without fetching and buffering the result rows automatically? - * - sqlmode => see http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html - * - resource (resource) => existing connection resource - * - lazy, profiler, result, substitutes, ... => see Dibi\Connection options - */ -class MySqlDriver implements Dibi\Driver, Dibi\ResultDriver -{ - use Dibi\Strict; - - const ERROR_ACCESS_DENIED = 1045; - const ERROR_DUPLICATE_ENTRY = 1062; - const ERROR_DATA_TRUNCATED = 1265; - - /** @var resource|NULL */ - private $connection; - - /** @var resource|NULL */ - private $resultSet; - - /** @var bool */ - private $autoFree = TRUE; - - /** @var bool Is buffered (seekable and countable)? */ - private $buffered; - - - /** - * @throws Dibi\NotSupportedException - */ - public function __construct() - { - if (!extension_loaded('mysql')) { - throw new Dibi\NotSupportedException("PHP extension 'mysql' is not loaded."); - } - } - - - /** - * Connects to a database. - * @return void - * @throws Dibi\Exception - */ - public function connect(array &$config) - { - if (isset($config['resource'])) { - $this->connection = $config['resource']; - - } else { - // default values - Dibi\Helpers::alias($config, 'flags', 'options'); - $config += [ - 'charset' => 'utf8', - 'timezone' => date('P'), - 'username' => ini_get('mysql.default_user'), - 'password' => ini_get('mysql.default_password'), - ]; - if (!isset($config['host'])) { - $host = ini_get('mysql.default_host'); - if ($host) { - $config['host'] = $host; - $config['port'] = ini_get('mysql.default_port'); - } else { - if (!isset($config['socket'])) { - $config['socket'] = ini_get('mysql.default_socket'); - } - $config['host'] = NULL; - } - } - - if (empty($config['socket'])) { - $host = $config['host'] . (empty($config['port']) ? '' : ':' . $config['port']); - } else { - $host = ':' . $config['socket']; - } - - if (empty($config['persistent'])) { - $this->connection = @mysql_connect($host, $config['username'], $config['password'], TRUE, $config['flags']); // intentionally @ - } else { - $this->connection = @mysql_pconnect($host, $config['username'], $config['password'], $config['flags']); // intentionally @ - } - } - - if (!is_resource($this->connection)) { - throw new Dibi\DriverException(mysql_error(), mysql_errno()); - } - - if (isset($config['charset'])) { - if (!@mysql_set_charset($config['charset'], $this->connection)) { // intentionally @ - $this->query("SET NAMES '$config[charset]'"); - } - } - - if (isset($config['database'])) { - if (!@mysql_select_db($config['database'], $this->connection)) { // intentionally @ - throw new Dibi\DriverException(mysql_error($this->connection), mysql_errno($this->connection)); - } - } - - if (isset($config['sqlmode'])) { - $this->query("SET sql_mode='$config[sqlmode]'"); - } - - if (isset($config['timezone'])) { - $this->query("SET time_zone='$config[timezone]'"); - } - - $this->buffered = empty($config['unbuffered']); - } - - - /** - * Disconnects from a database. - * @return void - */ - public function disconnect() - { - @mysql_close($this->connection); // @ - connection can be already disconnected - } - - - /** - * Executes the SQL query. - * @param string SQL statement. - * @return Dibi\ResultDriver|NULL - * @throws Dibi\DriverException - */ - public function query($sql) - { - if ($this->buffered) { - $res = @mysql_query($sql, $this->connection); // intentionally @ - } else { - $res = @mysql_unbuffered_query($sql, $this->connection); // intentionally @ - } - - if ($code = mysql_errno($this->connection)) { - throw MySqliDriver::createException(mysql_error($this->connection), $code, $sql); - - } elseif (is_resource($res)) { - return $this->createResultDriver($res); - } - } - - - /** - * Retrieves information about the most recently executed query. - * @return array - */ - public function getInfo() - { - $res = []; - preg_match_all('#(.+?): +(\d+) *#', mysql_info($this->connection), $matches, PREG_SET_ORDER); - if (preg_last_error()) { - throw new Dibi\PcreException; - } - - foreach ($matches as $m) { - $res[$m[1]] = (int) $m[2]; - } - return $res; - } - - - /** - * Gets the number of affected rows by the last INSERT, UPDATE or DELETE query. - * @return int|FALSE number of rows or FALSE on error - */ - public function getAffectedRows() - { - return mysql_affected_rows($this->connection); - } - - - /** - * Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query. - * @return int|FALSE int on success or FALSE on failure - */ - public function getInsertId($sequence) - { - return mysql_insert_id($this->connection); - } - - - /** - * Begins a transaction (if supported). - * @param string optional savepoint name - * @return void - * @throws Dibi\DriverException - */ - public function begin($savepoint = NULL) - { - $this->query($savepoint ? "SAVEPOINT $savepoint" : 'START TRANSACTION'); - } - - - /** - * Commits statements in a transaction. - * @param string optional savepoint name - * @return void - * @throws Dibi\DriverException - */ - public function commit($savepoint = NULL) - { - $this->query($savepoint ? "RELEASE SAVEPOINT $savepoint" : 'COMMIT'); - } - - - /** - * Rollback changes in a transaction. - * @param string optional savepoint name - * @return void - * @throws Dibi\DriverException - */ - public function rollback($savepoint = NULL) - { - $this->query($savepoint ? "ROLLBACK TO SAVEPOINT $savepoint" : 'ROLLBACK'); - } - - - /** - * Returns the connection resource. - * @return resource|NULL - */ - public function getResource() - { - return is_resource($this->connection) ? $this->connection : NULL; - } - - - /** - * Returns the connection reflector. - * @return Dibi\Reflector - */ - public function getReflector() - { - return new MySqlReflector($this); - } - - - /** - * Result set driver factory. - * @param resource - * @return Dibi\ResultDriver - */ - public function createResultDriver($resource) - { - $res = clone $this; - $res->resultSet = $resource; - return $res; - } - - - /********************* SQL ****************d*g**/ - - - /** - * Encodes data for use in a SQL statement. - * @param string value - * @return string encoded value - */ - public function escapeText($value) - { - if (!is_resource($this->connection)) { - throw new Dibi\Exception('Lost connection to server.'); - } - return "'" . mysql_real_escape_string($value, $this->connection) . "'"; - } - - - /** - * @param string - * @return string - */ - public function escapeBinary($value) - { - if (!is_resource($this->connection)) { - throw new Dibi\Exception('Lost connection to server.'); - } - return "_binary'" . mysql_real_escape_string($value, $this->connection) . "'"; - } - - - /** - * @param string - * @return string - */ - public function escapeIdentifier($value) - { - // @see http://dev.mysql.com/doc/refman/5.0/en/identifiers.html - return '`' . str_replace('`', '``', $value) . '`'; - } - - - /** - * @param bool - * @return string - */ - public function escapeBool($value) - { - return $value ? 1 : 0; - } - - - /** - * @param \DateTime|\DateTimeInterface|string|int - * @return string - */ - public function escapeDate($value) - { - if (!$value instanceof \DateTime && !$value instanceof \DateTimeInterface) { - $value = new Dibi\DateTime($value); - } - return $value->format("'Y-m-d'"); - } - - - /** - * @param \DateTime|\DateTimeInterface|string|int - * @return string - */ - public function escapeDateTime($value) - { - if (!$value instanceof \DateTime && !$value instanceof \DateTimeInterface) { - $value = new Dibi\DateTime($value); - } - return $value->format("'Y-m-d H:i:s.u'"); - } - - - /** - * Encodes string for use in a LIKE statement. - * @param string - * @param int - * @return string - */ - public function escapeLike($value, $pos) - { - $value = addcslashes(str_replace('\\', '\\\\', $value), "\x00\n\r\\'%_"); - return ($pos <= 0 ? "'%" : "'") . $value . ($pos >= 0 ? "%'" : "'"); - } - - - /** - * Decodes data from result set. - * @param string - * @return string - */ - public function unescapeBinary($value) - { - return $value; - } - - - /** - * Injects LIMIT/OFFSET to the SQL query. - * @param string - * @param int|NULL - * @param int|NULL - * @return void - */ - public function applyLimit(&$sql, $limit, $offset) - { - if ($limit < 0 || $offset < 0) { - throw new Dibi\NotSupportedException('Negative offset or limit.'); - - } elseif ($limit !== NULL || $offset) { - // see http://dev.mysql.com/doc/refman/5.0/en/select.html - $sql .= ' LIMIT ' . ($limit === NULL ? '18446744073709551615' : (int) $limit) - . ($offset ? ' OFFSET ' . (int) $offset : ''); - } - } - - - /********************* result set ****************d*g**/ - - - /** - * Automatically frees the resources allocated for this result set. - * @return void - */ - public function __destruct() - { - $this->autoFree && $this->getResultResource() && $this->free(); - } - - - /** - * Returns the number of rows in a result set. - * @return int - */ - public function getRowCount() - { - if (!$this->buffered) { - throw new Dibi\NotSupportedException('Row count is not available for unbuffered queries.'); - } - return mysql_num_rows($this->resultSet); - } - - - /** - * Fetches the row at current position and moves the internal cursor to the next position. - * @param bool TRUE for associative array, FALSE for numeric - * @return array array on success, nonarray if no next record - */ - public function fetch($assoc) - { - return mysql_fetch_array($this->resultSet, $assoc ? MYSQL_ASSOC : MYSQL_NUM); - } - - - /** - * Moves cursor position without fetching row. - * @param int the 0-based cursor pos to seek to - * @return bool TRUE on success, FALSE if unable to seek to specified record - * @throws Dibi\Exception - */ - public function seek($row) - { - if (!$this->buffered) { - throw new Dibi\NotSupportedException('Cannot seek an unbuffered result set.'); - } - - return mysql_data_seek($this->resultSet, $row); - } - - - /** - * Frees the resources allocated for this result set. - * @return void - */ - public function free() - { - mysql_free_result($this->resultSet); - $this->resultSet = NULL; - } - - - /** - * Returns metadata for all columns in a result set. - * @return array - */ - public function getResultColumns() - { - $count = mysql_num_fields($this->resultSet); - $columns = []; - for ($i = 0; $i < $count; $i++) { - $row = (array) mysql_fetch_field($this->resultSet, $i); - $columns[] = [ - 'name' => $row['name'], - 'table' => $row['table'], - 'fullname' => $row['table'] ? $row['table'] . '.' . $row['name'] : $row['name'], - 'nativetype' => strtoupper($row['type']), - 'type' => $row['type'] === 'time' ? Dibi\Type::TIME_INTERVAL : NULL, - 'vendor' => $row, - ]; - } - return $columns; - } - - - /** - * Returns the result set resource. - * @return resource|NULL - */ - public function getResultResource() - { - $this->autoFree = FALSE; - return is_resource($this->resultSet) ? $this->resultSet : NULL; - } - -} diff --git a/src/Dibi/Event.php b/src/Dibi/Event.php index 156b1ee9..cb748341 100644 --- a/src/Dibi/Event.php +++ b/src/Dibi/Event.php @@ -67,7 +67,7 @@ class Event $rc = new \ReflectionClass('dibi'); $dibiDir = dirname($rc->getFileName()) . DIRECTORY_SEPARATOR; - foreach (debug_backtrace(FALSE) as $row) { + foreach (debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS) as $row) { if (isset($row['file']) && is_file($row['file']) && strpos($row['file'], $dibiDir) !== 0) { $this->source = [$row['file'], (int) $row['line']]; break; diff --git a/src/loader.php b/src/loader.php index 7c9a56e0..dd97179b 100644 --- a/src/loader.php +++ b/src/loader.php @@ -35,7 +35,6 @@ spl_autoload_register(function ($class) { 'DibiMsSql2005Reflector' => 'Dibi\Drivers\SqlsrvReflector', 'DibiMsSqlDriver' => 'Dibi\Drivers\MsSqlDriver', 'DibiMsSqlReflector' => 'Dibi\Drivers\MsSqlReflector', - 'DibiMySqlDriver' => 'Dibi\Drivers\MySqlDriver', 'DibiMySqliDriver' => 'Dibi\Drivers\MySqliDriver', 'DibiMySqlReflector' => 'Dibi\Drivers\MySqlReflector', 'DibiNotImplementedException' => 'Dibi\NotImplementedException', diff --git a/tests/databases.appveyor.ini b/tests/databases.appveyor.ini index 975e5807..d9410dae 100644 --- a/tests/databases.appveyor.ini +++ b/tests/databases.appveyor.ini @@ -8,14 +8,6 @@ driver = pdo dsn = "sqlite::memory:" system = sqlite -[mysql] -driver = mysql -host = 127.0.0.1 -username = root -password = "Password12!" -charset = utf8 -system = mysql - [mysql improved] driver = mysqli host = 127.0.0.1 diff --git a/tests/databases.sample.ini b/tests/databases.sample.ini index 1c6e12ea..40670576 100644 --- a/tests/databases.sample.ini +++ b/tests/databases.sample.ini @@ -8,14 +8,6 @@ driver = pdo dsn = "sqlite::memory:" system = sqlite -[mysql] -driver = mysql -host = 127.0.0.1 -username = root -password = -charset = utf8 -system = mysql - [mysql improved] driver = mysqli host = 127.0.0.1 diff --git a/tests/databases.travis.ini b/tests/databases.travis.ini index 5ab251f9..f7f14eeb 100644 --- a/tests/databases.travis.ini +++ b/tests/databases.travis.ini @@ -8,14 +8,6 @@ driver = pdo dsn = "sqlite::memory:" system = sqlite -[mysql] -driver = mysql -host = 127.0.0.1 -username = root -password = -charset = utf8 -system = mysql - [mysql improved] driver = mysqli host = 127.0.0.1 diff --git a/tests/dibi/bootstrap.php b/tests/dibi/bootstrap.php index 7c7840d3..9f7217af 100644 --- a/tests/dibi/bootstrap.php +++ b/tests/dibi/bootstrap.php @@ -35,10 +35,6 @@ if ($config['system'] === 'odbc') { $config['dsn'] = str_replace('data/odbc.mdb', TEMP_DIR . '/odbc.mdb', $config['dsn']); } -if ($config['driver'] === 'mysql' && PHP_VERSION_ID >= 70000) { - Tester\Environment::skip('mysql driver is not supported on PHP 7'); -} - $conn = new Dibi\Connection($config); diff --git a/tests/php7-win.ini b/tests/php-win.ini similarity index 92% rename from tests/php7-win.ini rename to tests/php-win.ini index 8c60936a..e4942e32 100644 --- a/tests/php7-win.ini +++ b/tests/php-win.ini @@ -13,5 +13,5 @@ extension=php_pdo_pgsql.dll extension=php_pdo_sqlite.dll extension=php_pgsql.dll extension=php_sqlite3.dll -extension=php_sqlsrv_ts.dll +extension=php_sqlsrv_71_ts.dll extension=php_odbc.dll diff --git a/tests/php5-win.ini b/tests/php5-win.ini deleted file mode 100644 index 4dfa6b72..00000000 --- a/tests/php5-win.ini +++ /dev/null @@ -1,18 +0,0 @@ -[PHP] -extension_dir = "./ext" -;extension=php_mssql.dll -extension=php_mysql.dll -extension=php_mysqli.dll -;extension=php_oci8.dll -;extension=php_oci8_11g.dll -;extension=php_pdo_firebird.dll -;extension=php_pdo_mssql.dll -extension=php_pdo_mysql.dll -;extension=php_pdo_oci.dll -extension=php_pdo_odbc.dll -extension=php_pdo_pgsql.dll -extension=php_pdo_sqlite.dll -extension=php_pgsql.dll -extension=php_sqlite3.dll -extension=php_sqlsrv_ts.dll -extension=php_pdo_sqlsrv_ts.dll