@@ -154,7 +154,7 @@ MYSQLND_METHOD(mysqlnd_stmt, get_result)(MYSQLND_STMT * const stmt TSRMLS_DC)
154
154
SET_EMPTY_ERROR (stmt -> conn -> error_info );
155
155
MYSQLND_INC_CONN_STATISTIC (conn -> stats , STAT_BUFFERED_SETS );
156
156
157
- result = mysqlnd_result_init (stmt -> result -> field_count TSRMLS_CC );
157
+ result = mysqlnd_result_init (stmt -> result -> field_count , stmt -> persistent TSRMLS_CC );
158
158
159
159
result -> meta = stmt -> result -> meta -> m -> clone_metadata (stmt -> result -> meta , FALSE TSRMLS_CC );
160
160
@@ -335,9 +335,9 @@ MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * const stmt, const char * co
335
335
stmt_to_prepare = mysqlnd_stmt_init (stmt -> conn );
336
336
}
337
337
338
- if (FAIL == stmt_to_prepare -> conn -> m -> simple_command (stmt_to_prepare -> conn , COM_STMT_PREPARE , query ,
339
- query_len , PROT_LAST , FALSE, TRUE TSRMLS_CC ) ||
340
- FAIL == mysqlnd_stmt_read_prepare_response ( stmt_to_prepare TSRMLS_CC )) {
338
+ if (FAIL == stmt_to_prepare -> conn -> m -> simple_command (stmt_to_prepare -> conn , COM_STMT_PREPARE , query , query_len , PROT_LAST , FALSE, TRUE TSRMLS_CC ) ||
339
+ FAIL == mysqlnd_stmt_read_prepare_response ( stmt_to_prepare TSRMLS_CC ))
340
+ {
341
341
goto fail ;
342
342
}
343
343
@@ -355,7 +355,7 @@ MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * const stmt, const char * co
355
355
no metadata at prepare.
356
356
*/
357
357
if (stmt_to_prepare -> field_count ) {
358
- MYSQLND_RES * result = mysqlnd_result_init (stmt_to_prepare -> field_count TSRMLS_CC );
358
+ MYSQLND_RES * result = mysqlnd_result_init (stmt_to_prepare -> field_count , stmt_to_prepare -> persistent TSRMLS_CC );
359
359
/* Allocate the result now as it is needed for the reading of metadata */
360
360
stmt_to_prepare -> result = result ;
361
361
@@ -376,7 +376,7 @@ MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * const stmt, const char * co
376
376
memcpy (stmt , stmt_to_prepare , sizeof (MYSQLND_STMT ));
377
377
378
378
/* Now we will have a clean new statement object */
379
- mnd_efree (stmt_to_prepare );
379
+ mnd_pefree (stmt_to_prepare , stmt_to_prepare -> persistent );
380
380
}
381
381
stmt -> state = MYSQLND_STMT_PREPARED ;
382
382
DBG_INF ("PASS" );
@@ -1248,8 +1248,8 @@ MYSQLND_METHOD(mysqlnd_stmt, bind_parameters)(MYSQLND_STMT * const stmt, MYSQLND
1248
1248
if (stmt -> state < MYSQLND_STMT_PREPARED ) {
1249
1249
SET_STMT_ERROR (stmt , CR_NO_PREPARE_STMT , UNKNOWN_SQLSTATE , mysqlnd_stmt_not_prepared );
1250
1250
DBG_ERR ("not prepared" );
1251
- if (param_bind && stmt -> param_bind_dtor ) {
1252
- stmt -> param_bind_dtor ( param_bind TSRMLS_CC );
1251
+ if (param_bind ) {
1252
+ stmt -> m -> free_parameter_bind ( stmt , param_bind TSRMLS_CC );
1253
1253
}
1254
1254
DBG_RETURN (FAIL );
1255
1255
}
@@ -1281,8 +1281,8 @@ MYSQLND_METHOD(mysqlnd_stmt, bind_parameters)(MYSQLND_STMT * const stmt, MYSQLND
1281
1281
zval_ptr_dtor (& stmt -> param_bind [i ].zv );
1282
1282
}
1283
1283
}
1284
- if (stmt -> param_bind != param_bind && stmt -> param_bind_dtor ) {
1285
- stmt -> param_bind_dtor ( stmt -> param_bind TSRMLS_CC );
1284
+ if (stmt -> param_bind != param_bind ) {
1285
+ stmt -> m -> free_parameter_bind ( stmt , stmt -> param_bind TSRMLS_CC );
1286
1286
}
1287
1287
}
1288
1288
@@ -1382,19 +1382,6 @@ MYSQLND_METHOD(mysqlnd_stmt, refresh_bind_param)(MYSQLND_STMT * const stmt TSRML
1382
1382
/* }}} */
1383
1383
1384
1384
1385
- /* {{{ mysqlnd_stmt::set_bind_param_dtor */
1386
- static void
1387
- MYSQLND_METHOD (mysqlnd_stmt , set_param_bind_dtor )(MYSQLND_STMT * const stmt ,
1388
- void (* param_bind_dtor )(MYSQLND_PARAM_BIND * dtor TSRMLS_DC ) TSRMLS_DC )
1389
- {
1390
- DBG_ENTER ("mysqlnd_stmt::set_bind_param_dtor" );
1391
- DBG_INF_FMT ("stmt=%p" , param_bind_dtor );
1392
- stmt -> param_bind_dtor = param_bind_dtor ;
1393
- DBG_VOID_RETURN ;
1394
- }
1395
- /* }}} */
1396
-
1397
-
1398
1385
/* {{{ mysqlnd_stmt::bind_result */
1399
1386
static enum_func_status
1400
1387
MYSQLND_METHOD (mysqlnd_stmt , bind_result )(MYSQLND_STMT * const stmt ,
@@ -1406,8 +1393,8 @@ MYSQLND_METHOD(mysqlnd_stmt, bind_result)(MYSQLND_STMT * const stmt,
1406
1393
1407
1394
if (stmt -> state < MYSQLND_STMT_PREPARED ) {
1408
1395
SET_STMT_ERROR (stmt , CR_NO_PREPARE_STMT , UNKNOWN_SQLSTATE , mysqlnd_stmt_not_prepared );
1409
- if (result_bind && stmt -> result_bind_dtor ) {
1410
- stmt -> result_bind_dtor ( result_bind TSRMLS_CC );
1396
+ if (result_bind ) {
1397
+ stmt -> m -> free_result_bind ( stmt , result_bind TSRMLS_CC );
1411
1398
}
1412
1399
DBG_ERR ("not prepared" );
1413
1400
DBG_RETURN (FAIL );
@@ -1438,8 +1425,8 @@ MYSQLND_METHOD(mysqlnd_stmt, bind_result)(MYSQLND_STMT * const stmt,
1438
1425
*/
1439
1426
stmt -> result_bind [i ].bound = TRUE;
1440
1427
}
1441
- } else if (result_bind && stmt -> result_bind_dtor ) {
1442
- stmt -> result_bind_dtor ( result_bind TSRMLS_CC );
1428
+ } else if (result_bind ) {
1429
+ stmt -> m -> free_result_bind ( stmt , result_bind TSRMLS_CC );
1443
1430
}
1444
1431
DBG_INF ("PASS" );
1445
1432
DBG_RETURN (PASS );
@@ -1491,19 +1478,6 @@ MYSQLND_METHOD(mysqlnd_stmt, bind_one_result)(MYSQLND_STMT * const stmt, unsigne
1491
1478
/* }}} */
1492
1479
1493
1480
1494
- /* {{{ mysqlnd_stmt::set_bind_result_dtor */
1495
- static void
1496
- MYSQLND_METHOD (mysqlnd_stmt , set_result_bind_dtor )(MYSQLND_STMT * const stmt ,
1497
- void (* result_bind_dtor )(MYSQLND_RESULT_BIND * dtor TSRMLS_DC ) TSRMLS_DC )
1498
- {
1499
- DBG_ENTER ("mysqlnd_stmt::set_bind_param_dtor" );
1500
- DBG_INF_FMT ("stmt=%p" , result_bind_dtor );
1501
- stmt -> result_bind_dtor = result_bind_dtor ;
1502
- DBG_VOID_RETURN ;
1503
- }
1504
- /* }}} */
1505
-
1506
-
1507
1481
/* {{{ mysqlnd_stmt::insert_id */
1508
1482
static uint64_t
1509
1483
MYSQLND_METHOD (mysqlnd_stmt , insert_id )(const MYSQLND_STMT * const stmt TSRMLS_DC )
@@ -1634,7 +1608,7 @@ MYSQLND_METHOD(mysqlnd_stmt, result_metadata)(MYSQLND_STMT * const stmt TSRMLS_D
1634
1608
In the meantime we don't need a zval cache reference for this fake
1635
1609
result set, so we don't get one.
1636
1610
*/
1637
- result = mysqlnd_result_init (stmt -> field_count TSRMLS_CC );
1611
+ result = mysqlnd_result_init (stmt -> field_count , stmt -> persistent TSRMLS_CC );
1638
1612
result -> type = MYSQLND_RES_NORMAL ;
1639
1613
result -> m .fetch_row = result -> m .fetch_row_normal_unbuffered ;
1640
1614
result -> unbuf = mnd_ecalloc (1 , sizeof (MYSQLND_RES_UNBUFFERED ));
@@ -1817,9 +1791,7 @@ void mysqlnd_stmt_separate_result_bind(MYSQLND_STMT * const stmt TSRMLS_DC)
1817
1791
}
1818
1792
}
1819
1793
}
1820
- if (stmt -> result_bind_dtor ) {
1821
- stmt -> result_bind_dtor (stmt -> result_bind TSRMLS_CC );
1822
- }
1794
+ stmt -> m -> free_result_bind (stmt , stmt -> result_bind TSRMLS_CC );
1823
1795
stmt -> result_bind = NULL ;
1824
1796
1825
1797
DBG_VOID_RETURN ;
@@ -1898,9 +1870,7 @@ void mysqlnd_internal_free_stmt_content(MYSQLND_STMT * const stmt TSRMLS_DC)
1898
1870
zval_ptr_dtor (& stmt -> param_bind [i ].zv );
1899
1871
}
1900
1872
}
1901
- if (stmt -> param_bind_dtor ) {
1902
- stmt -> param_bind_dtor (stmt -> param_bind TSRMLS_CC );
1903
- }
1873
+ stmt -> m -> free_parameter_bind (stmt , stmt -> param_bind TSRMLS_CC );
1904
1874
stmt -> param_bind = NULL ;
1905
1875
}
1906
1876
@@ -1985,7 +1955,7 @@ MYSQLND_METHOD_PRIVATE(mysqlnd_stmt, net_close)(MYSQLND_STMT * const stmt, zend_
1985
1955
}
1986
1956
1987
1957
if (stmt -> execute_cmd_buffer .buffer ) {
1988
- mnd_efree (stmt -> execute_cmd_buffer .buffer );
1958
+ mnd_pefree (stmt -> execute_cmd_buffer .buffer , stmt -> persistent );
1989
1959
stmt -> execute_cmd_buffer .buffer = NULL ;
1990
1960
}
1991
1961
@@ -2013,14 +1983,53 @@ MYSQLND_METHOD(mysqlnd_stmt, dtor)(MYSQLND_STMT * const stmt, zend_bool implicit
2013
1983
STAT_STMT_CLOSE_EXPLICIT );
2014
1984
2015
1985
ret = stmt -> m -> net_close (stmt , implicit TSRMLS_CC );
2016
- mnd_efree (stmt );
1986
+ mnd_pefree (stmt , stmt -> persistent );
2017
1987
2018
1988
DBG_INF (ret == PASS ? "PASS" :"FAIL" );
2019
1989
DBG_RETURN (ret );
2020
1990
}
2021
1991
/* }}} */
2022
1992
2023
1993
1994
+ /* {{{ mysqlnd_stmt::alloc_param_bind */
1995
+ static MYSQLND_PARAM_BIND *
1996
+ MYSQLND_METHOD (mysqlnd_stmt , alloc_param_bind )(MYSQLND_STMT * const stmt TSRMLS_DC )
1997
+ {
1998
+ DBG_ENTER ("mysqlnd_stmt::alloc_param_bind" );
1999
+ DBG_RETURN (safe_pemalloc (stmt -> param_count , sizeof (MYSQLND_PARAM_BIND ), 0 , stmt -> persistent ));
2000
+ }
2001
+ /* }}} */
2002
+
2003
+
2004
+ /* {{{ mysqlnd_stmt::alloc_result_bind */
2005
+ static MYSQLND_RESULT_BIND *
2006
+ MYSQLND_METHOD (mysqlnd_stmt , alloc_result_bind )(MYSQLND_STMT * const stmt TSRMLS_DC )
2007
+ {
2008
+ DBG_ENTER ("mysqlnd_stmt::alloc_result_bind" );
2009
+ DBG_RETURN (safe_pemalloc (stmt -> field_count , sizeof (MYSQLND_RESULT_BIND ), 0 , stmt -> persistent ));
2010
+ }
2011
+ /* }}} */
2012
+
2013
+
2014
+ /* {{{ param_bind::free_parameter_bind */
2015
+ PHPAPI void
2016
+ MYSQLND_METHOD (mysqlnd_stmt , free_parameter_bind )(MYSQLND_STMT * const stmt , MYSQLND_PARAM_BIND * param_bind TSRMLS_DC )
2017
+ {
2018
+ mnd_pefree (param_bind , stmt -> persistent );
2019
+ }
2020
+ /* }}} */
2021
+
2022
+
2023
+ /* {{{ mysqlnd_stmt::free_result_bind */
2024
+ PHPAPI void
2025
+ MYSQLND_METHOD (mysqlnd_stmt , free_result_bind )(MYSQLND_STMT * const stmt , MYSQLND_RESULT_BIND * result_bind TSRMLS_DC )
2026
+ {
2027
+ mnd_pefree (result_bind , stmt -> persistent );
2028
+ }
2029
+ /* }}} */
2030
+
2031
+
2032
+
2024
2033
MYSQLND_CLASS_METHODS_START (mysqlnd_stmt )
2025
2034
MYSQLND_METHOD (mysqlnd_stmt , prepare ),
2026
2035
MYSQLND_METHOD (mysqlnd_stmt , execute ),
@@ -2040,10 +2049,8 @@ MYSQLND_CLASS_METHODS_START(mysqlnd_stmt)
2040
2049
MYSQLND_METHOD (mysqlnd_stmt , bind_parameters ),
2041
2050
MYSQLND_METHOD (mysqlnd_stmt , bind_one_parameter ),
2042
2051
MYSQLND_METHOD (mysqlnd_stmt , refresh_bind_param ),
2043
- MYSQLND_METHOD (mysqlnd_stmt , set_param_bind_dtor ),
2044
2052
MYSQLND_METHOD (mysqlnd_stmt , bind_result ),
2045
2053
MYSQLND_METHOD (mysqlnd_stmt , bind_one_result ),
2046
- MYSQLND_METHOD (mysqlnd_stmt , set_result_bind_dtor ),
2047
2054
MYSQLND_METHOD (mysqlnd_stmt , send_long_data ),
2048
2055
MYSQLND_METHOD (mysqlnd_stmt , param_metadata ),
2049
2056
MYSQLND_METHOD (mysqlnd_stmt , result_metadata ),
@@ -2061,23 +2068,30 @@ MYSQLND_CLASS_METHODS_START(mysqlnd_stmt)
2061
2068
MYSQLND_METHOD (mysqlnd_stmt , sqlstate ),
2062
2069
2063
2070
MYSQLND_METHOD (mysqlnd_stmt , attr_get ),
2064
- MYSQLND_METHOD (mysqlnd_stmt , attr_set ),
2071
+ MYSQLND_METHOD (mysqlnd_stmt , attr_set ),
2072
+
2073
+
2074
+ MYSQLND_METHOD (mysqlnd_stmt , alloc_param_bind ),
2075
+ MYSQLND_METHOD (mysqlnd_stmt , alloc_result_bind ),
2076
+ MYSQLND_METHOD (mysqlnd_stmt , free_parameter_bind ),
2077
+ MYSQLND_METHOD (mysqlnd_stmt , free_result_bind )
2065
2078
MYSQLND_CLASS_METHODS_END ;
2066
2079
2067
2080
2068
2081
/* {{{ _mysqlnd_stmt_init */
2069
2082
MYSQLND_STMT * _mysqlnd_stmt_init (MYSQLND * const conn TSRMLS_DC )
2070
2083
{
2071
2084
size_t alloc_size = sizeof (MYSQLND_STMT ) + mysqlnd_plugin_count () * sizeof (void * );
2072
- MYSQLND_STMT * stmt = mnd_ecalloc (1 , alloc_size );
2085
+ MYSQLND_STMT * stmt = mnd_pecalloc (1 , alloc_size , conn -> persistent );
2073
2086
2074
2087
DBG_ENTER ("_mysqlnd_stmt_init" );
2075
2088
DBG_INF_FMT ("stmt=%p" , stmt );
2076
2089
2090
+ stmt -> persistent = conn -> persistent ;
2077
2091
stmt -> m = mysqlnd_stmt_methods ;
2078
2092
stmt -> state = MYSQLND_STMT_INITTED ;
2079
2093
stmt -> execute_cmd_buffer .length = 4096 ;
2080
- stmt -> execute_cmd_buffer .buffer = mnd_emalloc (stmt -> execute_cmd_buffer .length );
2094
+ stmt -> execute_cmd_buffer .buffer = mnd_pemalloc (stmt -> execute_cmd_buffer .length , stmt -> persistent );
2081
2095
2082
2096
stmt -> prefetch_rows = MYSQLND_DEFAULT_PREFETCH_ROWS ;
2083
2097
/*
@@ -2086,10 +2100,6 @@ MYSQLND_STMT * _mysqlnd_stmt_init(MYSQLND * const conn TSRMLS_DC)
2086
2100
or normal query result will close it then.
2087
2101
*/
2088
2102
stmt -> conn = conn -> m -> get_reference (conn TSRMLS_CC );
2089
-
2090
- stmt -> m -> set_param_bind_dtor (stmt , mysqlnd_efree_param_bind_dtor TSRMLS_CC );
2091
- stmt -> m -> set_result_bind_dtor (stmt , mysqlnd_efree_result_bind_dtor TSRMLS_CC );
2092
-
2093
2103
DBG_RETURN (stmt );
2094
2104
}
2095
2105
/* }}} */
@@ -2108,22 +2118,6 @@ PHPAPI void ** _mysqlnd_plugin_get_plugin_stmt_data(const MYSQLND_STMT * stmt, u
2108
2118
/* }}} */
2109
2119
2110
2120
2111
- /* {{{ mysqlnd_efree_param_bind_dtor */
2112
- PHPAPI void
2113
- mysqlnd_efree_param_bind_dtor (MYSQLND_PARAM_BIND * param_bind TSRMLS_DC )
2114
- {
2115
- mnd_efree (param_bind );
2116
- }
2117
- /* }}} */
2118
-
2119
-
2120
- /* {{{ mysqlnd_efree_result_bind_dtor */
2121
- PHPAPI void
2122
- mysqlnd_efree_result_bind_dtor (MYSQLND_RESULT_BIND * result_bind TSRMLS_DC )
2123
- {
2124
- mnd_efree (result_bind );
2125
- }
2126
- /* }}} */
2127
2121
2128
2122
/* {{{ _mysqlnd_init_ps_subsystem */
2129
2123
void _mysqlnd_init_ps_subsystem ()
0 commit comments