Annotation of embedaddon/php/ext/mysqli/tests/mysqli_poll_kill.phpt, revision 1.1.1.1
1.1 misho 1: --TEST--
2: int mysqli_poll() and kill
3: --SKIPIF--
4: <?php
5: require_once('skipif.inc');
6: require_once('skipifemb.inc');
7: require_once('connect.inc');
8: require_once('skipifconnectfailure.inc');
9:
10: if (!$IS_MYSQLND)
11: die("skip mysqlnd only feature, compile PHP using --with-mysqli=mysqlnd");
12: ?>
13: --FILE--
14: <?php
15: require_once('connect.inc');
16:
17: function get_connection() {
18: global $host, $user, $passwd, $db, $port, $socket;
19:
20: if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
21: printf("[001] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
22: return $link;
23: }
24:
25: // Killing connection - 1
26:
27: $link = get_connection();
28: if (true !== ($tmp = mysqli_query($link, "SELECT 1 AS 'processed before killed'", MYSQLI_ASYNC | MYSQLI_USE_RESULT)))
29: printf("[002] Expecting boolean/true got %s/%s\n", gettype($tmp), var_export($tmp, true));
30:
31: // Sleep 0.1s - the asynchronous query should have been processed after the wait period
32: usleep(100000);
33: $thread_id = mysqli_thread_id($link);
34: mysqli_kill(get_connection(), $thread_id);
35:
36: $links = array($link);
37: $errors = array($link);
38: $reject = array($link);
39:
40: // Yes, 1 - the asynchronous query should have been processed
41: if (1 !== ($tmp = (mysqli_poll($links, $errors, $reject, 0, 10000))))
42: printf("[003] Expecting int/1 got %s/%s\n", gettype($tmp), var_export($tmp, true));
43:
44: if (!is_array($links) || empty($links))
45: printf("[004] Expecting non-empty array got %s/%s\n", gettype($links), var_export($links, true));
46: else
47: foreach ($links as $link) {
48: if (is_object($res = mysqli_reap_async_query($link))) {
49: // Yes, you can fetch a result - the query has been processed
50: var_dump(mysqli_fetch_assoc($res));
51: mysqli_free_result($res);
52: } else if ($link->errno > 0) {
53: printf("[005] Error: %d\n", $link->errno);
54: }
55: }
56:
57: // No error!
58: if (!is_array($errors) || !empty($errors))
59: printf("[006] Expecting non-empty array got %s/%s\n", gettype($errors), var_export($errors, true));
60:
61: if (!is_array($reject) || !empty($reject))
62: printf("[007] Expecting empty array got %s/%s\n", gettype($reject), var_export($reject, true));
63:
64: // Lets pass a dead connection
65: $links = array($link);
66: $errors = array($link);
67: $reject = array($link);
68: if (0 !== ($tmp = mysqli_poll($links, $errors, $reject, 1)))
69: printf("[008] There should be no connection ready! Returned %s/%s, expecting int/0.\n",
70: gettype($tmp), var_export($tmp, true));
71:
72: if (!empty($errors))
73: printf("[009] There should be no errors but one rejected connection\n");
74:
75: foreach ($reject as $mysqli)
76: if (mysqli_thread_id($mysqli) != $thread_id) {
77: printf("[010] Rejected thread %d should have rejected thread %d\n",
78: mysqli_thread_id($mysqli), $thread_id);
79: }
80:
81: // Killing connection - 2
82:
83: $link = get_connection();
84: if (true !== ($tmp = mysqli_query($link, "SELECT 1", MYSQLI_ASYNC | MYSQLI_USE_RESULT)))
85: printf("[011] Expecting boolean/true got %s/%s\n", gettype($tmp), var_export($tmp, true));
86:
87: usleep(100000);
88: $thread_id = mysqli_thread_id($link);
89: mysqli_kill(get_connection(), $thread_id);
90:
91: // Yes, 1 - fetch OK packet of kill!
92: $processed = 0;
93: do {
94: $links = array($link, $link);
95: $errors = array($link, $link);
96: $reject = array($link, $link);
97: $ready = mysqli_poll($links, $errors, $reject, 1);
98:
99: if (!empty($errors)) {
100: foreach ($errors as $mysqli) {
101: printf("[012] Error on thread %d: %s/%s\n",
102: mysqli_thread_id($mysqli),
103: mysqli_errno($mysqli),
104: mysqli_error($mysqli));
105: }
106: break;
107: }
108:
109: if (!empty($reject)) {
110: foreach ($reject as $mysqli) {
111: printf("[013] Rejecting thread %d: %s/%s\n",
112: mysqli_thread_id($mysqli),
113: mysqli_errno($mysqli),
114: mysqli_error($mysqli));
115: }
116: $processed += count($reject);
117: }
118:
119: foreach ($links as $mysqli) {
120: if (is_object($res = mysqli_reap_async_query($mysqli))) {
121: printf("Fetching from thread %d...\n", mysqli_thread_id($mysqli));
122: var_dump(mysqli_fetch_assoc($res));
123: } else if (mysqli_errno($mysqli) > 0) {
124: printf("[014] %d/%s\n", mysqli_errno($mysqli), mysqli_error($mysqli));
125: }
126: $processed++;
127: }
128:
129: } while ($processed < 2);
130:
131:
132: // Killing connection - 3
133:
134: $link = get_connection();
135: $thread_id = mysqli_thread_id($link);
136: mysqli_kill(get_connection(), $thread_id);
137: // Sleep 0.1s to ensure the KILL gets recognized
138: usleep(100000);
139: if (false !== ($tmp = mysqli_query($link, "SELECT 1 AS 'processed before killed'", MYSQLI_ASYNC | MYSQLI_USE_RESULT)))
140: printf("[015] Expecting boolean/false got %s/%s\n", gettype($tmp), var_export($tmp, true));
141:
142: $links = array($link);
143: $errors = array($link);
144: $reject = array($link);
145:
146: if (0 !== ($tmp = (mysqli_poll($links, $errors, $reject, 0, 10000))))
147: printf("[016] Expecting int/0 got %s/%s\n", gettype($tmp), var_export($tmp, true));
148:
149: if (!is_array($links) || empty($links))
150: printf("[017] Expecting non-empty array got %s/%s\n", gettype($links), var_export($links, true));
151: else
152: foreach ($links as $link) {
153: if (is_object($res = mysqli_reap_async_query($link))) {
154: // No, you cannot fetch the result
155: var_dump(mysqli_fetch_assoc($res));
156: mysqli_free_result($res);
157: } else if ($link->errno > 0) {
158: // But you are supposed to handle the error the way its shown here!
159: printf("[018] Error: %d/%s\n", $link->errno, $link->error);
160: }
161: }
162:
163: // None of these will indicate an error, check errno on the list of returned connections!
164: if (!is_array($errors) || !empty($errors))
165: printf("[019] Expecting non-empty array got %s/%s\n", gettype($errors), var_export($errors, true));
166:
167: if (!is_array($reject) || !empty($reject))
168: printf("[020] Expecting empty array got %s/%s\n", gettype($reject), var_export($reject, true));
169:
170:
171: mysqli_close($link);
172: print "done!";
173: ?>
174: --XFAIL--
175: To be fixed later. Minor issue about fetching error message from killed line
176: --EXPECTF--
177: array(1) {
178: [%u|b%"processed before killed"]=>
179: %unicode|string%(1) "1"
180: }
181: Fetching from thread %d...
182: array(1) {
183: [1]=>
184: %unicode|string%(1) "1"
185: }
186:
187: Warning: mysqli_reap_async_query(): Premature end of data (mysqlnd_wireprotocol.c:%d) in %s on line %d
188:
189: Warning: mysqli_reap_async_query(): RSET_HEADER %s
190:
191: Warning: mysqli_reap_async_query(): Error reading result set's header in %s on line %d
192:
193: Warning: Error while sending QUERY packet. %s
194:
195: Warning: mysqli_reap_async_query(): %s
196:
197: Warning: mysqli_reap_async_query(): Error reading result set's header in %s on line %d
198: [018] Error: %d/%s
199: done!
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>