php-src/ext/pgsql/tests/29nb_async_connect.phpt
Daniel Lowrey 2ee4c987e6 Support async pgsql connections and non-blocking queries
- New functions (each accepts a pgsql $connection resource):

  . pg_connect_poll
  . pg_socket
  . pg_consume_input
  . pg_flush

- Modified functions

  The following functions now additionally return zero if the
  underlying socket is set to non-blocking mode and the send
  operation does not complete immediately. Previously these
  functions returned only boolean TRUE/FALSE and blocked
  execution while polling until all data was sent:

  . pg_send_execute
  . pg_send_prepare
  . pg_send_query
  . pg_send_query_params

- New constants

  Used with pg_connect() to initiate an asynchronous connection
  attempt:

  . PGSQL_CONNECT_ASYNC

  Used with pg_connection_status() to determine the current state
  of an async connection attempt:

  . PGSQL_CONNECTION_STARTED
  . PGSQL_CONNECTION_MADE
  . PGSQL_CONNECTION_AWAITING_RESPONSE
  . PGSQL_CONNECTION_AUTH_OK
  . PGSQL_CONNECTION_SSL_STARTUP
  . PGSQL_CONNECTION_SETENV

  Used with pg_connect_poll() to determine the result of an
  async connection attempt:

  . PGSQL_POLLING_FAILED
  . PGSQL_POLLING_READING
  . PGSQL_POLLING_WRITING
  . PGSQL_POLLING_OK
  . PGSQL_POLLING_ACTIVE

- Polling via returned pg_socket() stream

  pg_socket() returns a read-only socket stream that may be
  cast to a file descriptor for select (and similar) polling
  operations. Blocking behavior of the pgsql connection socket
  can be controlled by calling stream_set_blocking() on the
  stream returned by pg_socket().
2014-03-17 06:31:15 -06:00

45 lines
902 B
PHP
Executable File

--TEST--
PostgreSQL non-blocking async connect
--SKIPIF--
<?php
include("skipif.inc");
?>
--FILE--
<?php
include('config.inc');
include('nonblocking.inc');
if (!$db = pg_connect($conn_str, PGSQL_CONNECT_ASYNC)) {
die("pg_connect() error");
} elseif (pg_connection_status($db) === PGSQL_CONNECTION_BAD) {
die("pg_connect() error");
} elseif ($db_socket = pg_socket($db)) {
stream_set_blocking($db_socket, FALSE);
} else {
die("pg_socket() error");
}
while (TRUE) {
switch ($status = pg_connect_poll($db)) {
case PGSQL_POLLING_READING:
if (nb_is_readable($db_socket)) { break 2; }
break;
case PGSQL_POLLING_WRITING:
if (nb_is_writable($db_socket)) { break 2; }
break;
case PGSQL_POLLING_FAILED:
die("async connection failed");
case PGSQL_POLLING_OK:
break 2;
}
}
assert(pg_connection_status($db) === PGSQL_CONNECTION_MADE);
echo "OK";
pg_close($db);
?>
--EXPECT--
OK