1--TEST--
2MySQL PDOStatement - inserting BLOB from stream
3--SKIPIF--
4<?php
5require_once(__DIR__ . DIRECTORY_SEPARATOR . 'skipif.inc');
6require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
7MySQLPDOTest::skip();
8
9$tmp = MySQLPDOTest::getTempDir();
10if (!$tmp)
11    die("skip Can't create temporary file");
12
13$file = $tmp . DIRECTORY_SEPARATOR . 'pdoblob.tst';
14$fp = fopen($file, 'w');
15if (!$fp)
16    die("skip Can't create temporary file");
17
18if (4 != fwrite($fp, 'test')) {
19    die("skip Can't create temporary file");
20}
21fclose($fp);
22clearstatcache();
23
24if (!file_exists($file))
25    die("skip Can't create temporary file");
26
27unlink($file);
28?>
29--FILE--
30<?php
31    require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
32
33    function blob_from_stream($offset, $db, $file, $blob) {
34
35            @unlink($file);
36            clearstatcache();
37            if (file_exists($file)) {
38                printf("[%03d + 1] Cannot remove old test file\n", $offset);
39                return false;
40            }
41
42            $fp = fopen($file, 'w');
43            if (!$fp || !fwrite($fp, $blob)) {
44                printf("[%03d + 2] Cannot create test file '%s'\n", $offset, $file);
45                return false;
46            }
47
48            fclose($fp);
49            clearstatcache();
50            if (!file_exists($file)) {
51                printf("[%03d + 3] Failed to create test file '%s'\n", $offset, $file);
52                return false;
53            }
54
55            $db->exec('DROP TABLE IF EXISTS test');
56            $sql = sprintf('CREATE TABLE test(id INT, label BLOB) ENGINE=%s', PDO_MYSQL_TEST_ENGINE);
57            $db->exec($sql);
58
59            if (!$stmt = $db->prepare('INSERT INTO test(id, label) VALUES (?, ?)')) {
60                printf("[%03d + 4] %s\n", $offset, var_export($db->errorInfo(), true));
61                return false;
62            }
63
64            $fp = fopen($file, 'r');
65            if (!$fp) {
66                printf("[%03d + 5] Cannot create test file '%s'\n", $offset, $file);
67                return false;
68            }
69
70
71            $id = 1;
72            $stmt->bindParam(1, $id);
73            if (true !== ($tmp = $stmt->bindParam(2, $fp, PDO::PARAM_LOB))) {
74                printf("[%03d + 6] Expecting true, got %s. %s\n",
75                    $offset,
76                    var_export($tmp, true),
77                    var_export($db->errorInfo(), true));
78                return false;
79            }
80
81            if (true !== $stmt->execute()) {
82                printf("[%03d + 7] Failed to INSERT data, %s\n", $offset, var_export($stmt->errorInfo(), true));
83                return false;
84            }
85
86            $stmt2 = $db->query('SELECT id, label FROM test WHERE id = 1');
87            $row = $stmt2->fetch(PDO::FETCH_ASSOC);
88            if ($row['label'] != $blob) {
89                printf("[%03d + 8] INSERT and/or SELECT has failed, dumping data.\n", $offset);
90                var_dump($row);
91                var_dump($blob);
92                return false;
93            }
94
95            // Lets test the chr(0) handling in case the streaming has failed:
96            // is the bug about chr(0) or the streaming...
97            $db->exec('DELETE FROM test');
98            $stmt = $db->prepare('INSERT INTO test(id, label) VALUES (?, ?)');
99            $stmt->bindParam(1, $id);
100            $stmt->bindParam(2, $blob);
101            if (true !== $stmt->execute())
102                printf("[%03d + 9] %s\n", $offset, var_export($stmt->errorInfo(), true));
103
104            $stmt2 = $db->query('SELECT id, label FROM test WHERE id = 1');
105            $row = $stmt2->fetch(PDO::FETCH_ASSOC);
106            if ($row['label'] != $blob) {
107                printf("[%03d + 10] INSERT and/or SELECT has failed, dumping data.\n", $offset);
108                var_dump($row);
109                var_dump($blob);
110                return false;
111            }
112
113            return true;
114    }
115
116    $db = MySQLPDOTest::factory();
117    $blob = 'I am a mighty BLOB!' . chr(0) . "I am a binary thingie!";
118    $tmp = MySQLPDOTest::getTempDir();
119    $file = $tmp . DIRECTORY_SEPARATOR . 'pdoblob.tst';
120
121    try {
122
123        printf("Emulated PS...\n");
124        $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);
125        blob_from_stream(10, $db, $file, $blob);
126
127        printf("Native PS...\n");
128        $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0);
129        blob_from_stream(30, $db, $file, $blob);
130
131    } catch (PDOException $e) {
132        printf("[001] %s [%s] %s\n",
133            $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo()));
134    }
135
136    print "done!";
137?>
138--CLEAN--
139<?php
140require __DIR__ . '/mysql_pdo_test.inc';
141$db = MySQLPDOTest::factory();
142$db->exec('DROP TABLE IF EXISTS test');
143@unlink(MySQLPDOTest::getTempDir() . DIRECTORY_SEPARATOR . 'pdoblob.tst');
144?>
145--EXPECT--
146Emulated PS...
147Native PS...
148done!
149