Annotation of embedaddon/php/ext/pdo_odbc/tests/long_columns.phpt, revision 1.1.1.2

1.1       misho       1: --TEST--
                      2: PDO ODBC "long" columns
                      3: --SKIPIF--
                      4: <?php # vim:ft=php
                      5: if (!extension_loaded('pdo_odbc')) print 'skip not loaded';
1.1.1.2 ! misho       6: // make sure there is an ODBC driver and a DSN, or the test will fail
        !             7: include 'ext/pdo/tests/pdo_test.inc';
        !             8: $config = PDOTest::get_config('ext/pdo_odbc/tests/common.phpt');
        !             9: if (!isset($config['ENV']['PDOTEST_DSN']) || $config['ENV']['PDOTEST_DSN']===false) print 'skip';
1.1       misho      10: ?>
                     11: --FILE--
                     12: <?php
1.1.1.2 ! misho      13: // setup: set PDOTEST_DSN environment variable
        !            14: //        for MyODBC (MySQL) and MS SQL Server, you need to also set PDOTEST_USER and PDOTEST_PASS
        !            15: //
        !            16: // can use MS SQL Server on Linux - using unixODBC
        !            17: //   -RHEL6.2
        !            18: //   -download & instructions: http://www.microsoft.com/en-us/download/details.aspx?id=28160
        !            19: //      -Linux6\sqlncli-11.0.1790.0.tar.gz (it calls RHEL6.x 'Linux6' for some reason)
        !            20: //   -follow instructions on web page and install script
        !            21: //   -may have to specify connection info in connection string without using a DSN (DSN-less connection)
        !            22: //      -for example:
        !            23: //            set PDOTEST_DSN='odbc:Driver=SQL Server Native Client 11.0;Server=10.200.51.179;Database=testdb'
        !            24: //            set PDOTEST_USER=sa
        !            25: //            set PDOTEST_PASS=Password01
        !            26: //
        !            27: // on Windows, the easy way to do this:
        !            28: // 1. install MS Access (part of MS Office) and include ODBC (Development tools feature)
        !            29: //       install the x86 build of the Drivers. You might not be able to load the x64 drivers.
        !            30: // 2. in Control Panel, search for ODBC and open "Setup data sources (ODBC)"
        !            31: // 3. click on System DSN tab
        !            32: // 4. click Add and choose "Microsoft Access Driver (*.mdb, *.accdb)" driver
        !            33: // 5. enter a DSN, ex: accdb12
        !            34: // 6. click 'Create' and select a file to save the database as
        !            35: //       -otherwise, you'll have to open MS Access, create a database, then load that file in this Window to map it to a DSN
        !            36: // 7. set the environment variable PDOTEST_DSN="odbc:<system dsn from step 5>" ex: SET PDOTEST_DSN=odbc:accdb12
        !            37: //         -note: on Windows, " is included in environment variable
        !            38: // 
        !            39: // easy way to compile:
        !            40: // configure --disable-all --enable-cli --enable-zts --enable-pdo --with-pdo-odbc --enable-debug
        !            41: // configure --disable-all --eanble-cli --enable-pdo --with-pdo-odbc=unixODBC,/usr,/usr --with-unixODBC=/usr --enable-debug
        !            42: //
        !            43: 
1.1       misho      44: require 'ext/pdo/tests/pdo_test.inc';
                     45: $db = PDOTest::test_factory('ext/pdo_odbc/tests/common.phpt');
                     46: $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
                     47: 
                     48: if (false === $db->exec('CREATE TABLE TEST (id INT NOT NULL PRIMARY KEY, data CLOB)')) {
                     49:        if (false === $db->exec('CREATE TABLE TEST (id INT NOT NULL PRIMARY KEY, data longtext)')) {
                     50:                if (false === $db->exec('CREATE TABLE TEST (id INT NOT NULL PRIMARY KEY, data varchar(4000))')) {
                     51:                        die("BORK: don't know how to create a long column here:\n" . implode(", ", $db->errorInfo()));
                     52:                }
                     53:        }
                     54: }
                     55: 
                     56: $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                     57: 
1.1.1.2 ! misho      58: // the driver reads columns in blocks of 255 bytes and then reassembles those blocks into a single buffer.
        !            59: // test sizes around 255 to make sure that the reassembly works (and that the column is split into 255 byte blocks by the database)
        !            60: // also, test sizes below 255 to make sure that they work - and are not treated as a long column (should be read in a single read)
        !            61: $sizes = array(32, 53, 64, 79, 128, 253, 254, 255, 256, 257, 258, 1022, 1023, 1024, 1025, 1026, 510, 511, 512, 513, 514, 1278, 1279, 1280, 1281, 1282, 2046, 2047, 2048, 2049, 2050, 1534, 1535, 1536, 1537, 1538, 3070, 3071, 3072, 3073, 3074, 3998, 3999, 4000);
        !            62: 
        !            63: function alpha_repeat($len) {
        !            64:        // use the alphabet instead of 'i' characters to make sure the blocks don't overlap when they are reassembled
        !            65:        $out = "";
        !            66:        while (strlen($out) < $len) {
        !            67:                $out .= "abcdefghijklmnopqrstuvwxyz";
        !            68:        }
        !            69:        return substr($out, 0, $len);
        !            70: }
1.1       misho      71: 
1.1.1.2 ! misho      72: // don't use Prepared Statements. that fails on MS SQL server (works with Access, MyODBC), which is a separate failure, feature/code-path from what
        !            73: // this test does - nice to be able to test using MS SQL server
1.1       misho      74: foreach ($sizes as $num) {
1.1.1.2 ! misho      75:        $text = alpha_repeat($num);
        !            76:        $db->exec("INSERT INTO TEST VALUES($num, '$text')");
1.1       misho      77: }
                     78: 
1.1.1.2 ! misho      79: // verify data
1.1       misho      80: foreach ($db->query('SELECT id, data from TEST') as $row) {
1.1.1.2 ! misho      81:        $expect = alpha_repeat($row[0]);
1.1       misho      82:        if (strcmp($expect, $row[1])) {
                     83:                echo "Failed on size $row[id]:\n";
                     84:                printf("Expected %d bytes, got %d\n", strlen($expect), strlen($row['data']));
1.1.1.2 ! misho      85:                echo ($expect) . "\n";
        !            86:                echo ($row['data']) . "\n";
        !            87:        } else {
        !            88:                echo "Passed on size $row[id]\n";
1.1       misho      89:        }
                     90: }
                     91: 
                     92: echo "Finished\n";
                     93: 
                     94: --EXPECT--
1.1.1.2 ! misho      95: Passed on size 32
        !            96: Passed on size 53
        !            97: Passed on size 64
        !            98: Passed on size 79
        !            99: Passed on size 128
        !           100: Passed on size 253
        !           101: Passed on size 254
        !           102: Passed on size 255
        !           103: Passed on size 256
        !           104: Passed on size 257
        !           105: Passed on size 258
        !           106: Passed on size 1022
        !           107: Passed on size 1023
        !           108: Passed on size 1024
        !           109: Passed on size 1025
        !           110: Passed on size 1026
        !           111: Passed on size 510
        !           112: Passed on size 511
        !           113: Passed on size 512
        !           114: Passed on size 513
        !           115: Passed on size 514
        !           116: Passed on size 1278
        !           117: Passed on size 1279
        !           118: Passed on size 1280
        !           119: Passed on size 1281
        !           120: Passed on size 1282
        !           121: Passed on size 2046
        !           122: Passed on size 2047
        !           123: Passed on size 2048
        !           124: Passed on size 2049
        !           125: Passed on size 2050
        !           126: Passed on size 1534
        !           127: Passed on size 1535
        !           128: Passed on size 1536
        !           129: Passed on size 1537
        !           130: Passed on size 1538
        !           131: Passed on size 3070
        !           132: Passed on size 3071
        !           133: Passed on size 3072
        !           134: Passed on size 3073
        !           135: Passed on size 3074
        !           136: Passed on size 3998
        !           137: Passed on size 3999
        !           138: Passed on size 4000
1.1       misho     139: Finished
1.1.1.2 ! misho     140: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>