Skip to content

Commit 781be5f

Browse files
committed
Merge branch 'PHP-5.4' into PHP-5.5
Conflicts: NEWS
2 parents 623386d + b34e8d2 commit 781be5f

File tree

2 files changed

+287
-0
lines changed

2 files changed

+287
-0
lines changed

ext/pgsql/pgsql.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4573,6 +4573,7 @@ PHP_FUNCTION(pg_send_query)
45734573
PGconn *pgsql;
45744574
PGresult *res;
45754575
int leftover = 0;
4576+
int ret;
45764577

45774578
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs",
45784579
&pgsql_link, &query, &len) == FAILURE) {
@@ -4600,6 +4601,14 @@ PHP_FUNCTION(pg_send_query)
46004601
RETURN_FALSE;
46014602
}
46024603
}
4604+
/* Wait to finish sending buffer */
4605+
while ((ret = PQflush(pgsql))) {
4606+
if (ret == -1) {
4607+
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Could not empty PostgreSQL send buffer");
4608+
break;
4609+
}
4610+
usleep(10000);
4611+
}
46034612
if (PQ_SETNONBLOCKING(pgsql, 0)) {
46044613
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Cannot set connection to blocking mode");
46054614
}
@@ -4620,6 +4629,7 @@ PHP_FUNCTION(pg_send_query_params)
46204629
PGconn *pgsql;
46214630
PGresult *res;
46224631
int leftover = 0;
4632+
int ret;
46234633

46244634
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsa/", &pgsql_link, &query, &query_len, &pv_param_arr) == FAILURE) {
46254635
return;
@@ -4686,6 +4696,14 @@ PHP_FUNCTION(pg_send_query_params)
46864696
}
46874697
}
46884698
_php_pgsql_free_params(params, num_params);
4699+
/* Wait to finish sending buffer */
4700+
while ((ret = PQflush(pgsql))) {
4701+
if (ret == -1) {
4702+
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Could not empty PostgreSQL send buffer");
4703+
break;
4704+
}
4705+
usleep(10000);
4706+
}
46894707
if (PQ_SETNONBLOCKING(pgsql, 0)) {
46904708
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Cannot set connection to blocking mode");
46914709
}
@@ -4705,6 +4723,7 @@ PHP_FUNCTION(pg_send_prepare)
47054723
PGconn *pgsql;
47064724
PGresult *res;
47074725
int leftover = 0;
4726+
int ret;
47084727

47094728
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &pgsql_link, &stmtname, &stmtname_len, &query, &query_len) == FAILURE) {
47104729
return;
@@ -4735,6 +4754,14 @@ PHP_FUNCTION(pg_send_prepare)
47354754
RETURN_FALSE;
47364755
}
47374756
}
4757+
/* Wait to finish sending buffer */
4758+
while ((ret = PQflush(pgsql))) {
4759+
if (ret == -1) {
4760+
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Could not empty postgres send buffer");
4761+
break;
4762+
}
4763+
usleep(10000);
4764+
}
47384765
if (PQ_SETNONBLOCKING(pgsql, 0)) {
47394766
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Cannot set connection to blocking mode");
47404767
}
@@ -4757,6 +4784,7 @@ PHP_FUNCTION(pg_send_execute)
47574784
PGconn *pgsql;
47584785
PGresult *res;
47594786
int leftover = 0;
4787+
int ret;
47604788

47614789
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsa", &pgsql_link, &stmtname, &stmtname_len, &pv_param_arr) == FAILURE) {
47624790
return;
@@ -4823,6 +4851,14 @@ PHP_FUNCTION(pg_send_execute)
48234851
}
48244852
}
48254853
_php_pgsql_free_params(params, num_params);
4854+
/* Wait to finish sending buffer */
4855+
while ((ret = PQflush(pgsql))) {
4856+
if (ret == -1) {
4857+
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Could not empty postgres send buffer");
4858+
break;
4859+
}
4860+
usleep(10000);
4861+
}
48264862
if (PQ_SETNONBLOCKING(pgsql, 0)) {
48274863
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Cannot set connection to blocking mode");
48284864
}
Lines changed: 251 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,251 @@
1+
--TEST--
2+
array_walk() closure tests
3+
--FILE--
4+
<?php
5+
6+
var_dump(array_walk());
7+
8+
$ar = false;
9+
var_dump(array_walk($ar, $ar));
10+
11+
$ar = NULL;
12+
var_dump(array_walk($ar, $ar));
13+
14+
$ar = ["one" => 1, "two"=>2, "three" => 3];
15+
var_dump(array_walk($ar, function(){ var_dump(func_get_args());}));
16+
17+
echo "\nclosure with array\n";
18+
$ar = ["one" => 1, "two"=>2, "three" => 3];
19+
$user_data = ["sum" => 42];
20+
$func = function($value, $key, &$udata) {
21+
var_dump($udata);
22+
$udata["sum"] += $value;
23+
};
24+
25+
var_dump(array_walk($ar, $func, $user_data));
26+
echo "End result:";
27+
var_dump($user_data["sum"]);
28+
29+
echo "\nclosure with use\n";
30+
$ar = ["one" => 1, "two"=>2, "three" => 3];
31+
$user_data = ["sum" => 42];
32+
$func = function($value, $key) use (&$user_data) {
33+
var_dump($user_data);
34+
$user_data["sum"] += $value;
35+
};
36+
37+
var_dump(array_walk($ar, $func, $user_data));
38+
echo "End result:";
39+
var_dump($user_data["sum"]);
40+
41+
42+
echo "\nclosure with object\n";
43+
$ar = ["one" => 1, "two"=>2, "three" => 3];
44+
$user_data = (object)["sum" => 42];
45+
$func = function($value, $key, &$udata) {
46+
var_dump($udata);
47+
$udata->sum += $value;
48+
};
49+
50+
var_dump(array_walk($ar, $func, $user_data));
51+
echo "End result:";
52+
var_dump($user_data->sum);
53+
54+
55+
56+
echo "\nfunction with object\n";
57+
function sum_it_up_object($value, $key, $udata)
58+
{
59+
var_dump($udata);
60+
$udata->sum += $value;
61+
}
62+
63+
$ar = ["one" => 1, "two"=>2, "three" => 3];
64+
$user_data = (object)["sum" => 42];
65+
66+
var_dump(array_walk($ar, "sum_it_up_object", $user_data));
67+
echo "End result:";
68+
var_dump($user_data->sum);
69+
70+
71+
echo "\nfunction with array\n";
72+
function sum_it_up_array($value, $key, $udata)
73+
{
74+
var_dump($udata);
75+
$udata['sum'] += $value;
76+
}
77+
78+
$ar = ["one" => 1, "two"=>2, "three" => 3];
79+
$user_data = ["sum" => 42];
80+
81+
var_dump(array_walk($ar, "sum_it_up_array", $user_data));
82+
echo "End result:";
83+
var_dump($user_data['sum']);
84+
85+
echo "\nclosure and exception\n";
86+
$ar = ["one" => 1, "two"=>2, "three" => 3];
87+
try {
88+
var_dump(array_walk($ar, function($v, $k) { if ($v == 2) throw new Exception; } ));
89+
} catch (Exception $e) {
90+
var_dump($e->getTrace());
91+
}
92+
93+
94+
echo "Done\n";
95+
?>
96+
--EXPECTF--
97+
Warning: array_walk() expects at least 2 parameters, 0 given in %s on line %d
98+
NULL
99+
100+
Warning: array_walk() expects parameter 1 to be array, boolean given in %s on line %d
101+
NULL
102+
103+
Warning: array_walk() expects parameter 1 to be array, null given in %s on line %d
104+
NULL
105+
array(2) {
106+
[0]=>
107+
int(1)
108+
[1]=>
109+
string(3) "one"
110+
}
111+
array(2) {
112+
[0]=>
113+
int(2)
114+
[1]=>
115+
string(3) "two"
116+
}
117+
array(2) {
118+
[0]=>
119+
int(3)
120+
[1]=>
121+
string(5) "three"
122+
}
123+
bool(true)
124+
125+
closure with array
126+
array(1) {
127+
["sum"]=>
128+
int(42)
129+
}
130+
array(1) {
131+
["sum"]=>
132+
int(43)
133+
}
134+
array(1) {
135+
["sum"]=>
136+
int(45)
137+
}
138+
bool(true)
139+
End result:int(42)
140+
141+
closure with use
142+
array(1) {
143+
["sum"]=>
144+
int(42)
145+
}
146+
array(1) {
147+
["sum"]=>
148+
int(43)
149+
}
150+
array(1) {
151+
["sum"]=>
152+
int(45)
153+
}
154+
bool(true)
155+
End result:int(48)
156+
157+
closure with object
158+
object(stdClass)#1 (1) {
159+
["sum"]=>
160+
int(42)
161+
}
162+
object(stdClass)#1 (1) {
163+
["sum"]=>
164+
int(43)
165+
}
166+
object(stdClass)#1 (1) {
167+
["sum"]=>
168+
int(45)
169+
}
170+
bool(true)
171+
End result:int(48)
172+
173+
function with object
174+
object(stdClass)#2 (1) {
175+
["sum"]=>
176+
int(42)
177+
}
178+
object(stdClass)#2 (1) {
179+
["sum"]=>
180+
int(43)
181+
}
182+
object(stdClass)#2 (1) {
183+
["sum"]=>
184+
int(45)
185+
}
186+
bool(true)
187+
End result:int(48)
188+
189+
function with array
190+
array(1) {
191+
["sum"]=>
192+
int(42)
193+
}
194+
array(1) {
195+
["sum"]=>
196+
int(42)
197+
}
198+
array(1) {
199+
["sum"]=>
200+
int(42)
201+
}
202+
bool(true)
203+
End result:int(42)
204+
205+
closure and exception
206+
array(2) {
207+
[0]=>
208+
array(2) {
209+
["function"]=>
210+
string(9) "{closure}"
211+
["args"]=>
212+
array(2) {
213+
[0]=>
214+
int(2)
215+
[1]=>
216+
string(3) "two"
217+
}
218+
}
219+
[1]=>
220+
array(4) {
221+
["file"]=>
222+
string(69) "%s"
223+
["line"]=>
224+
int(%d)
225+
["function"]=>
226+
string(10) "array_walk"
227+
["args"]=>
228+
array(2) {
229+
[0]=>
230+
&array(3) {
231+
["one"]=>
232+
int(1)
233+
["two"]=>
234+
int(2)
235+
["three"]=>
236+
int(3)
237+
}
238+
[1]=>
239+
object(Closure)#2 (1) {
240+
["parameter"]=>
241+
array(2) {
242+
["$v"]=>
243+
string(10) "<required>"
244+
["$k"]=>
245+
string(10) "<required>"
246+
}
247+
}
248+
}
249+
}
250+
}
251+
Done

0 commit comments

Comments
 (0)