note 123531 added to function.pg-result-error
| From: | VLroyrenn@php.net | Date: | Fri, 18 Jan 2019 19:19:23 +0000 |
| Subject: | note 123531 added to function.pg-result-error | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-210078@lists.php.net to get a copy of this message | ||
So considering pg_query and pg_query_params don't return results on error, and that this would
be an extremely handy thing to have, I just ended up writing my own functions wrapping the pg_send_*
ones to work like the aforementionned two <em>should</em>. There's not a whole lot
of code to them, the comments are mostly references from the libPQ and PHP doc, to explain the
behavior.
<?php
class PostgresConnectionError extends Exception {
public function __construct($last_error) {
parent::__construct($message);
}
}
function pg_send_query_sync($connection, string $query) {
// This function cannot work if any query is already running for that connection because the
results may then get mixed up.
assert(pg_get_result($connection) === false);
$dispatch_ok = pg_send_query($connection, $query);
// The *only* case where nothing can be returned, when the connection fails to dispatch the
initial query.
if (!$dispatch_ok) throw new PostgresConnectionError(pg_âlast_âerror($connection));
// From the libPQ doc : "PQgetResult must be called repeatedly until it returns a null
pointer, indicating that the command is done."
// In the case of pg_query/PQExec, which we're trying to emulate:
// "Note however that the returned PGresult structure describes only the result of the last
command executed from the string."
// "Should one of the commands fail, processing of the string stops with it and the
returned PGresult describes the error condition."
while ($result = pg_get_result($connection)) {
// Drain all results on the connection and only return the last one.
if ($last_result) pg_free_result($last_result);
$last_result = $result;
}
assert(is_resource($result) && get_resource_type($result) === "pgsql result");
return $last_result;
}
function pg_send_query_params_sync($connection, string $query, array $params) {
// This function cannot work if any query is already running for that connection because the
results may then get mixed up.
assert(pg_get_result($connection) === false);
$dispatch_ok = pg_send_query_params($connection, $query, $params);
// The *only* case where nothing can be returned, when the connection fails to dispatch the
initial query.
if (!$dispatch_ok) throw new PostgresConnectionError(pg_âlast_âerror($connection));
// From the libPQ doc : "PQgetResult must be called repeatedly until it returns a null
pointer, indicating that the command is done."
// In the case of pg_query_params/PQExecParams, which we're trying to emulate:
// "Unlike PQexec, PQexecParams allows at most one SQL command in the given string. (There
can be semicolons in it, but not more than one nonempty command.)"
while ($result = pg_get_result($connection)) {
// Drain all results on the connection, although there should only be one.
if ($last_result) pg_free_result($last_result);
$last_result = $result;
}
assert(is_resource($result) && get_resource_type($result) === "pgsql result");
return $last_result;
}
----
Server IP: 208.43.231.9
Probable Submitter: 82.199.157.35 (proxied: 207.96.202.138)
----
Manual Page -- http://php.net/manual/en/function.pg-result-error.php
Edit -- https://master.php.net/note/edit/123531
Del: integrated -- https://master.php.net/note/delete/123531/integrated
Del: useless -- https://master.php.net/note/delete/123531/useless
Del: bad code -- https://master.php.net/note/delete/123531/bad+code
Del: spam -- https://master.php.net/note/delete/123531/spam
Del: non-english -- https://master.php.net/note/delete/123531/non-english
Del: in docs -- https://master.php.net/note/delete/123531/in+docs
Del: other reasons-- https://master.php.net/note/delete/123531
Reject -- https://master.php.net/note/reject/123531
Search -- https://master.php.net/manage/user-notes.php