@@ -103,7 +103,23 @@ int _pdo_pgsql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, int errcode, const char *
103
103
104
104
static void _pdo_pgsql_notice (pdo_dbh_t * dbh , const char * message ) /* {{{ */
105
105
{
106
- /* pdo_pgsql_db_handle *H = (pdo_pgsql_db_handle *)dbh->driver_data; */
106
+ int ret ;
107
+ zval zarg ;
108
+ zval retval ;
109
+ pdo_pgsql_fci * fc ;
110
+ if ((fc = ((pdo_pgsql_db_handle * )dbh -> driver_data )-> notice_callback )) {
111
+ ZVAL_STRINGL (& zarg , (char * ) message , strlen (message ));
112
+ fc -> fci .param_count = 1 ;
113
+ fc -> fci .params = & zarg ;
114
+ fc -> fci .retval = & retval ;
115
+ if ((ret = zend_call_function (& fc -> fci , & fc -> fcc )) != FAILURE ) {
116
+ zval_ptr_dtor (& retval );
117
+ }
118
+ zval_ptr_dtor (& zarg );
119
+ if (ret == FAILURE ) {
120
+ pdo_raise_impl_error (dbh , NULL , "HY000" , "could not call user-supplied function" );
121
+ }
122
+ }
107
123
}
108
124
/* }}} */
109
125
@@ -124,6 +140,16 @@ static void pdo_pgsql_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *i
124
140
}
125
141
/* }}} */
126
142
143
+ static void pdo_pgsql_cleanup_notice_callback (pdo_pgsql_db_handle * H ) /* {{{ */
144
+ {
145
+ if (H -> notice_callback ) {
146
+ zval_ptr_dtor (& H -> notice_callback -> fci .function_name );
147
+ efree (H -> notice_callback );
148
+ H -> notice_callback = NULL ;
149
+ }
150
+ }
151
+ /* }}} */
152
+
127
153
/* {{{ pdo_pgsql_create_lob_stream */
128
154
static ssize_t pgsql_lob_write (php_stream * stream , const char * buf , size_t count )
129
155
{
@@ -206,6 +232,7 @@ static void pgsql_handle_closer(pdo_dbh_t *dbh) /* {{{ */
206
232
{
207
233
pdo_pgsql_db_handle * H = (pdo_pgsql_db_handle * )dbh -> driver_data ;
208
234
if (H ) {
235
+ pdo_pgsql_cleanup_notice_callback (H );
209
236
if (H -> server ) {
210
237
PQfinish (H -> server );
211
238
H -> server = NULL ;
@@ -1142,6 +1169,53 @@ PHP_METHOD(PDO_PGSql_Ext, pgsqlGetPid)
1142
1169
}
1143
1170
/* }}} */
1144
1171
1172
+ /* {{{ proto bool PDO::pgsqlSetNoticeCallback(mixed callback)
1173
+ Sets a callback to receive DB notices (after client_min_messages has been set) */
1174
+ PHP_METHOD (PDO_PGSql_Ext , pgsqlSetNoticeCallback )
1175
+ {
1176
+ zval * callback ;
1177
+ zend_string * cbname ;
1178
+ pdo_dbh_t * dbh ;
1179
+ pdo_pgsql_db_handle * H ;
1180
+ pdo_pgsql_fci * fc ;
1181
+
1182
+ if (FAILURE == zend_parse_parameters (ZEND_NUM_ARGS (), "z" , & callback )) {
1183
+ RETURN_FALSE ;
1184
+ }
1185
+
1186
+ dbh = Z_PDO_DBH_P (getThis ());
1187
+ PDO_CONSTRUCT_CHECK ;
1188
+
1189
+ H = (pdo_pgsql_db_handle * )dbh -> driver_data ;
1190
+
1191
+ if (Z_TYPE_P (callback ) == IS_NULL ) {
1192
+ pdo_pgsql_cleanup_notice_callback (H );
1193
+ RETURN_TRUE ;
1194
+ } else {
1195
+ if (!(fc = H -> notice_callback )) {
1196
+ fc = (pdo_pgsql_fci * )ecalloc (1 , sizeof (pdo_pgsql_fci ));
1197
+ } else {
1198
+ zval_ptr_dtor (& fc -> fci .function_name );
1199
+ memcpy (& fc -> fcc , & empty_fcall_info_cache , sizeof (fc -> fcc ));
1200
+ }
1201
+
1202
+ if (FAILURE == zend_fcall_info_init (callback , 0 , & fc -> fci , & fc -> fcc , & cbname , NULL )) {
1203
+ php_error_docref (NULL , E_WARNING , "function '%s' is not callable" , ZSTR_VAL (cbname ));
1204
+ zend_string_release_ex (cbname , 0 );
1205
+ efree (fc );
1206
+ H -> notice_callback = NULL ;
1207
+ RETURN_FALSE ;
1208
+ }
1209
+ Z_TRY_ADDREF_P (& fc -> fci .function_name );
1210
+ zend_string_release_ex (cbname , 0 );
1211
+
1212
+ H -> notice_callback = fc ;
1213
+
1214
+ RETURN_TRUE ;
1215
+ }
1216
+ }
1217
+ /* }}} */
1218
+
1145
1219
static const zend_function_entry * pdo_pgsql_get_driver_methods (pdo_dbh_t * dbh , int kind )
1146
1220
{
1147
1221
switch (kind ) {
@@ -1257,7 +1331,7 @@ static int pdo_pgsql_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /* {{{
1257
1331
goto cleanup ;
1258
1332
}
1259
1333
1260
- PQsetNoticeProcessor (H -> server , (void (* )(void * ,const char * ))_pdo_pgsql_notice , (void * )& dbh );
1334
+ PQsetNoticeProcessor (H -> server , (void (* )(void * ,const char * ))_pdo_pgsql_notice , (void * )dbh );
1261
1335
1262
1336
H -> attached = 1 ;
1263
1337
H -> pgoid = -1 ;
0 commit comments