diff --git a/ext/pdo_odbc/tests/basic_connection.phpt b/ext/pdo_odbc/tests/basic_connection.phpt index f4120ae1fc1b..e8754dec03b2 100644 --- a/ext/pdo_odbc/tests/basic_connection.phpt +++ b/ext/pdo_odbc/tests/basic_connection.phpt @@ -4,20 +4,19 @@ Basic test for connection. (When not using a DSN alias) pdo_odbc --SKIPIF-- --XLEAK-- A bug in msodbcsql causes a memory leak when reconnecting after closing. See GH-12306 --FILE-- --FILE-- prepare($sql); $id1 = 1; diff --git a/ext/pdo_odbc/tests/bug67465.phpt b/ext/pdo_odbc/tests/bug67465.phpt index 5fd86283f81b..1b6381fa6976 100644 --- a/ext/pdo_odbc/tests/bug67465.phpt +++ b/ext/pdo_odbc/tests/bug67465.phpt @@ -4,13 +4,13 @@ Bug #67465 (NULL Pointer dereference in odbc_handle_preparer) pdo_odbc --SKIPIF-- --FILE-- prepare("SELECT 1", [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]); echo "done\n"; ?> diff --git a/ext/pdo_odbc/tests/bug80783.phpt b/ext/pdo_odbc/tests/bug80783.phpt index 1660815f9514..e92b38f9f190 100644 --- a/ext/pdo_odbc/tests/bug80783.phpt +++ b/ext/pdo_odbc/tests/bug80783.phpt @@ -4,19 +4,22 @@ Bug #80783 (PDO ODBC truncates BLOB records at every 256th byte) pdo_odbc --SKIPIF-- --FILE-- exec("CREATE TABLE bug80783 (name IMAGE)"); +require_once __DIR__ . '/inc/odbc_pdo_test.inc'; +$db = ODBCPDOTest::factory(); + +$table_name = 'bug80783_pdo_odbc'; + +$db->exec("CREATE TABLE {$table_name} (name IMAGE)"); $string = str_repeat("0123456789", 50); -$db->exec("INSERT INTO bug80783 VALUES('$string')"); +$db->exec("INSERT INTO {$table_name} VALUES('$string')"); -$stmt = $db->prepare("SELECT name FROM bug80783"); +$stmt = $db->prepare("SELECT name FROM {$table_name}"); $stmt->bindColumn(1, $data, PDO::PARAM_LOB); $stmt->execute(); $stmt->fetch(PDO::FETCH_BOUND); @@ -25,9 +28,9 @@ var_dump($data === bin2hex($string)); ?> --CLEAN-- exec("DROP TABLE IF EXISTS bug80783"); +require_once __DIR__ . '/inc/odbc_pdo_test.inc'; +$db = ODBCPDOTest::factory(); +$db->exec("DROP TABLE IF EXISTS bug80783_pdo_odbc"); ?> --EXPECT-- bool(true) diff --git a/ext/pdo_odbc/tests/bug80783a.phpt b/ext/pdo_odbc/tests/bug80783a.phpt index ab141588e1b4..dece29fe2400 100644 --- a/ext/pdo_odbc/tests/bug80783a.phpt +++ b/ext/pdo_odbc/tests/bug80783a.phpt @@ -4,24 +4,23 @@ Bug #80783 (PDO ODBC truncates BLOB records at every 256th byte) pdo_odbc --SKIPIF-- --FILE-- exec("CREATE TABLE bug80783a (name NVARCHAR(MAX))"); +require_once __DIR__ . '/inc/odbc_pdo_test.inc'; +$db = ODBCPDOTest::factory(); + +$table_name = 'bug80783a_pdo_odbc'; + +$db->exec("CREATE TABLE {$table_name} (name NVARCHAR(MAX))"); $string = str_repeat("0123456789", 50); -$db->exec("INSERT INTO bug80783a VALUES('$string')"); +$db->exec("INSERT INTO {$table_name} VALUES('$string')"); -$stmt = $db->prepare("SELECT name FROM bug80783a"); +$stmt = $db->prepare("SELECT name FROM {$table_name}"); $stmt->setAttribute(PDO::ODBC_ATTR_ASSUME_UTF8, true); $stmt->bindColumn(1, $data, PDO::PARAM_STR); $stmt->execute(); @@ -31,9 +30,9 @@ var_dump($data === $string); ?> --CLEAN-- exec("DROP TABLE IF EXISTS bug80783a"); +require_once __DIR__ . '/inc/odbc_pdo_test.inc'; +$db = ODBCPDOTest::factory(); +$db->exec("DROP TABLE IF EXISTS bug80783a_pdo_odbc"); ?> --EXPECT-- bool(true) diff --git a/ext/pdo_odbc/tests/get_attribute_server.phpt b/ext/pdo_odbc/tests/get_attribute_server.phpt index 2e75c3f35b5a..bb3b23a37279 100644 --- a/ext/pdo_odbc/tests/get_attribute_server.phpt +++ b/ext/pdo_odbc/tests/get_attribute_server.phpt @@ -4,13 +4,13 @@ PDO ODBC getAttribute SERVER_INFO and SERVER_VERSION pdo_odbc --SKIPIF-- --FILE-- --FILE-- setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); -$db->exec("CREATE TABLE gh9372 (col VARCHAR(10))"); -$db->exec("INSERT INTO gh9372 VALUES ('something')"); +$table_name = 'gh9372_pdo_odbc'; -$stmt = $db->prepare("SELECT * FROM gh9372 WHERE col = ?"); +$db->exec("CREATE TABLE {$table_name} (col VARCHAR(10))"); +$db->exec("INSERT INTO {$table_name} VALUES ('something')"); + +$stmt = $db->prepare("SELECT * FROM {$table_name} WHERE col = ?"); $stmt->bindValue(1, 'something else'); try { $stmt->execute(); @@ -30,7 +32,7 @@ try { } } -$stmt = $db->prepare("SELECT * FROM gh9372 WHERE col = ?"); +$stmt = $db->prepare("SELECT * FROM {$table_name} WHERE col = ?"); $stream = fopen("php://memory", "w+"); fwrite($stream, 'something else'); rewind($stream); @@ -45,8 +47,8 @@ try { ?> --CLEAN-- exec("DROP TABLE gh9372"); +require_once __DIR__ . '/inc/odbc_pdo_test.inc'; +$db = ODBCPDOTest::factory(); +$db->exec("DROP TABLE IF EXISTS gh9372_pdo_odbc"); ?> --EXPECT-- diff --git a/ext/pdo_odbc/tests/inc/config.inc b/ext/pdo_odbc/tests/inc/config.inc new file mode 100644 index 000000000000..5fe0995d3231 --- /dev/null +++ b/ext/pdo_odbc/tests/inc/config.inc @@ -0,0 +1,30 @@ + false !== getenv('PDO_ODBC_TEST_DSN') ? getenv('PDO_ODBC_TEST_DSN') : '', + 'PDO_ODBC_TEST_USER' => false !== getenv('PDO_ODBC_TEST_USER') ? getenv('PDO_ODBC_TEST_USER') : null, + 'PDO_ODBC_TEST_PASS' => false !== getenv('PDO_ODBC_TEST_PASS') ? getenv('PDO_ODBC_TEST_PASS') : null, + 'PDO_ODBC_TEST_ATTR' => false !== getenv('PDO_ODBC_TEST_ATTR') ? getenv('PDO_ODBC_TEST_ATTR') : null, +]; + +if (!$env['PDO_ODBC_TEST_DSN'] && preg_match('/^WIN/i', PHP_OS) && extension_loaded('com_dotnet')) { + // on Windows and user didn't set PDOTEST_DSN, try this as a fallback: + // check if MS Access DB is installed, and if yes, try using it. create a temporary MS access database. + + $path = realpath(__DIR__) . '\..\pdo_odbc.mdb'; + if (!file_exists($path)) { + try { + // try to create database + $adox = new COM('ADOX.Catalog'); + $adox->Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' . $path); + $adox = null; + + } catch (Exception $e) { + // do nothing + } + } + if (file_exists($path)) { + // database was created and written to file system + $env['PDO_ODBC_TEST_DSN'] = 'odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=$path;Uid=Admin'; + } +} +?> diff --git a/ext/pdo_odbc/tests/inc/odbc_pdo_test.inc b/ext/pdo_odbc/tests/inc/odbc_pdo_test.inc new file mode 100644 index 000000000000..0b10b4b3907c --- /dev/null +++ b/ext/pdo_odbc/tests/inc/odbc_pdo_test.inc @@ -0,0 +1,65 @@ + $v) { + define($k, $v); +} + +class ODBCPDOTest extends PDOTest { + + static function factory($classname = 'PDO') { + $dsn = PDO_ODBC_TEST_DSN; + $user = PDO_ODBC_TEST_USER; + $pass = PDO_ODBC_TEST_PASS; + $attr = PDO_ODBC_TEST_ATTR; + + $attr = is_string($attr) && strlen($attr) ? unserialize($attr) : null; + + $db = new $classname($dsn, $user, $pass, $attr); + if (!$db) { + die("Could not create PDO object (DSN=$dsn, user=$user)\n"); + } + + $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); + $db->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER); + $db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true); + + return $db; + } + + static function skip() { + if (substr(PHP_OS, 0, 3) == 'WIN' && + PDO_ODBC_TEST_DSN === '' && + !extension_loaded('com_dotnet') + ) { + die('skip - either PDOTEST_DSN or com_dotnet extension is needed to setup the connection'); + } + + try { + $db = self::factory(); + } catch (PDOException $e) { + die('skip could not connect'); + } + } + + static function skipWithUnixODBC() { + if (PDO_ODBC_TYPE === "unixODBC") { + die("skip Fails with unixODBC"); + } + } + + static function skipNoDirect() { + $dsn = PDO_ODBC_TEST_DSN; + if (!$dsn || strpos($dsn, '=') === false) { + die('skip this test is for direct connections only.'); + } + } + + static function skipToofewCredentials() { + if (PDO_ODBC_TEST_DSN === '' || PDO_ODBC_TEST_USER === null || PDO_ODBC_TEST_PASS === null) { + die('skip too few credentials.'); + } + } +} +?> diff --git a/ext/pdo_odbc/tests/long_columns.phpt b/ext/pdo_odbc/tests/long_columns.phpt index 63422c304088..85900ac3da90 100644 --- a/ext/pdo_odbc/tests/long_columns.phpt +++ b/ext/pdo_odbc/tests/long_columns.phpt @@ -4,10 +4,8 @@ PDO ODBC "long" columns pdo_odbc --SKIPIF-- --FILE-- setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); -if (false === $db->exec('CREATE TABLE test_long_columns (id INT NOT NULL PRIMARY KEY, data CLOB)')) { - if (false === $db->exec('CREATE TABLE test_long_columns (id INT NOT NULL PRIMARY KEY, data longtext)')) { - if (false === $db->exec('CREATE TABLE test_long_columns (id INT NOT NULL PRIMARY KEY, data varchar(4000))')) { +$table_name = 'test_long_columns_pdo_odbc'; + +if (false === $db->exec("CREATE TABLE {$table_name} (id INT NOT NULL PRIMARY KEY, data CLOB)")) { + if (false === $db->exec("CREATE TABLE {$table_name} (id INT NOT NULL PRIMARY KEY, data longtext)")) { + if (false === $db->exec("CREATE TABLE {$table_name} (id INT NOT NULL PRIMARY KEY, data varchar(4000))")) { die("BORK: don't know how to create a long column here:\n" . implode(", ", $db->errorInfo())); } } @@ -74,11 +74,11 @@ function alpha_repeat($len) { // this test does - nice to be able to test using MS SQL server foreach ($sizes as $num) { $text = alpha_repeat($num); - $db->exec("INSERT INTO test_long_columns VALUES($num, '$text')"); + $db->exec("INSERT INTO {$table_name} VALUES($num, '$text')"); } // verify data -foreach ($db->query('SELECT id, data from test_long_columns ORDER BY LEN(data) ASC') as $row) { +foreach ($db->query("SELECT id, data FROM {$table_name} ORDER BY LEN(data) ASC") as $row) { $expect = alpha_repeat($row[0]); if (strcmp($expect, $row[1])) { echo "Failed on size $row[id]:\n"; @@ -94,9 +94,9 @@ echo "Finished\n"; ?> --CLEAN-- exec("DROP TABLE IF EXISTS test_long_columns"); +require_once __DIR__ . '/inc/odbc_pdo_test.inc'; +$db = ODBCPDOTest::factory(); +$db->exec("DROP TABLE IF EXISTS test_long_columns_pdo_odbc"); ?> --EXPECT-- Passed on size 32 diff --git a/ext/pdo_odbc/tests/max_columns.phpt b/ext/pdo_odbc/tests/max_columns.phpt index cdcafafb3afb..7a15dbc4d0b7 100644 --- a/ext/pdo_odbc/tests/max_columns.phpt +++ b/ext/pdo_odbc/tests/max_columns.phpt @@ -4,18 +4,20 @@ PDO ODBC varying character with max/no length pdo_odbc --SKIPIF-- --FILE-- setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); -if (false === $db->exec('CREATE TABLE test_max_columns (id INT NOT NULL PRIMARY KEY, data varchar(max))')) { - if (false === $db->exec('CREATE TABLE test_max_columns (id INT NOT NULL PRIMARY KEY, data longtext)')) { - if (false === $db->exec('CREATE TABLE test_max_columns (id INT NOT NULL PRIMARY KEY, data CLOB)')) { +$table_name = 'test_max_columns_pdo_odbc'; + +if (false === $db->exec("CREATE TABLE {$table_name} (id INT NOT NULL PRIMARY KEY, data varchar(max))")) { + if (false === $db->exec("CREATE TABLE {$table_name} (id INT NOT NULL PRIMARY KEY, data longtext)")) { + if (false === $db->exec("CREATE TABLE {$table_name} (id INT NOT NULL PRIMARY KEY, data CLOB)")) { die("BORK: don't know how to create a long column here:\n" . implode(", ", $db->errorInfo())); } } @@ -26,14 +28,14 @@ $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sizes = array(32, 64, 128, 253, 254, 255, 256, 257, 258, 512, 1024, 2048, 3998, 3999, 4000); $db->beginTransaction(); -$insert = $db->prepare('INSERT INTO test_max_columns VALUES (?, ?)'); +$insert = $db->prepare("INSERT INTO {$table_name} VALUES (?, ?)"); foreach ($sizes as $num) { $insert->execute(array($num, str_repeat('i', $num))); } $insert = null; $db->commit(); -foreach ($db->query('SELECT id, data from test_max_columns') as $row) { +foreach ($db->query("SELECT id, data FROM {$table_name}") as $row) { $expect = str_repeat('i', $row[0]); if (strcmp($expect, $row[1])) { echo "Failed on size $row[id]:\n"; @@ -47,9 +49,9 @@ echo "Finished\n"; ?> --CLEAN-- exec("DROP TABLE IF EXISTS test_max_columns"); +require_once __DIR__ . '/inc/odbc_pdo_test.inc'; +$db = ODBCPDOTest::factory(); +$db->exec("DROP TABLE IF EXISTS test_max_columns_pdo_odbc"); ?> --EXPECT-- Finished