diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index 7bc61bed81da6..56b828df7f5ed 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -5798,4 +5798,66 @@ PHP_FUNCTION(pg_select) } /* }}} */ +#ifdef LIBPQ_HAS_PIPELINING +PHP_FUNCTION(pg_enter_pipeline_mode) +{ + zval *pgsql_link; + pgsql_link_handle *pgsql_handle; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &pgsql_link, pgsql_link_ce) == FAILURE) { + RETURN_THROWS(); + } + + pgsql_handle = Z_PGSQL_LINK_P(pgsql_link); + CHECK_PGSQL_LINK(pgsql_handle); + + RETURN_BOOL(PQenterPipelineMode(pgsql_handle->conn)); +} + +PHP_FUNCTION(pg_exit_pipeline_mode) +{ + zval *pgsql_link; + pgsql_link_handle *pgsql_handle; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &pgsql_link, pgsql_link_ce) == FAILURE) { + RETURN_THROWS(); + } + + pgsql_handle = Z_PGSQL_LINK_P(pgsql_link); + CHECK_PGSQL_LINK(pgsql_handle); + + RETURN_BOOL(PQexitPipelineMode(pgsql_handle->conn)); +} + +PHP_FUNCTION(pg_pipeline_sync) +{ + zval *pgsql_link; + pgsql_link_handle *pgsql_handle; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &pgsql_link, pgsql_link_ce) == FAILURE) { + RETURN_THROWS(); + } + + pgsql_handle = Z_PGSQL_LINK_P(pgsql_link); + CHECK_PGSQL_LINK(pgsql_handle); + + RETURN_BOOL(PQpipelineSync(pgsql_handle->conn)); +} + +PHP_FUNCTION(pg_pipeline_status) +{ + zval *pgsql_link; + pgsql_link_handle *pgsql_handle; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &pgsql_link, pgsql_link_ce) == FAILURE) { + RETURN_THROWS(); + } + + pgsql_handle = Z_PGSQL_LINK_P(pgsql_link); + CHECK_PGSQL_LINK(pgsql_handle); + + RETURN_LONG(PQpipelineStatus(pgsql_handle->conn)); +} +#endif + #endif diff --git a/ext/pgsql/pgsql.stub.php b/ext/pgsql/pgsql.stub.php index 2fb3f41b6bf32..35efd2f33d7bc 100644 --- a/ext/pgsql/pgsql.stub.php +++ b/ext/pgsql/pgsql.stub.php @@ -413,6 +413,29 @@ */ const PGSQL_DML_STRING = UNKNOWN; +#ifdef LIBPQ_HAS_PIPELINING + /** + * @var int + * @cvalue PGRES_PIPELINE_SYNC + */ + const PGSQL_PIPELINE_SYNC = UNKNOWN; + /** + * @var int + * @cvalue PQ_PIPELINE_ON + */ + const PGSQL_PIPELINE_ON = UNKNOWN; + /** + * @var int + * @cvalue PQ_PIPELINE_OFF + */ + const PGSQL_PIPELINE_OFF = UNKNOWN; + /** + * @var int + * @cvalue PQ_PIPELINE_ABORTED + */ + const PGSQL_PIPELINE_ABORTED = UNKNOWN; +#endif + function pg_connect(string $connection_string, int $flags = 0): PgSql\Connection|false {} function pg_pconnect(string $connection_string, int $flags = 0): PgSql\Connection|false {} @@ -894,6 +917,13 @@ function pg_delete(PgSql\Connection $connection, string $table_name, array $cond * @refcount 1 */ function pg_select(PgSql\Connection $connection, string $table_name, array $conditions, int $flags = PGSQL_DML_EXEC, int $mode = PGSQL_ASSOC): array|string|false {} + +#ifdef LIBPQ_HAS_PIPELINING + function pg_enter_pipeline_mode(PgSql\Connection $connection): bool {} + function pg_exit_pipeline_mode(PgSql\Connection $connection): bool {} + function pg_pipeline_sync(PgSql\Connection $connection): bool {} + function pg_pipeline_status(PgSql\Connection $connection): int {} +#endif } namespace PgSql { diff --git a/ext/pgsql/pgsql_arginfo.h b/ext/pgsql/pgsql_arginfo.h index a9fea83d3f153..01ffe5c3df614 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: 52d055086569456122f9d9a1264f7a3667127ea7 */ + * Stub hash: c4ff82a0df3e65eae3abbb8c9910978f28bf6ac4 */ 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) @@ -449,6 +449,26 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pg_select, 0, 3, MAY_BE_ARRAY|MA ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "PGSQL_ASSOC") ZEND_END_ARG_INFO() +#if defined(LIBPQ_HAS_PIPELINING) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pg_enter_pipeline_mode, 0, 1, _IS_BOOL, 0) + ZEND_ARG_OBJ_INFO(0, connection, PgSql\\Connection, 0) +ZEND_END_ARG_INFO() +#endif + +#if defined(LIBPQ_HAS_PIPELINING) +#define arginfo_pg_exit_pipeline_mode arginfo_pg_enter_pipeline_mode +#endif + +#if defined(LIBPQ_HAS_PIPELINING) +#define arginfo_pg_pipeline_sync arginfo_pg_enter_pipeline_mode +#endif + +#if defined(LIBPQ_HAS_PIPELINING) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pg_pipeline_status, 0, 1, IS_LONG, 0) + ZEND_ARG_OBJ_INFO(0, connection, PgSql\\Connection, 0) +ZEND_END_ARG_INFO() +#endif + ZEND_FUNCTION(pg_connect); ZEND_FUNCTION(pg_pconnect); @@ -539,6 +559,18 @@ ZEND_FUNCTION(pg_insert); ZEND_FUNCTION(pg_update); ZEND_FUNCTION(pg_delete); ZEND_FUNCTION(pg_select); +#if defined(LIBPQ_HAS_PIPELINING) +ZEND_FUNCTION(pg_enter_pipeline_mode); +#endif +#if defined(LIBPQ_HAS_PIPELINING) +ZEND_FUNCTION(pg_exit_pipeline_mode); +#endif +#if defined(LIBPQ_HAS_PIPELINING) +ZEND_FUNCTION(pg_pipeline_sync); +#endif +#if defined(LIBPQ_HAS_PIPELINING) +ZEND_FUNCTION(pg_pipeline_status); +#endif static const zend_function_entry ext_functions[] = { @@ -656,6 +688,18 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(pg_update, arginfo_pg_update) ZEND_FE(pg_delete, arginfo_pg_delete) ZEND_FE(pg_select, arginfo_pg_select) +#if defined(LIBPQ_HAS_PIPELINING) + ZEND_FE(pg_enter_pipeline_mode, arginfo_pg_enter_pipeline_mode) +#endif +#if defined(LIBPQ_HAS_PIPELINING) + ZEND_FE(pg_exit_pipeline_mode, arginfo_pg_exit_pipeline_mode) +#endif +#if defined(LIBPQ_HAS_PIPELINING) + ZEND_FE(pg_pipeline_sync, arginfo_pg_pipeline_sync) +#endif +#if defined(LIBPQ_HAS_PIPELINING) + ZEND_FE(pg_pipeline_status, arginfo_pg_pipeline_status) +#endif ZEND_FE_END }; @@ -764,6 +808,18 @@ 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(LIBPQ_HAS_PIPELINING) + REGISTER_LONG_CONSTANT("PGSQL_PIPELINE_SYNC", PGRES_PIPELINE_SYNC, CONST_PERSISTENT); +#endif +#if defined(LIBPQ_HAS_PIPELINING) + REGISTER_LONG_CONSTANT("PGSQL_PIPELINE_ON", PQ_PIPELINE_ON, CONST_PERSISTENT); +#endif +#if defined(LIBPQ_HAS_PIPELINING) + REGISTER_LONG_CONSTANT("PGSQL_PIPELINE_OFF", PQ_PIPELINE_OFF, CONST_PERSISTENT); +#endif +#if defined(LIBPQ_HAS_PIPELINING) + REGISTER_LONG_CONSTANT("PGSQL_PIPELINE_ABORTED", PQ_PIPELINE_ABORTED, CONST_PERSISTENT); +#endif } static zend_class_entry *register_class_PgSql_Connection(void) diff --git a/ext/pgsql/tests/pg_pipeline_sync.phpt b/ext/pgsql/tests/pg_pipeline_sync.phpt new file mode 100644 index 0000000000000..38366a025483b --- /dev/null +++ b/ext/pgsql/tests/pg_pipeline_sync.phpt @@ -0,0 +1,99 @@ +--TEST-- +PostgreSQL pipeline mode +--EXTENSIONS-- +pgsql +--SKIPIF-- + +--FILE-- + +--EXPECT-- +OK