@@ -3211,21 +3211,23 @@ PHP_FUNCTION(pg_copy_to)
3211
3211
pgsql_link_handle * link ;
3212
3212
zend_string * table_name ;
3213
3213
zend_string * pg_delimiter = NULL ;
3214
+ zend_string * pg_escape = NULL ;
3214
3215
char * pg_null_as = NULL ;
3215
3216
size_t pg_null_as_len = 0 ;
3216
3217
bool free_pg_null = false;
3217
3218
char * query ;
3218
3219
PGconn * pgsql ;
3219
3220
PGresult * pgsql_result ;
3220
3221
ExecStatusType status ;
3221
- char * csv = ( char * ) NULL ;
3222
+ char * csv = NULL ;
3222
3223
3223
- ZEND_PARSE_PARAMETERS_START (2 , 4 )
3224
+ ZEND_PARSE_PARAMETERS_START (2 , 5 )
3224
3225
Z_PARAM_OBJECT_OF_CLASS (pgsql_link , pgsql_link_ce )
3225
3226
Z_PARAM_PATH_STR (table_name )
3226
3227
Z_PARAM_OPTIONAL
3227
3228
Z_PARAM_STR (pg_delimiter )
3228
3229
Z_PARAM_STRING (pg_null_as , pg_null_as_len )
3230
+ Z_PARAM_STR (pg_escape )
3229
3231
ZEND_PARSE_PARAMETERS_END ();
3230
3232
3231
3233
link = Z_PGSQL_LINK_P (pgsql_link );
@@ -3242,8 +3244,14 @@ PHP_FUNCTION(pg_copy_to)
3242
3244
pg_null_as = estrdup ("\\\\N" );
3243
3245
free_pg_null = true;
3244
3246
}
3247
+ if (!pg_escape ) {
3248
+ pg_escape = ZSTR_CHAR ('"' );
3249
+ } else if (ZSTR_LEN (pg_escape ) != 1 ) {
3250
+ zend_argument_value_error (5 , "must be one character" );
3251
+ RETURN_THROWS ();
3252
+ }
3245
3253
3246
- spprintf (& query , 0 , "COPY %s TO STDOUT DELIMITER E'%c' NULL AS E'%s'" , ZSTR_VAL (table_name ), * ZSTR_VAL (pg_delimiter ), pg_null_as );
3254
+ spprintf (& query , 0 , "COPY %s TO STDOUT DELIMITER E'%c' ESCAPE E'%c' NULL AS E'%s'" , ZSTR_VAL (table_name ), * ZSTR_VAL (pg_delimiter ), * ZSTR_VAL ( pg_escape ), pg_null_as );
3247
3255
3248
3256
while ((pgsql_result = PQgetResult (pgsql ))) {
3249
3257
PQclear (pgsql_result );
@@ -3310,6 +3318,7 @@ PHP_FUNCTION(pg_copy_from)
3310
3318
zval * value ;
3311
3319
zend_string * table_name ;
3312
3320
zend_string * pg_delimiter = NULL ;
3321
+ zend_string * pg_escape = NULL ;
3313
3322
char * pg_null_as = NULL ;
3314
3323
size_t pg_null_as_len ;
3315
3324
bool pg_null_as_free = false;
@@ -3318,13 +3327,14 @@ PHP_FUNCTION(pg_copy_from)
3318
3327
PGresult * pgsql_result ;
3319
3328
ExecStatusType status ;
3320
3329
3321
- ZEND_PARSE_PARAMETERS_START (3 , 5 )
3330
+ ZEND_PARSE_PARAMETERS_START (3 , 6 )
3322
3331
Z_PARAM_OBJECT_OF_CLASS (pgsql_link , pgsql_link_ce )
3323
3332
Z_PARAM_PATH_STR (table_name )
3324
3333
Z_PARAM_ARRAY (pg_rows )
3325
3334
Z_PARAM_OPTIONAL
3326
3335
Z_PARAM_STR (pg_delimiter )
3327
3336
Z_PARAM_STRING (pg_null_as , pg_null_as_len )
3337
+ Z_PARAM_STR (pg_escape )
3328
3338
ZEND_PARSE_PARAMETERS_END ();
3329
3339
3330
3340
link = Z_PGSQL_LINK_P (pgsql_link );
@@ -3341,8 +3351,14 @@ PHP_FUNCTION(pg_copy_from)
3341
3351
pg_null_as = estrdup ("\\\\N" );
3342
3352
pg_null_as_free = true;
3343
3353
}
3354
+ if (!pg_escape ) {
3355
+ pg_escape = ZSTR_CHAR ('"' );
3356
+ } else if (ZSTR_LEN (pg_escape ) != 1 ) {
3357
+ zend_argument_value_error (6 , "must be one character" );
3358
+ RETURN_THROWS ();
3359
+ }
3344
3360
3345
- spprintf (& query , 0 , "COPY %s FROM STDIN DELIMITER E'%c' NULL AS E'%s'" , ZSTR_VAL (table_name ), * ZSTR_VAL (pg_delimiter ), pg_null_as );
3361
+ spprintf (& query , 0 , "COPY %s FROM STDIN DELIMITER E'%c' ESCAPE E'%c' NULL AS E'%s'" , ZSTR_VAL (table_name ), * ZSTR_VAL (pg_delimiter ), * ZSTR_VAL ( pg_escape ), pg_null_as );
3346
3362
while ((pgsql_result = PQgetResult (pgsql ))) {
3347
3363
PQclear (pgsql_result );
3348
3364
}
0 commit comments