From 0c4ed31f5a619d9c72a60d61d572516b340ff2e3 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sun, 9 Apr 2023 11:59:50 +0100 Subject: [PATCH 1/2] ext/pgsql: pg_trace allow to refine its trace mode via 2 new constants. - PGSQL_TRACE_SUPPRESS_TIMESTAMPS. - PGSQL_TRACE_REGRESS_MODE to have a more verbose and observable output to check possible regressions. --- ext/pgsql/pgsql.c | 14 +++++++++++++- ext/pgsql/pgsql.stub.php | 16 +++++++++++++++- ext/pgsql/pgsql_arginfo.h | 9 ++++++++- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index 56b828df7f5ed..4a72bdf0f78fb 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -2115,13 +2115,14 @@ PHP_FUNCTION(pg_trace) { char *z_filename, *mode = "w"; size_t z_filename_len, mode_len; + zend_long trace_mode = 0; zval *pgsql_link = NULL; PGconn *pgsql; FILE *fp = NULL; php_stream *stream; pgsql_link_handle *link; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "p|sO!", &z_filename, &z_filename_len, &mode, &mode_len, &pgsql_link, pgsql_link_ce) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "p|sO!l", &z_filename, &z_filename_len, &mode, &mode_len, &pgsql_link, pgsql_link_ce, &trace_mode) == FAILURE) { RETURN_THROWS(); } @@ -2147,6 +2148,17 @@ PHP_FUNCTION(pg_trace) } php_stream_auto_cleanup(stream); PQtrace(pgsql, fp); + if (trace_mode > 0) { +#ifdef PQTRACE_REGRESS_MODE + if (trace_mode > (PQTRACE_SUPPRESS_TIMESTAMPS|PQTRACE_REGRESS_MODE)) { + zend_argument_value_error(2, "must be PGSQL_TRACE_SUPPRESS_TIMESTAMPS and/or PGSQL_TRACE_REGRESS_MODE"); + } else { + PQsetTraceFlags(pgsql, trace_mode); + } +#else + zend_argument_value_error(2, "cannot set the trace mode as it's unsupported"); +#endif + } RETURN_TRUE; } /* }}} */ diff --git a/ext/pgsql/pgsql.stub.php b/ext/pgsql/pgsql.stub.php index 35efd2f33d7bc..e095350543c79 100644 --- a/ext/pgsql/pgsql.stub.php +++ b/ext/pgsql/pgsql.stub.php @@ -412,6 +412,20 @@ * @cvalue PGSQL_DML_STRING */ const PGSQL_DML_STRING = UNKNOWN; +#ifdef PQTRACE_SUPPPRESS_TIMESTAMPS + /** + * @var int + * @cvalue PQTRACE_SUPPRESS_TIMESTAMPS + */ + const PGSQL_TRACE_SUPPRESS_TIMESTAMPS = UNKNOWN; +#endif +#ifdef PQTRACE_REGRESS_MODE + /** + * @var int + * @cvalue PQTRACE_REGRESS_MODE + */ + const PGSQL_TRACE_REGRESS_MODE = UNKNOWN; +#endif #ifdef LIBPQ_HAS_PIPELINING /** @@ -662,7 +676,7 @@ function pg_last_oid(PgSql\Result $result): string|int|false {} */ function pg_getlastoid(PgSql\Result $result): string|int|false {} - function pg_trace(string $filename, string $mode = "w", ?PgSql\Connection $connection = null): bool {} + function pg_trace(string $filename, string $mode = "w", ?PgSql\Connection $connection = null, int $trace_mode = 0): bool {} function pg_untrace(?PgSql\Connection $connection = null): bool {} diff --git a/ext/pgsql/pgsql_arginfo.h b/ext/pgsql/pgsql_arginfo.h index 01ffe5c3df614..2b8e7cd17ae6a 100644 --- a/ext/pgsql/pgsql_arginfo.h +++ b/ext/pgsql/pgsql_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: c4ff82a0df3e65eae3abbb8c9910978f28bf6ac4 */ + * Stub hash: f18a73443942daa2b3695e8750c8daaea6b96194 */ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_pg_connect, 0, 1, PgSql\\Connection, MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, connection_string, IS_STRING, 0) @@ -198,6 +198,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pg_trace, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_STRING, 0, "\"w\"") ZEND_ARG_OBJ_INFO_WITH_DEFAULT_VALUE(0, connection, PgSql\\Connection, 1, "null") + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, trace_mode, IS_LONG, 0, "0") ZEND_END_ARG_INFO() #define arginfo_pg_untrace arginfo_pg_close @@ -808,6 +809,12 @@ static void register_pgsql_symbols(int module_number) REGISTER_LONG_CONSTANT("PGSQL_DML_EXEC", PGSQL_DML_EXEC, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PGSQL_DML_ASYNC", PGSQL_DML_ASYNC, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PGSQL_DML_STRING", PGSQL_DML_STRING, CONST_PERSISTENT); +#if defined(PQTRACE_SUPPPRESS_TIMESTAMPS) + REGISTER_LONG_CONSTANT("PGSQL_TRACE_SUPPRESS_TIMESTAMPS", PQTRACE_SUPPRESS_TIMESTAMPS, CONST_PERSISTENT); +#endif +#if defined(PQTRACE_REGRESS_MODE) + REGISTER_LONG_CONSTANT("PGSQL_TRACE_REGRESS_MODE", PQTRACE_REGRESS_MODE, CONST_PERSISTENT); +#endif #if defined(LIBPQ_HAS_PIPELINING) REGISTER_LONG_CONSTANT("PGSQL_PIPELINE_SYNC", PGRES_PIPELINE_SYNC, CONST_PERSISTENT); #endif From 1dfb14cc697648609c4c041359365ee77f68cf1d Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sun, 9 Apr 2023 14:38:13 +0100 Subject: [PATCH 2/2] add test --- ext/pgsql/pgsql.c | 8 +++++--- ext/pgsql/tests/pg_trace.phpt | 26 ++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 ext/pgsql/tests/pg_trace.phpt diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index 4a72bdf0f78fb..d0b348bc58e75 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -2150,13 +2150,15 @@ PHP_FUNCTION(pg_trace) PQtrace(pgsql, fp); if (trace_mode > 0) { #ifdef PQTRACE_REGRESS_MODE - if (trace_mode > (PQTRACE_SUPPRESS_TIMESTAMPS|PQTRACE_REGRESS_MODE)) { - zend_argument_value_error(2, "must be PGSQL_TRACE_SUPPRESS_TIMESTAMPS and/or PGSQL_TRACE_REGRESS_MODE"); + if (!(trace_mode & (PQTRACE_SUPPRESS_TIMESTAMPS|PQTRACE_REGRESS_MODE))) { + zend_argument_value_error(4, "must be PGSQL_TRACE_SUPPRESS_TIMESTAMPS and/or PGSQL_TRACE_REGRESS_MODE"); + RETURN_THROWS(); } else { PQsetTraceFlags(pgsql, trace_mode); } #else - zend_argument_value_error(2, "cannot set the trace mode as it's unsupported"); + zend_argument_value_error(4, "cannot set as trace is unsupported"); + RETURN_THROWS(); #endif } RETURN_TRUE; diff --git a/ext/pgsql/tests/pg_trace.phpt b/ext/pgsql/tests/pg_trace.phpt new file mode 100644 index 0000000000000..0917959bbef77 --- /dev/null +++ b/ext/pgsql/tests/pg_trace.phpt @@ -0,0 +1,26 @@ +--TEST-- +pg_trace +--EXTENSIONS-- +pgsql +--SKIPIF-- + +--FILE-- +getMessage() . PHP_EOL; +} +var_dump(pg_trace($tracefile, 'w', $db, 0)); +$res = pg_query($db, 'select 1'); + +?> +--EXPECT-- +pg_trace(): Argument #4 ($trace_mode) cannot set as trace is unsupported +bool(true)