@@ -104,23 +104,13 @@ int _pdo_pgsql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, int errcode, const char *
104
104
105
105
static void _pdo_pgsql_notice (void * context , const char * message ) /* {{{ */
106
106
{
107
- int ret ;
108
107
zval zarg ;
109
- zval retval ;
110
- pdo_pgsql_fci * fc ;
108
+ zend_fcall_info_cache * fc ;
111
109
pdo_dbh_t * dbh = (pdo_dbh_t * )context ;
112
110
if ((fc = ((pdo_pgsql_db_handle * )dbh -> driver_data )-> notice_callback )) {
113
111
ZVAL_STRINGL (& zarg , (char * ) message , strlen (message ));
114
- fc -> fci .param_count = 1 ;
115
- fc -> fci .params = & zarg ;
116
- fc -> fci .retval = & retval ;
117
- if ((ret = zend_call_function (& fc -> fci , & fc -> fcc )) != FAILURE ) {
118
- zval_ptr_dtor (& retval );
119
- }
112
+ zend_call_known_fcc (fc , NULL , 1 , & zarg , NULL );
120
113
zval_ptr_dtor (& zarg );
121
- if (ret == FAILURE ) {
122
- pdo_raise_impl_error (dbh , NULL , "HY000" , "could not call user-supplied function" );
123
- }
124
114
}
125
115
}
126
116
/* }}} */
@@ -145,7 +135,7 @@ static void pdo_pgsql_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *i
145
135
static void pdo_pgsql_cleanup_notice_callback (pdo_pgsql_db_handle * H ) /* {{{ */
146
136
{
147
137
if (H -> notice_callback ) {
148
- zval_ptr_dtor ( & H -> notice_callback -> fci . function_name );
138
+ zend_fcc_dtor ( H -> notice_callback );
149
139
efree (H -> notice_callback );
150
140
H -> notice_callback = NULL ;
151
141
}
@@ -1256,46 +1246,27 @@ PHP_METHOD(PDO_PGSql_Ext, pgsqlGetPid)
1256
1246
Sets a callback to receive DB notices (after client_min_messages has been set) */
1257
1247
PHP_METHOD (PDO_PGSql_Ext , pgsqlSetNoticeCallback )
1258
1248
{
1259
- zval * callback ;
1260
- zend_string * cbname ;
1261
1249
pdo_dbh_t * dbh ;
1262
1250
pdo_pgsql_db_handle * H ;
1263
- pdo_pgsql_fci * fc ;
1264
-
1265
- if (FAILURE == zend_parse_parameters (ZEND_NUM_ARGS (), "z" , & callback )) {
1266
- RETURN_FALSE ;
1267
- }
1251
+ zend_fcall_info fci = empty_fcall_info ;
1252
+ zend_fcall_info_cache fcc = empty_fcall_info_cache ;
1268
1253
1269
1254
dbh = Z_PDO_DBH_P (getThis ());
1270
1255
PDO_CONSTRUCT_CHECK ;
1271
1256
1272
1257
H = (pdo_pgsql_db_handle * )dbh -> driver_data ;
1273
-
1274
- if (Z_TYPE_P (callback ) == IS_NULL ) {
1275
- pdo_pgsql_cleanup_notice_callback (H );
1276
- RETURN_TRUE ;
1277
- } else {
1278
- if (!(fc = H -> notice_callback )) {
1279
- fc = (pdo_pgsql_fci * )ecalloc (1 , sizeof (pdo_pgsql_fci ));
1280
- } else {
1281
- zval_ptr_dtor (& fc -> fci .function_name );
1282
- memcpy (& fc -> fcc , & empty_fcall_info_cache , sizeof (fc -> fcc ));
1283
- }
1284
-
1285
- if (FAILURE == zend_fcall_info_init (callback , 0 , & fc -> fci , & fc -> fcc , & cbname , NULL )) {
1286
- php_error_docref (NULL , E_WARNING , "function '%s' is not callable" , ZSTR_VAL (cbname ));
1287
- zend_string_release_ex (cbname , 0 );
1288
- efree (fc );
1289
- H -> notice_callback = NULL ;
1290
- RETURN_FALSE ;
1291
- }
1292
- Z_TRY_ADDREF_P (& fc -> fci .function_name );
1293
- zend_string_release_ex (cbname , 0 );
1294
-
1295
- H -> notice_callback = fc ;
1296
-
1297
- RETURN_TRUE ;
1258
+
1259
+ pdo_pgsql_cleanup_notice_callback (H );
1260
+ if (FAILURE == zend_parse_parameters (ZEND_NUM_ARGS (), "F!" , & fci , & fcc )) {
1261
+ RETURN_FALSE ;
1298
1262
}
1263
+
1264
+ if (ZEND_FCC_INITIALIZED (fcc )) {
1265
+ H -> notice_callback = ecalloc (1 , sizeof (zend_fcall_info_cache ));
1266
+ zend_fcc_dup (H -> notice_callback , & fcc );
1267
+ }
1268
+
1269
+ RETURN_TRUE ;
1299
1270
}
1300
1271
/* }}} */
1301
1272
0 commit comments