diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..4fa4e34 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,47 @@ +--- +name: CI + +on: + push: + branches: + - trunk + pull_request: + branches: + - trunk + +jobs: + test: + continue-on-error: true + runs-on: ubuntu-latest + strategy: + matrix: + php-version: ['5.4', '5.5', '5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4', '8.5'] + + steps: + - uses: actions/checkout@v4 + - name: Set up PHP ${{ matrix.php-version }} + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-version }} + extensions: mysql, mysqli + ini-values: include_path=.:/usr/share/php:pear/usr/share/php + tools: none + - name: Set up MySQL + run: | + sudo systemctl start mysql.service + mysql -e 'CREATE DATABASE pear_db;' -uroot -proot + - name: Get MySQL Version + run: | + mysqld --version + - name: Run tests + uses: gacts/run-and-post-run@v1 + env: + MYSQL_TEST_USER: 'root' + MYSQL_TEST_PASSWD: 'root' + MYSQL_TEST_DB: 'pear_db' + MYSQL_TEST_HOST: '127.0.0.1' + with: + run: | + pear run-tests -r tests/ + post: | + for i in `find tests/ -name '*.out'`; do echo "$i"; cat "$i"; done \ No newline at end of file diff --git a/.github/workflows/ci2.yml b/.github/workflows/ci2.yml new file mode 100644 index 0000000..c18571b --- /dev/null +++ b/.github/workflows/ci2.yml @@ -0,0 +1,48 @@ +--- +name: CI2 + +on: + push: + branches: + - trunk + pull_request: + branches: + - trunk + +jobs: + test: + continue-on-error: true + #runs-on: ubuntu-latest + runs-on: ubuntu-22.04 + strategy: + matrix: + php-version: ['5.4', '5.5', '5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4', '8.5'] + + steps: + - uses: actions/checkout@v4 + - name: Set up PHP ${{ matrix.php-version }} + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-version }} + extensions: mysql, mysqli + ini-values: include_path=.:/usr/share/php:pear/usr/share/php + tools: none + - name: Set up MySQL + run: | + sudo systemctl start mysql.service + mysql -e 'CREATE DATABASE pear_db;' -uroot -proot + - name: Get MySQL Version + run: | + mysqld --version + - name: Run tests + uses: gacts/run-and-post-run@v1 + env: + MYSQL_TEST_USER: 'root' + MYSQL_TEST_PASSWD: 'root' + MYSQL_TEST_DB: 'pear_db' + MYSQL_TEST_HOST: '127.0.0.1' + with: + run: | + pear run-tests -r tests/ + post: | + for i in `find tests/ -name '*.out'`; do echo "$i"; cat "$i"; done \ No newline at end of file diff --git a/DB.php b/DB.php index b9fced5..51cd38e 100644 --- a/DB.php +++ b/DB.php @@ -1001,9 +1001,8 @@ public function __call($method, $arguments) if ($method == 'DB_Error') { return call_user_func_array(array($this, '__construct'), $arguments); } - trigger_error( - 'Call to undefined method DB_Error::' . $method . '()', E_USER_ERROR - ); + + throw new RuntimeException('Call to undefined method DB_Error::' . $method . '()', E_USER_ERROR); } // }}} } diff --git a/tests/db_error.phpt b/tests/db_error.phpt index 54782f5..683704b 100644 --- a/tests/db_error.phpt +++ b/tests/db_error.phpt @@ -30,6 +30,7 @@ function test_error_handler($errno, $errmsg, $file, $line, $vars=null) { E_USER_WARNING => 'User Warning', E_USER_NOTICE => 'User Notice', E_STRICT => 'Strict Notice', + E_DEPRECATED => 'Deprecated', ); $prefix = $errortype[$errno]; print "\n$prefix: $errmsg in " . basename($file) . " on line XXX\n"; diff --git a/tests/driver/connect.inc b/tests/driver/connect.inc index 371ac41..6d2bc60 100644 --- a/tests/driver/connect.inc +++ b/tests/driver/connect.inc @@ -43,3 +43,7 @@ $dbh = DB::connect($dsn, $options); if (DB::isError($dbh)) { die('connect.inc: ' . $dbh->toString()); } + +if ($dbms == 'mysql' || $dbms == 'mysqli') { + $dbh->query("SET CHARACTER SET ?", array('latin1')); +} diff --git a/tests/driver/setup.inc b/tests/driver/setup.inc index 649ce88..264cd23 100644 --- a/tests/driver/setup.inc +++ b/tests/driver/setup.inc @@ -116,19 +116,37 @@ $dsns = array( ); if (getenv('MYSQL_TEST_USER')) { - $dsns['mysqli'] = array( - 'phptype' => 'mysqli', - 'username' => getenv('MYSQL_TEST_USER'), - 'password' => getenv('MYSQL_TEST_PASSWD'), - 'database' => getenv('MYSQL_TEST_DB'), + /*if(version_compare(PHP_VERSION, '7.2.0', '<')) { + $dsns['mysql'] = array( + 'phptype' => 'mysql', + 'username' => getenv('MYSQL_TEST_USER'), + 'password' => getenv('MYSQL_TEST_PASSWD'), + 'database' => getenv('MYSQL_TEST_DB'), - 'hostspec' => getenv('MYSQL_TEST_HOST') == '' - ? null : getenv('MYSQL_TEST_HOST'), + 'hostspec' => getenv('MYSQL_TEST_HOST') == '' + ? null : getenv('MYSQL_TEST_HOST'), - 'port' => getenv('MYSQL_TEST_PORT') == '' - ? null : getenv('MYSQL_TEST_PORT'), + 'port' => getenv('MYSQL_TEST_PORT') == '' + ? null : getenv('MYSQL_TEST_PORT'), - 'socket' => getenv('MYSQL_TEST_SOCKET') == '' - ? null : getenv('MYSQL_TEST_SOCKET'), - ); + 'socket' => getenv('MYSQL_TEST_SOCKET') == '' + ? null : getenv('MYSQL_TEST_SOCKET'), + ); + } else {*/ + $dsns['mysqli'] = array( + 'phptype' => 'mysqli', + 'username' => getenv('MYSQL_TEST_USER'), + 'password' => getenv('MYSQL_TEST_PASSWD'), + 'database' => getenv('MYSQL_TEST_DB'), + + 'hostspec' => getenv('MYSQL_TEST_HOST') == '' + ? null : getenv('MYSQL_TEST_HOST'), + + 'port' => getenv('MYSQL_TEST_PORT') == '' + ? null : getenv('MYSQL_TEST_PORT'), + + 'socket' => getenv('MYSQL_TEST_SOCKET') == '' + ? null : getenv('MYSQL_TEST_SOCKET'), + ); + //} } diff --git a/tests/driver/skipif.inc b/tests/driver/skipif.inc index 2763cb5..b9a76d4 100644 --- a/tests/driver/skipif.inc +++ b/tests/driver/skipif.inc @@ -23,7 +23,7 @@ /** * Establish the include_path, DSN's and connection $options */ -require_once dirname(__FILE__) . '/setup.inc'; +require_once __DIR__ . DIRECTORY_SEPARATOR . 'setup.inc'; if (empty($dsns)) { die('skip At least one element of $dsns must be defined in setup.inc'); diff --git a/tests/errors.inc b/tests/errors.inc index cd6940e..0f35866 100644 --- a/tests/errors.inc +++ b/tests/errors.inc @@ -258,7 +258,7 @@ $res = $dbh->query("INSERT INTO peartestnull VALUES ('one')"); $res = $dbh->query("UPDATE peartestnull SET a = NULL WHERE a = 'one'"); switch ($dbh->phptype) { case 'mysql': - case 'mysqli': + case 'mysqli' && PHP_VERSION_ID < 70400: check_error($res, DB_ERROR_CONSTRAINT_NOT_NULL, false); break; default: @@ -339,11 +339,14 @@ print 'DB_ERROR_INVALID_NUMBER putting chars in INT column: '; $res = $dbh->query("UPDATE phptest SET a = 'abc' WHERE a = 42"); switch ($dbh->phptype) { case 'mysql': - case 'mysqli': + case 'mysqli' && PHP_VERSION_ID < 70400: case 'sqlite': case 'sqlite3': check_error($res, DB_ERROR_INVALID_NUMBER, false); break; + case 'mysqli' && PHP_VERSION_ID >= 70400: + check_error($res, DB_ERROR); + break; default: check_error($res, DB_ERROR_INVALID_NUMBER); } @@ -443,13 +446,16 @@ switch ($dbh->phptype . ':' . $dbh->dbsyntax) { case 'msql:msql': case 'mssql:mssql': case 'mysql:mysql': - case 'mysqli:mysqli': + case 'mysqli:mysqli' && PHP_VERSION_ID < 70400: case 'odbc:access': case 'sqlite:sqlite': case 'sybase:sybase': case 'sqlite3:sqlite': check_error($res, DB_ERROR_INVALID, false); break; + case 'mysqli:mysqli' && PHP_VERSION_ID >= 70400: + check_error($res, DB_ERROR); + break; case 'fbsql:fbsql': check_error($res, DB_ERROR_TRUNCATED); break; @@ -465,13 +471,16 @@ switch ($dbh->phptype . ':' . $dbh->dbsyntax) { case 'msql:msql': case 'mssql:mssql': case 'mysql:mysql': - case 'mysqli:mysqli': + case 'mysqli:mysqli' && PHP_VERSION_ID < 70400: case 'odbc:access': case 'sqlite:sqlite': case 'sybase:sybase': case 'sqlite3:sqlite': check_error($res, DB_ERROR_INVALID, false); break; + case 'mysqli:mysqli' && PHP_VERSION_ID >= 70400: + check_error($res, DB_ERROR); + break; case 'fbsql:fbsql': check_error($res, DB_ERROR_TRUNCATED); break;