1--TEST--
2MySQL PDO->__construct(), PDO::ATTR_PERSISTENT
3--EXTENSIONS--
4pdo_mysql
5--SKIPIF--
6<?php
7require_once __DIR__ . '/inc/mysql_pdo_test.inc';
8MySQLPDOTest::skip();
9?>
10--FILE--
11<?php
12    require_once __DIR__ . '/inc/mysql_pdo_test.inc';
13
14    try {
15        $dsn = MySQLPDOTest::getDSN();
16        $user = PDO_MYSQL_TEST_USER;
17        $pass = PDO_MYSQL_TEST_PASS;
18
19        $db1 = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));
20        $db2 = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));
21        $db1->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
22        $db2->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
23        $db1->exec('SET @pdo_persistent_connection=1');
24        $stmt = $db2->query('SELECT @pdo_persistent_connection AS _pers');
25        $tmp = $stmt->fetch(PDO::FETCH_ASSOC);
26        if ($tmp['_pers'] != 1)
27            printf("[001] Both handles should use the same connection.");
28
29        $stmt = $db1->query('SELECT CONNECTION_ID() AS _con1');
30        $tmp = $stmt->fetch(PDO::FETCH_ASSOC);
31        $con1 = $tmp['_con1'];
32
33        $stmt = $db2->query('SELECT CONNECTION_ID() AS _con2');
34        $tmp = $stmt->fetch(PDO::FETCH_ASSOC);
35        $con2 = $tmp['_con2'];
36
37        if ($con1 !== $con2)
38            printf("[002] Both handles should report the same MySQL thread ID");
39
40        $db1 = NULL; /* should be equal to closing to my understanding */
41        $db1 = new PDO($dsn, $user, $pass, [PDO::ATTR_PERSISTENT => true]);
42        $db1->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
43        $stmt = $db1->query('SELECT CONNECTION_ID() as _con1');
44        $tmp = $stmt->fetch(PDO::FETCH_ASSOC);
45        $con1 = $tmp['_con1'];
46
47        if ($con1 !== $con2)
48            printf("[003] Both handles should report the same MySQL thread ID");
49
50        $affected = $db1->exec(sprintf('KILL %d', $con1));
51        // Server needs some think-time sometimes
52        sleep(1);
53        if ('00000' == $db1->errorCode()) {
54            // looks like KILL has worked ? Or not... TODO: why no warning with libmysql?!
55            $db1->exec("SET @pdo_persistent_connection=2");
56            // but now I want to see some error...
57            if ('HY000' != $db1->errorCode())
58                printf("[004] Wrong error code %s\n", $db1->errorCode());
59
60            $tmp = implode(' ', $db1->errorInfo());
61            if (!strstr($tmp, '2006'))
62                printf("[005] Wrong error info %s\n", $tmp);
63        }
64
65        $db1 = new PDO($dsn, $user, $pass, [PDO::ATTR_PERSISTENT => false]);
66        $db1->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
67        $stmt = $db1->query('SELECT CONNECTION_ID() AS _con1');
68        $tmp = $stmt->fetch(PDO::FETCH_ASSOC);
69        $con1 = $tmp['_con1'];
70
71        $db2 = new PDO($dsn, $user, $pass, [PDO::ATTR_PERSISTENT => true]);
72        $db2->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
73        $stmt = $db2->query('SELECT CONNECTION_ID() AS _con2');
74        $tmp = $stmt->fetch(PDO::FETCH_ASSOC);
75        $con2 = $tmp['_con2'];
76
77        if ($con1 == $con2)
78            printf("[006] Looks like the persistent and the non persistent connection are using the same link?!\n");
79
80        // lets go crazy and create a few pconnections...
81        $connections = [];
82        for ($i = 0; $i <= 20; $i++) {
83            $connections[$i] = new PDO($dsn, $user, $pass, [PDO::ATTR_PERSISTENT => true]);
84        }
85        do {
86            $i = mt_rand(0, 20);
87            if (isset($connections[$i]))
88                unset($connections[$i]);
89        } while (!empty($connections));
90
91
92    } catch (PDOException $e) {
93        printf("[001] %s, [%s] %s [%s] %s\n",
94            $e->getMessage(),
95            (is_object($db1)) ? $db1->errorCode() : 'n/a',
96            (is_object($db1)) ? implode(' ', $db1->errorInfo()) : 'n/a',
97            (is_object($db2)) ? $db2->errorCode() : 'n/a',
98            (is_object($db2)) ? implode(' ', $db2->errorInfo()) : 'n/a');
99    }
100
101    print "done!";
102?>
103--EXPECT--
104done!
105